Module: wine Branch: master Commit: ee9b1311cd84f08a545fa0a9326bd4005e884611 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ee9b1311cd84f08a545fa0a932...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Tue Aug 18 11:24:10 2015 +0200
wined3d: Separate loading shader resources and updating their binding points.
---
dlls/wined3d/context.c | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 32813e9..79125d1 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -3044,6 +3044,42 @@ static void context_preload_textures(struct wined3d_context *context, const stru } }
+static void context_load_shader_resources(struct wined3d_context *context, const struct wined3d_state *state) +{ + struct wined3d_shader_sampler_map_entry *entry; + struct wined3d_shader_resource_view *view; + struct wined3d_shader *shader; + unsigned int i, j; + + for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i) + { + if (!(shader = state->shader[i])) + continue; + + for (j = 0; j < WINED3D_MAX_CBS; ++j) + { + if (state->cb[i][j]) + buffer_internal_preload(state->cb[i][j], context, state); + } + + for (j = 0; j < shader->reg_maps.sampler_map.count; ++j) + { + entry = &shader->reg_maps.sampler_map.entries[j]; + + if (!(view = state->shader_resource_view[i][entry->resource_idx])) + { + WARN("No resource view bound at index %u, %u.\n", i, entry->resource_idx); + continue; + } + + if (view->resource->type == WINED3D_RTYPE_BUFFER) + buffer_internal_preload(buffer_from_resource(view->resource), context, state); + else + wined3d_texture_load(wined3d_texture_from_resource(view->resource), context, FALSE); + } + } +} + static void context_bind_shader_resources(struct wined3d_context *context, const struct wined3d_state *state) { const struct wined3d_gl_info *gl_info = context->gl_info; @@ -3102,7 +3138,6 @@ static void context_bind_shader_resources(struct wined3d_context *context, const }
texture = wined3d_texture_from_resource(view->resource); - wined3d_texture_load(texture, context, FALSE); context_active_texture(context, gl_info, shader_types[i].base_idx + entry->bind_idx); wined3d_texture_bind(texture, context, FALSE);
@@ -3118,7 +3153,7 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de const struct wined3d_state *state = &device->state; const struct StateEntry *state_table = context->state_table; const struct wined3d_fb_state *fb = state->fb; - unsigned int i, j; + unsigned int i; WORD map;
if (!context_validate_rt_config(context->gl_info->limits.buffers, @@ -3135,6 +3170,7 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de * updating a resource location. */ context_update_tex_unit_map(context, state); context_preload_textures(context, state); + context_load_shader_resources(context, state); /* TODO: Right now the dependency on the vertex shader is necessary * since context_stream_info_from_declaration depends on the reg_maps of * the current VS but maybe it's possible to relax the coupling in some @@ -3160,15 +3196,6 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de buffer_get_sysmem(state->index_buffer, context); }
- for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i) - { - for (j = 0; j < WINED3D_MAX_CBS; ++j) - { - if (state->cb[i][j]) - buffer_internal_preload(state->cb[i][j], context, state); - } - } - for (i = 0; i < context->numDirtyEntries; ++i) { DWORD rep = context->dirtyArray[i];