From d368779b9ac90494888f4f4d9af0b6f90f150aae Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B3zef=20Kucia?= Date: Wed, 23 Nov 2016 14:36:10 +0100 Subject: [PATCH] wined3d: Synchronize shader memory accesses after each draw call. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Józef Kucia Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/context.c | 4 ++++ dlls/wined3d/drawprim.c | 6 ++++++ dlls/wined3d/wined3d_private.h | 3 ++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index e626e20d89d..989daf29898 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -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); diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 36c8d982190..ebccb1d9a8a 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -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) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 4fe6dffe10b..ace0a555b96 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -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; -- 2.11.4.GIT