[PATCH 09/11] wined3d: Synchronize shader memory accesses after each draw call.

Józef Kucia jkucia at codeweavers.com
Wed Nov 23 07:36:10 CST 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---

A naive approach for a start.

---
 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;
-- 
2.7.3




More information about the wine-patches mailing list