=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Implement UAV counters.

Alexandre Julliard julliard at winehq.org
Fri Mar 3 14:20:35 CST 2017


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Fri Mar  3 01:30:32 2017 +0100

wined3d: Implement UAV counters.

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         |  3 +++
 dlls/wined3d/view.c            | 46 ++++++++++++++++++++++++++----------------
 dlls/wined3d/wined3d_private.h |  1 +
 3 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 10a7222..784307c 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -3476,6 +3476,9 @@ static void context_bind_unordered_access_views(struct wined3d_context *context,
 
         GL_EXTCALL(glBindImageTexture(i, texture_name, level, GL_TRUE, 0, GL_READ_WRITE,
                 view->format->glInternal));
+
+        if (view->counter_bo)
+            GL_EXTCALL(glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, i, view->counter_bo));
     }
     checkGLcall("Bind unordered access views");
 }
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index d0d90b2..ff31de2 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -206,19 +206,15 @@ static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target
     context_release(context);
 }
 
-static void create_buffer_texture(struct wined3d_gl_view *view,
+static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_context *context,
         struct wined3d_buffer *buffer, const struct wined3d_format *view_format,
         unsigned int offset, unsigned int size)
 {
-    const struct wined3d_gl_info *gl_info;
-    struct wined3d_context *context;
+    const struct wined3d_gl_info *gl_info = context->gl_info;
 
-    context = context_acquire(buffer->resource.device, NULL, 0);
-    gl_info = context->gl_info;
     if (!gl_info->supported[ARB_TEXTURE_BUFFER_OBJECT])
     {
         FIXME("OpenGL implementation does not support buffer textures.\n");
-        context_release(context);
         return;
     }
 
@@ -226,7 +222,6 @@ static void create_buffer_texture(struct wined3d_gl_view *view,
     {
         FIXME("Buffer offset %u is not %u byte aligned.\n",
                 offset, gl_info->limits.texture_buffer_offset_alignment);
-        context_release(context);
         return;
     }
 
@@ -251,11 +246,9 @@ static void create_buffer_texture(struct wined3d_gl_view *view,
 
     context_invalidate_compute_state(context, STATE_COMPUTE_SHADER_RESOURCE_BINDING);
     context_invalidate_state(context, STATE_GRAPHICS_SHADER_RESOURCE_BINDING);
-
-    context_release(context);
 }
 
-static void create_buffer_view(struct wined3d_gl_view *view,
+static void create_buffer_view(struct wined3d_gl_view *view, struct wined3d_context *context,
         const struct wined3d_view_desc *desc, struct wined3d_buffer *buffer,
         const struct wined3d_format *view_format)
 {
@@ -272,7 +265,7 @@ static void create_buffer_view(struct wined3d_gl_view *view,
         size = desc->u.buffer.count * view_format->byte_count;
     }
 
-    create_buffer_texture(view, buffer, view_format, offset, size);
+    create_buffer_texture(view, context, buffer, view_format, offset, size);
 }
 
 ULONG CDECL wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *view)
@@ -563,8 +556,11 @@ static void wined3d_shader_resource_view_cs_init(void *object)
     if (resource->type == WINED3D_RTYPE_BUFFER)
     {
         struct wined3d_buffer *buffer = buffer_from_resource(resource);
+        struct wined3d_context *context;
 
-        create_buffer_view(&view->gl_view, desc, buffer, view_format);
+        context = context_acquire(resource->device, NULL, 0);
+        create_buffer_view(&view->gl_view, context, desc, buffer, view_format);
+        context_release(context);
     }
     else
     {
@@ -675,15 +671,18 @@ static void wined3d_unordered_access_view_destroy_object(void *object)
 {
     struct wined3d_unordered_access_view *view = object;
 
-    if (view->gl_view.name)
+    if (view->gl_view.name || view->counter_bo)
     {
         const struct wined3d_gl_info *gl_info;
         struct wined3d_context *context;
 
         context = context_acquire(view->resource->device, NULL, 0);
         gl_info = context->gl_info;
-        gl_info->gl_ops.gl.p_glDeleteTextures(1, &view->gl_view.name);
-        checkGLcall("glDeleteTextures");
+        if (view->gl_view.name)
+            gl_info->gl_ops.gl.p_glDeleteTextures(1, &view->gl_view.name);
+        if (view->counter_bo)
+            GL_EXTCALL(glDeleteBuffers(1, &view->counter_bo));
+        checkGLcall("delete resources");
         context_release(context);
     }
 
@@ -751,8 +750,21 @@ static void wined3d_unordered_access_view_cs_init(void *object)
     if (resource->type == WINED3D_RTYPE_BUFFER)
     {
         struct wined3d_buffer *buffer = buffer_from_resource(resource);
+        struct wined3d_context *context;
 
-        create_buffer_view(&view->gl_view, desc, buffer, view->format);
+        context = context_acquire(resource->device, NULL, 0);
+        gl_info = context->gl_info;
+        create_buffer_view(&view->gl_view, context, desc, buffer, view->format);
+        if (desc->flags & WINED3D_VIEW_BUFFER_COUNTER)
+        {
+            static const GLuint initial_value = 0;
+            GL_EXTCALL(glGenBuffers(1, &view->counter_bo));
+            GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view->counter_bo));
+            GL_EXTCALL(glBufferData(GL_ATOMIC_COUNTER_BUFFER,
+                    sizeof(initial_value), &initial_value, GL_STATIC_DRAW));
+            checkGLcall("create atomic counter buffer");
+        }
+        context_release(context);
     }
     else
     {
@@ -784,7 +796,7 @@ static HRESULT wined3d_unordered_access_view_init(struct wined3d_unordered_acces
         return E_INVALIDARG;
     view->desc = *desc;
 
-    if (desc->flags & (WINED3D_VIEW_BUFFER_APPEND | WINED3D_VIEW_BUFFER_COUNTER))
+    if (desc->flags & WINED3D_VIEW_BUFFER_APPEND)
         FIXME("Unhandled view flags %#x.\n", desc->flags);
 
     wined3d_resource_incref(view->resource = resource);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 101fe90..d329f11 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3410,6 +3410,7 @@ struct wined3d_unordered_access_view
     struct wined3d_view_desc desc;
 
     struct wined3d_gl_view gl_view;
+    GLuint counter_bo;
 };
 
 void wined3d_unordered_access_view_invalidate_location(struct wined3d_unordered_access_view *view,




More information about the wine-cvs mailing list