Henri Verbeet : d3d10core: Implement d3d10_texture2d_GetPrivateData().

Alexandre Julliard julliard at wine.codeweavers.com
Tue Feb 24 10:33:22 CST 2015


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Feb 23 17:59:44 2015 +0100

d3d10core: Implement d3d10_texture2d_GetPrivateData().

---

 dlls/d3d10core/d3d10core_private.h |  2 ++
 dlls/d3d10core/texture.c           | 16 ++++++++++++++--
 dlls/d3d10core/utils.c             | 29 +++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h
index 6a975c1..de84567 100644
--- a/dlls/d3d10core/d3d10core_private.h
+++ b/dlls/d3d10core/d3d10core_private.h
@@ -66,6 +66,8 @@ DWORD wined3d_usage_from_d3d10core(UINT bind_flags, enum D3D10_USAGE usage) DECL
 struct wined3d_resource *wined3d_resource_from_resource(ID3D10Resource *resource) DECLSPEC_HIDDEN;
 DWORD wined3d_map_flags_from_d3d10_map_type(D3D10_MAP map_type) DECLSPEC_HIDDEN;
 
+HRESULT d3d10_get_private_data(struct wined3d_private_store *store,
+        REFGUID guid, UINT *data_size, void *data) DECLSPEC_HIDDEN;
 HRESULT d3d10_set_private_data(struct wined3d_private_store *store,
         REFGUID guid, UINT data_size, const void *data) DECLSPEC_HIDDEN;
 HRESULT d3d10_set_private_data_interface(struct wined3d_private_store *store,
diff --git a/dlls/d3d10core/texture.c b/dlls/d3d10core/texture.c
index 1c82bad..4b32f3d 100644
--- a/dlls/d3d10core/texture.c
+++ b/dlls/d3d10core/texture.c
@@ -119,10 +119,22 @@ static void STDMETHODCALLTYPE d3d10_texture2d_GetDevice(ID3D10Texture2D *iface,
 static HRESULT STDMETHODCALLTYPE d3d10_texture2d_GetPrivateData(ID3D10Texture2D *iface,
         REFGUID guid, UINT *data_size, void *data)
 {
-    FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
+    struct d3d10_texture2d *texture = impl_from_ID3D10Texture2D(iface);
+    IDXGISurface *dxgi_surface;
+    HRESULT hr;
+
+    TRACE("iface %p, guid %s, data_size %p, data %p.\n",
             iface, debugstr_guid(guid), data_size, data);
 
-    return E_NOTIMPL;
+    if (texture->dxgi_surface
+            && SUCCEEDED(IUnknown_QueryInterface(texture->dxgi_surface, &IID_IDXGISurface, (void **)&dxgi_surface)))
+    {
+        hr = IDXGISurface_GetPrivateData(dxgi_surface, guid, data_size, data);
+        IDXGISurface_Release(dxgi_surface);
+        return hr;
+    }
+
+    return d3d10_get_private_data(&texture->private_store, guid, data_size, data);
 }
 
 static HRESULT STDMETHODCALLTYPE d3d10_texture2d_SetPrivateData(ID3D10Texture2D *iface,
diff --git a/dlls/d3d10core/utils.c b/dlls/d3d10core/utils.c
index a5f539b..2515136 100644
--- a/dlls/d3d10core/utils.c
+++ b/dlls/d3d10core/utils.c
@@ -411,6 +411,35 @@ DWORD wined3d_map_flags_from_d3d10_map_type(D3D10_MAP map_type)
     }
 }
 
+HRESULT d3d10_get_private_data(struct wined3d_private_store *store,
+        REFGUID guid, UINT *data_size, void *data)
+{
+    const struct wined3d_private_data *stored_data;
+    DWORD size_in;
+
+    if (!data_size)
+        return E_INVALIDARG;
+
+    if (!(stored_data = wined3d_private_store_get_private_data(store, guid)))
+    {
+        *data_size = 0;
+        return DXGI_ERROR_NOT_FOUND;
+    }
+
+    size_in = *data_size;
+    *data_size = stored_data->size;
+    if (!data)
+        return S_OK;
+    if (size_in < stored_data->size)
+        return DXGI_ERROR_MORE_DATA;
+
+    if (stored_data->flags & WINED3DSPD_IUNKNOWN)
+        IUnknown_AddRef(stored_data->content.object);
+    memcpy(data, stored_data->content.data, stored_data->size);
+
+    return S_OK;
+}
+
 HRESULT d3d10_set_private_data(struct wined3d_private_store *store,
         REFGUID guid, UINT data_size, const void *data)
 {




More information about the wine-cvs mailing list