=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Synchronize shader memory accesses after each draw call.

Alexandre Julliard julliard at winehq.org
Thu Nov 24 16:27:59 CST 2016


Module: wine
Branch: master
Commit: d368779b9ac90494888f4f4d9af0b6f90f150aae
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d368779b9ac90494888f4f4d9af0b6f90f150aae

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Wed Nov 23 14:36:10 2016 +0100

wined3d: Synchronize shader memory accesses after each draw call.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 e626e20..989daf2 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 36c8d98..ebccb1d 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 4fe6dff..ace0a55 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;




More information about the wine-cvs mailing list