wined3d: Use context_get_tex_unit_mapping() in context_bind_shader_resources().

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2017-03-15 12:00:04 +01:00 committed by Alexandre Julliard
parent 8ec8aba3ad
commit 57757a3bd9
1 changed files with 14 additions and 22 deletions

View File

@ -3394,21 +3394,24 @@ static void context_load_shader_resources(struct wined3d_context *context, const
} }
static void context_bind_shader_resources(struct wined3d_context *context, static void context_bind_shader_resources(struct wined3d_context *context,
const struct wined3d_state *state, enum wined3d_shader_type shader_type, const struct wined3d_state *state, enum wined3d_shader_type shader_type)
unsigned int base_idx, unsigned int count)
{ {
unsigned int bind_idx, shader_sampler_count, base, count, i;
const struct wined3d_gl_info *gl_info = context->gl_info; const struct wined3d_gl_info *gl_info = context->gl_info;
const struct wined3d_device *device = context->device; const struct wined3d_device *device = context->device;
struct wined3d_shader_sampler_map_entry *entry; struct wined3d_shader_sampler_map_entry *entry;
struct wined3d_shader_resource_view *view; struct wined3d_shader_resource_view *view;
unsigned int shader_sampler_count, i;
const struct wined3d_shader *shader; const struct wined3d_shader *shader;
struct wined3d_sampler *sampler; struct wined3d_sampler *sampler;
const DWORD *tex_unit_map;
GLuint sampler_name; GLuint sampler_name;
if (!(shader = state->shader[shader_type])) if (!(shader = state->shader[shader_type]))
return; return;
tex_unit_map = context_get_tex_unit_mapping(context,
&shader->reg_maps.shader_version, &base, &count);
shader_sampler_count = shader->reg_maps.sampler_map.count; shader_sampler_count = shader->reg_maps.sampler_map.count;
if (shader_sampler_count > count) if (shader_sampler_count > count)
FIXME("Shader %p needs %u samplers, but only %u are supported.\n", FIXME("Shader %p needs %u samplers, but only %u are supported.\n",
@ -3418,6 +3421,9 @@ static void context_bind_shader_resources(struct wined3d_context *context,
for (i = 0; i < count; ++i) for (i = 0; i < count; ++i)
{ {
entry = &shader->reg_maps.sampler_map.entries[i]; entry = &shader->reg_maps.sampler_map.entries[i];
bind_idx = base + entry->bind_idx;
if (tex_unit_map)
bind_idx = tex_unit_map[bind_idx];
if (!(view = state->shader_resource_view[shader_type][entry->resource_idx])) if (!(view = state->shader_resource_view[shader_type][entry->resource_idx]))
{ {
@ -3432,25 +3438,13 @@ static void context_bind_shader_resources(struct wined3d_context *context,
else else
sampler_name = device->null_sampler; sampler_name = device->null_sampler;
context_active_texture(context, gl_info, base_idx + entry->bind_idx); context_active_texture(context, gl_info, bind_idx);
GL_EXTCALL(glBindSampler(base_idx + entry->bind_idx, sampler_name)); GL_EXTCALL(glBindSampler(bind_idx, sampler_name));
checkGLcall("glBindSampler"); checkGLcall("glBindSampler");
wined3d_shader_resource_view_bind(view, context); wined3d_shader_resource_view_bind(view, context);
} }
} }
static void context_bind_graphics_shader_resources(struct wined3d_context *context,
const struct wined3d_state *state)
{
unsigned int i, base_idx, count;
for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i)
{
wined3d_gl_limits_get_texture_unit_range(&context->gl_info->limits, i, &base_idx, &count);
context_bind_shader_resources(context, state, i, base_idx, count);
}
}
static void context_load_unordered_access_resources(struct wined3d_context *context, static void context_load_unordered_access_resources(struct wined3d_context *context,
const struct wined3d_shader *shader, struct wined3d_unordered_access_view * const *views) const struct wined3d_shader *shader, struct wined3d_unordered_access_view * const *views)
{ {
@ -3613,7 +3607,8 @@ BOOL context_apply_draw_state(struct wined3d_context *context,
if (context->update_shader_resource_bindings) if (context->update_shader_resource_bindings)
{ {
context_bind_graphics_shader_resources(context, state); for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i)
context_bind_shader_resources(context, state, i);
context->update_shader_resource_bindings = 0; context->update_shader_resource_bindings = 0;
if (gl_info->limits.combined_samplers == gl_info->limits.graphics_samplers) if (gl_info->limits.combined_samplers == gl_info->limits.graphics_samplers)
context->update_compute_shader_resource_bindings = 1; context->update_compute_shader_resource_bindings = 1;
@ -3668,10 +3663,7 @@ void context_apply_compute_state(struct wined3d_context *context,
if (context->update_compute_shader_resource_bindings) if (context->update_compute_shader_resource_bindings)
{ {
unsigned int base_idx, count; context_bind_shader_resources(context, state, WINED3D_SHADER_TYPE_COMPUTE);
wined3d_gl_limits_get_texture_unit_range(&gl_info->limits,
WINED3D_SHADER_TYPE_COMPUTE, &base_idx, &count);
context_bind_shader_resources(context, state, WINED3D_SHADER_TYPE_COMPUTE, base_idx, count);
context->update_compute_shader_resource_bindings = 0; context->update_compute_shader_resource_bindings = 0;
if (gl_info->limits.combined_samplers == gl_info->limits.graphics_samplers) if (gl_info->limits.combined_samplers == gl_info->limits.graphics_samplers)
context->update_shader_resource_bindings = 1; context->update_shader_resource_bindings = 1;