Henri Verbeet : wined3d: Send shader resource view GL initialisation through the command stream.

Alexandre Julliard julliard at winehq.org
Thu Feb 16 15:12:28 CST 2017


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Thu Feb 16 00:58:54 2017 +0100

wined3d: Send shader resource view GL initialisation through the command stream.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/view.c            | 121 +++++++++++++++++++++++++----------------
 dlls/wined3d/wined3d_private.h |   3 +
 2 files changed, 78 insertions(+), 46 deletions(-)

diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 7919e2e..50e6e0a 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -177,7 +177,7 @@ static void create_buffer_texture(struct wined3d_gl_view *view,
     context_release(context);
 }
 
-static HRESULT create_buffer_view(struct wined3d_gl_view *view,
+static void create_buffer_view(struct wined3d_gl_view *view,
         const struct wined3d_view_desc *desc, struct wined3d_buffer *buffer,
         const struct wined3d_format *view_format)
 {
@@ -186,22 +186,13 @@ static HRESULT create_buffer_view(struct wined3d_gl_view *view,
     if (desc->format_id == WINED3DFMT_UNKNOWN)
     {
         FIXME("Structured buffer views not supported.\n");
-        return WINED3D_OK;
+        return;
     }
 
-    if (desc->u.buffer.start_idx > ~0u / view_format->byte_count
-            || desc->u.buffer.count > ~0u / view_format->byte_count)
-        return E_INVALIDARG;
-
     offset = desc->u.buffer.start_idx * view_format->byte_count;
     size = desc->u.buffer.count * view_format->byte_count;
 
-    if (offset >= buffer->resource.size
-            || size > buffer->resource.size - offset)
-        return E_INVALIDARG;
-
     create_buffer_texture(view, buffer, view_format, offset, size);
-    return WINED3D_OK;
 }
 
 ULONG CDECL wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *view)
@@ -476,13 +467,61 @@ void * CDECL wined3d_shader_resource_view_get_parent(const struct wined3d_shader
     return view->parent;
 }
 
+static void wined3d_shader_resource_view_cs_init(void *object)
+{
+    struct wined3d_shader_resource_view *view = object;
+    struct wined3d_resource *resource = view->resource;
+    const struct wined3d_format *view_format;
+    const struct wined3d_gl_info *gl_info;
+    const struct wined3d_view_desc *desc;
+    GLenum view_target;
+
+    view_format = view->format;
+    gl_info = &resource->device->adapter->gl_info;
+    desc = &view->desc;
+
+    if (resource->type == WINED3D_RTYPE_BUFFER)
+    {
+        struct wined3d_buffer *buffer = buffer_from_resource(resource);
+
+        create_buffer_view(&view->gl_view, desc, buffer, view_format);
+    }
+    else
+    {
+        struct wined3d_texture *texture = texture_from_resource(resource);
+
+        view_target = get_texture_view_target(gl_info, desc, texture);
+
+        if (resource->format->id == view_format->id && texture->target == view_target
+                && !desc->u.texture.level_idx && desc->u.texture.level_count == texture->level_count
+                && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture->layer_count
+                && !is_stencil_view_format(view_format))
+        {
+            TRACE("Creating identity shader resource view.\n");
+        }
+        else if (texture->swapchain && texture->swapchain->desc.backbuffer_count > 1)
+        {
+            FIXME("Swapchain shader resource views not supported.\n");
+        }
+        else if (resource->format->typeless_id == view_format->typeless_id
+                && resource->format->gl_view_class == view_format->gl_view_class)
+        {
+            create_texture_view(&view->gl_view, view_target, desc, texture, view_format);
+        }
+        else
+        {
+            FIXME("Shader resource view not supported, resource format %s, view format %s.\n",
+                    debug_d3dformat(resource->format->id), debug_d3dformat(view_format->id));
+        }
+    }
+}
+
 static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_view *view,
         const struct wined3d_view_desc *desc, struct wined3d_resource *resource,
         void *parent, const struct wined3d_parent_ops *parent_ops)
 {
     const struct wined3d_gl_info *gl_info = &resource->device->adapter->gl_info;
     const struct wined3d_format *view_format;
-    GLenum view_target;
 
     view_format = wined3d_get_format(gl_info, desc->format_id, resource->usage);
     if (resource->type == WINED3D_RTYPE_BUFFER && desc->flags & WINED3D_VIEW_BUFFER_RAW)
@@ -502,17 +541,17 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
         return E_INVALIDARG;
     }
 
