wined3d: Synchronize shader memory accesses after each draw call.

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 2016-11-23 14:36:10 +01:00 committed by Alexandre Julliard
parent 0131d4e6d1
commit d368779b9a
3 changed files with 12 additions and 1 deletions

View File

@ -3396,6 +3396,8 @@ static void context_bind_unordered_access_views(struct wined3d_context *context,
struct gl_texture *gl_texture;
unsigned int i;
context->uses_uavs = 0;
if (!(shader = state->shader[WINED3D_SHADER_TYPE_PIXEL]))
return;
@ -3416,6 +3418,8 @@ static void context_bind_unordered_access_views(struct wined3d_context *context,
continue;
}
context->uses_uavs = 1;
texture = texture_from_resource(view->resource);
wined3d_texture_load(texture, context, FALSE);
wined3d_unordered_access_view_invalidate_location(view, ~WINED3D_LOCATION_TEXTURE_RGB);

View File

@ -578,6 +578,12 @@ void draw_primitive(struct wined3d_device *device, const struct wined3d_state *s
draw_primitive_arrays(context, state, idx_data, idx_size, base_vertex_idx,
start_idx, index_count, start_instance, instance_count);
if (context->uses_uavs)
{
GL_EXTCALL(glMemoryBarrier(GL_ALL_BARRIER_BITS));
checkGLcall("glMemoryBarrier");
}
if (ib_query)
wined3d_event_query_issue(ib_query, device);
for (i = 0; i < context->num_buffer_queries; ++i)

View File

@ -1505,8 +1505,9 @@ struct wined3d_context
DWORD hdc_has_format : 1; /* only meaningful if hdc_is_private */
DWORD update_shader_resource_bindings : 1;
DWORD update_unordered_access_view_bindings : 1;
DWORD uses_uavs : 1;
DWORD destroy_delayed : 1;
DWORD padding : 12;
DWORD padding : 11;
DWORD last_swizzle_map; /* MAX_ATTRIBS, 16 */
DWORD shader_update_mask;
DWORD constant_update_mask;