[PATCH 4/5] d3d10core: Create wined3d views for shader resource views.

Henri Verbeet hverbeet at codeweavers.com
Tue Sep 16 03:44:15 CDT 2014


---
 dlls/d3d10core/d3d10core_private.h |    1 +
 dlls/d3d10core/view.c              |    7 ++++++
 dlls/wined3d/view.c                |   45 ++++++++++++++++++++++++++++++++++++
 dlls/wined3d/wined3d.spec          |    4 ++++
 dlls/wined3d/wined3d_private.h     |    8 +++++++
 include/wine/wined3d.h             |    6 +++++
 6 files changed, 71 insertions(+)

diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h
index bf6a592..ca8735c 100644
--- a/dlls/d3d10core/d3d10core_private.h
+++ b/dlls/d3d10core/d3d10core_private.h
@@ -157,6 +157,7 @@ struct d3d10_shader_resource_view
     ID3D10ShaderResourceView ID3D10ShaderResourceView_iface;
     LONG refcount;
 
+    struct wined3d_shader_resource_view *wined3d_view;
     D3D10_SHADER_RESOURCE_VIEW_DESC desc;
     ID3D10Resource *resource;
     ID3D10Device1 *device;
diff --git a/dlls/d3d10core/view.c b/dlls/d3d10core/view.c
index 27b09a8..40b6201 100644
--- a/dlls/d3d10core/view.c
+++ b/dlls/d3d10core/view.c
@@ -894,6 +894,7 @@ static ULONG STDMETHODCALLTYPE d3d10_shader_resource_view_Release(ID3D10ShaderRe
 
     if (!refcount)
     {
+        wined3d_shader_resource_view_decref(This->wined3d_view);
         ID3D10Resource_Release(This->resource);
         ID3D10Device1_Release(This->device);
         HeapFree(GetProcessHeap(), 0, This);
@@ -1001,6 +1002,12 @@ HRESULT d3d10_shader_resource_view_init(struct d3d10_shader_resource_view *view,
         view->desc = *desc;
     }
 
+    if (FAILED(hr = wined3d_shader_resource_view_create(view, &d3d10_null_wined3d_parent_ops, &view->wined3d_view)))
+    {
+        WARN("Failed to create wined3d shader resource view, hr %#x.\n", hr);
+        return hr;
+    }
+
     view->resource = resource;
     ID3D10Resource_AddRef(resource);
     view->device = &device->ID3D10Device1_iface;
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 5ceebdb..17493c4 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -158,3 +158,48 @@ HRESULT CDECL wined3d_rendertarget_view_create_from_surface(struct wined3d_surfa
 
     return wined3d_rendertarget_view_create(&desc, &surface->container->resource, parent, parent_ops, view);
 }
+
+ULONG CDECL wined3d_shader_resource_view_incref(struct wined3d_shader_resource_view *view)
+{
+    ULONG refcount = InterlockedIncrement(&view->refcount);
+
+    TRACE("%p increasing refcount to %u.\n", view, refcount);
+
+    return refcount;
+}
+
+ULONG CDECL wined3d_shader_resource_view_decref(struct wined3d_shader_resource_view *view)
+{
+    ULONG refcount = InterlockedDecrement(&view->refcount);
+
+    TRACE("%p decreasing refcount to %u.\n", view, refcount);
+
+    if (!refcount)
+    {
+        view->parent_ops->wined3d_object_destroyed(view->parent);
+        HeapFree(GetProcessHeap(), 0, view);
+    }
+
+    return refcount;
+}
+
+HRESULT CDECL wined3d_shader_resource_view_create(void *parent, const struct wined3d_parent_ops *parent_ops,
+        struct wined3d_shader_resource_view **view)
+{
+    struct wined3d_shader_resource_view *object;
+
+    TRACE("parent %p, parent_ops %p, view %p.\n", parent, parent_ops, view);
+
+    if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
+        return E_OUTOFMEMORY;
+
+    object->refcount = 1;
+    object->parent = parent;
+    object->parent_ops = parent_ops;
+
+    TRACE("Created shader resource view %p.\n", object);
+    *view = object;
+
+    return WINED3D_OK;
+}
+
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 0ee16c4..80052e5 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -199,6 +199,10 @@
 @ cdecl wined3d_shader_incref(ptr)
 @ cdecl wined3d_shader_set_local_constants_float(ptr long ptr long)
 
+@ cdecl wined3d_shader_resource_view_create(ptr ptr ptr)
+@ cdecl wined3d_shader_resource_view_decref(ptr)
+@ cdecl wined3d_shader_resource_view_incref(ptr)
+
 @ cdecl wined3d_stateblock_apply(ptr)
 @ cdecl wined3d_stateblock_capture(ptr)
 @ cdecl wined3d_stateblock_create(ptr long ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f55b118..e43c356 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2646,6 +2646,14 @@ static inline struct wined3d_surface *wined3d_rendertarget_view_get_surface(
     return surface_from_resource(resource);
 }
 
+struct wined3d_shader_resource_view
+{
+    LONG refcount;
+
+    void *parent;
+    const struct wined3d_parent_ops *parent_ops;
+};
+
 struct wined3d_swapchain_ops
 {
     void (*swapchain_present)(struct wined3d_swapchain *swapchain, const RECT *src_rect,
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 6dda931..336749d 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1984,6 +1984,7 @@ struct wined3d_rendertarget_view;
 struct wined3d_resource;
 struct wined3d_sampler;
 struct wined3d_shader;
+struct wined3d_shader_resource_view;
 struct wined3d_stateblock;
 struct wined3d_surface;
 struct wined3d_swapchain;
@@ -2409,6 +2410,11 @@ ULONG __cdecl wined3d_shader_incref(struct wined3d_shader *shader);
 HRESULT __cdecl wined3d_shader_set_local_constants_float(struct wined3d_shader *shader,
         UINT start_idx, const float *src_data, UINT vector4f_count);
 
+HRESULT __cdecl wined3d_shader_resource_view_create(void *parent, const struct wined3d_parent_ops *parent_ops,
+        struct wined3d_shader_resource_view **view);
+ULONG __cdecl wined3d_shader_resource_view_decref(struct wined3d_shader_resource_view *view);
+ULONG __cdecl wined3d_shader_resource_view_incref(struct wined3d_shader_resource_view *view);
+
 void __cdecl wined3d_stateblock_apply(const struct wined3d_stateblock *stateblock);
 void __cdecl wined3d_stateblock_capture(struct wined3d_stateblock *stateblock);
 HRESULT __cdecl wined3d_stateblock_create(struct wined3d_device *device,
-- 
1.7.10.4




More information about the wine-patches mailing list