-    view->refcount = 1;
-    view->parent = parent;
-    view->parent_ops = parent_ops;
-
     if (resource->type == WINED3D_RTYPE_BUFFER)
     {
         struct wined3d_buffer *buffer = buffer_from_resource(resource);
-        HRESULT hr;
 
-        if (FAILED(hr = create_buffer_view(&view->gl_view, desc, buffer, view_format)))
-            return hr;
+        if (view_format->byte_count)
+        {
+            unsigned int buffer_size = buffer->resource.size / view_format->byte_count;
+            if (desc->u.buffer.start_idx >= buffer_size
+                    || desc->u.buffer.count > buffer_size - desc->u.buffer.start_idx)
+                return E_INVALIDARG;
+        }
     }
     else
     {
@@ -525,32 +564,16 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
                 || desc->u.texture.layer_idx >= texture->layer_count
                 || desc->u.texture.layer_count > texture->layer_count - desc->u.texture.layer_idx)
             return E_INVALIDARG;
-
-        view_target = get_texture_view_target(gl_info, desc, texture);
-
-        if (resource->format->id == view_format->id && texture->target == view_target
-                && !desc->u.texture.level_idx && desc->u.texture.level_count == texture->level_count
-                && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture->layer_count
-                && !is_stencil_view_format(view_format))
-        {
-            TRACE("Creating identity shader resource view.\n");
-        }
-        else if (texture->swapchain && texture->swapchain->desc.backbuffer_count > 1)
-        {
-            FIXME("Swapchain shader resource views not supported.\n");
-        }
-        else if (resource->format->typeless_id == view_format->typeless_id
-                && resource->format->gl_view_class == view_format->gl_view_class)
-        {
-            create_texture_view(&view->gl_view, view_target, desc, texture, view_format);
-        }
-        else
-        {
-            FIXME("Shader resource view not supported, resource format %s, view format %s.\n",
-                    debug_d3dformat(resource->format->id), debug_d3dformat(view_format->id));
-        }
     }
+
+    view->refcount = 1;
     wined3d_resource_incref(view->resource = resource);
+    view->parent = parent;
+    view->parent_ops = parent_ops;
+    view->format = view_format;
+    view->desc = *desc;
+
+    wined3d_cs_init_object(resource->device->cs, wined3d_shader_resource_view_cs_init, view);
 
     return WINED3D_OK;
 }
@@ -696,10 +719,16 @@ static HRESULT wined3d_unordered_access_view_init(struct wined3d_unordered_acces
     if (resource->type == WINED3D_RTYPE_BUFFER)
     {
         struct wined3d_buffer *buffer = buffer_from_resource(resource);
-        HRESULT hr;
 
-        if (FAILED(hr = create_buffer_view(&view->gl_view, desc, buffer, view->format)))
-            return hr;
+        if (view->format->byte_count)
+        {
+            unsigned int buffer_size = buffer->resource.size / view->format->byte_count;
+            if (desc->u.buffer.start_idx >= buffer_size
+                    || desc->u.buffer.count > buffer_size - desc->u.buffer.start_idx)
+                return E_INVALIDARG;
+        }
+
+        create_buffer_view(&view->gl_view, desc, buffer, view->format);
     }
     else
     {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f6b42e5..512d33d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3352,6 +3352,9 @@ struct wined3d_shader_resource_view
     void *parent;
     const struct wined3d_parent_ops *parent_ops;
 
+    const struct wined3d_format *format;
+    struct wined3d_view_desc desc;
+
     struct wined3d_gl_view gl_view;
 };
 




More information about the wine-cvs mailing list