[PATCH 1/4] d3d10core: Store the resource in the d3d10core rendertarget view.

Henri Verbeet hverbeet at codeweavers.com
Sat Sep 8 04:26:23 CDT 2012


This makes proper reference counting much easier.
---
 dlls/d3d10core/d3d10core_private.h |    1 +
 dlls/d3d10core/view.c              |   27 +++++++--------------------
 2 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h
index 885a2ef..153c5cc 100644
--- a/dlls/d3d10core/d3d10core_private.h
+++ b/dlls/d3d10core/d3d10core_private.h
@@ -140,6 +140,7 @@ struct d3d10_rendertarget_view
 
     struct wined3d_rendertarget_view *wined3d_view;
     D3D10_RENDER_TARGET_VIEW_DESC desc;
+    ID3D10Resource *resource;
 };
 
 HRESULT d3d10_rendertarget_view_init(struct d3d10_rendertarget_view *view,
diff --git a/dlls/d3d10core/view.c b/dlls/d3d10core/view.c
index d038faa..a542e63 100644
--- a/dlls/d3d10core/view.c
+++ b/dlls/d3d10core/view.c
@@ -339,6 +339,7 @@ static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_Release(ID3D10RenderTarge
     if (!refcount)
     {
         wined3d_rendertarget_view_decref(This->wined3d_view);
+        ID3D10Resource_Release(This->resource);
         HeapFree(GetProcessHeap(), 0, This);
     }
 
@@ -383,29 +384,12 @@ static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_SetPrivateDataInterface
 static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetResource(ID3D10RenderTargetView *iface,
         ID3D10Resource **resource)
 {
-    struct d3d10_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface);
-    struct wined3d_resource *wined3d_resource;
-    IUnknown *parent;
-    HRESULT hr;
+    struct d3d10_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface);
 
     TRACE("iface %p, resource %p\n", iface, resource);
 
-    wined3d_resource = wined3d_rendertarget_view_get_resource(This->wined3d_view);
-    if (!wined3d_resource)
-    {
-        ERR("Failed to get wined3d resource.\n");
-        *resource = NULL;
-        return;
-    }
-
-    parent = wined3d_resource_get_parent(wined3d_resource);
-    hr = IUnknown_QueryInterface(parent, &IID_ID3D10Resource, (void **)&resource);
-    if (FAILED(hr))
-    {
-        ERR("Resource parent isn't a d3d10 resource, hr %#x\n", hr);
-        *resource = NULL;
-        return;
-    }
+    *resource = view->resource;
+    ID3D10Resource_AddRef(*resource);
 }
 
 /* ID3D10RenderTargetView methods */
@@ -470,6 +454,9 @@ HRESULT d3d10_rendertarget_view_init(struct d3d10_rendertarget_view *view,
         return hr;
     }
 
+    view->resource = resource;
+    ID3D10Resource_AddRef(resource);
+
     return S_OK;
 }
 
-- 
1.7.8.6




More information about the wine-patches mailing list