[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