Henri Verbeet : d3d10core: Create wined3d views for shader resource views.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Sep 16 14:36:42 CDT 2014
Module: wine
Branch: master
Commit: e01d2076997a4c5a232d3a6215335c27d2d4703a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e01d2076997a4c5a232d3a6215335c27d2d4703a
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Tue Sep 16 10:44:15 2014 +0200
d3d10core: Create wined3d views for shader resource views.
---
dlls/d3d10core/d3d10core_private.h | 1 +
dlls/d3d10core/view.c | 7 ++++++
dlls/wined3d/view.c | 44 ++++++++++++++++++++++++++++++++++++++
dlls/wined3d/wined3d.spec | 4 ++++
dlls/wined3d/wined3d_private.h | 8 +++++++
include/wine/wined3d.h | 6 ++++++
6 files changed, 70 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..26575e2 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -158,3 +158,47 @@ 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,
More information about the wine-cvs
mailing list