[PATCH 06/11] wined3d: Invalidate texture locations while binding UAVs.

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


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/context.c         |  2 ++
 dlls/wined3d/view.c            | 23 +++++++++++++++++++++++
 dlls/wined3d/wined3d_private.h |  5 +++++
 3 files changed, 30 insertions(+)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 2993e0c..e626e20 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -3418,6 +3418,8 @@ static void context_bind_unordered_access_views(struct wined3d_context *context,
 
         texture = texture_from_resource(view->resource);
         wined3d_texture_load(texture, context, FALSE);
+        wined3d_unordered_access_view_invalidate_location(view, ~WINED3D_LOCATION_TEXTURE_RGB);
+
         gl_texture = wined3d_texture_get_gl_texture(texture, FALSE);
         GL_EXTCALL(glBindImageTexture(i, gl_texture->name, view->level_idx, GL_TRUE, 0, GL_READ_WRITE,
                 view->format->glInternal));
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 59885e5..e2b52ef 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -504,6 +504,27 @@ void * CDECL wined3d_unordered_access_view_get_parent(const struct wined3d_unord
     return view->parent;
 }
 
+void wined3d_unordered_access_view_invalidate_location(struct wined3d_unordered_access_view *view,
+        DWORD location)
+{
+    struct wined3d_resource *resource = view->resource;
+    struct wined3d_texture *texture;
+    unsigned int sub_resource_idx;
+    unsigned int i;
+
+    if (resource->type == WINED3D_RTYPE_BUFFER || resource->type == WINED3D_RTYPE_TEXTURE_3D)
+    {
+        FIXME("Not implemented for %s resources.\n", debug_d3dresourcetype(resource->type));
+        return;
+    }
+
+    texture = texture_from_resource(resource);
+
+    sub_resource_idx = view->layer_idx * texture->level_count + view->level_idx;
+    for (i = 0; i < view->layer_count; ++i, sub_resource_idx += texture->level_count)
+        wined3d_texture_invalidate_location(texture, sub_resource_idx, location);
+}
+
 static HRESULT wined3d_unordered_access_view_init(struct wined3d_unordered_access_view *view,
         const struct wined3d_unordered_access_view_desc *desc, struct wined3d_resource *resource,
         void *parent, const struct wined3d_parent_ops *parent_ops)
@@ -544,6 +565,8 @@ static HRESULT wined3d_unordered_access_view_init(struct wined3d_unordered_acces
                     desc->u.texture.layer_idx, desc->u.texture.layer_count);
         }
 
+        view->layer_idx = desc->u.texture.layer_idx;
+        view->layer_count = desc->u.texture.layer_count;
         view->level_idx = desc->u.texture.level_idx;
     }
     wined3d_resource_incref(view->resource = resource);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 4a68c0e..d16d031 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3263,9 +3263,14 @@ struct wined3d_unordered_access_view
 
     const struct wined3d_format *format;
 
+    unsigned int layer_idx;
+    unsigned int layer_count;
     unsigned int level_idx;
 };
 
+void wined3d_unordered_access_view_invalidate_location(struct wined3d_unordered_access_view *view,
+        DWORD location) DECLSPEC_HIDDEN;
+
 struct wined3d_swapchain_ops
 {
     void (*swapchain_present)(struct wined3d_swapchain *swapchain,
-- 
2.7.3




More information about the wine-patches mailing list