Module: wine Branch: master Commit: e5dd9b2a183c2df1a004f2b274900bf27760f95b URL: http://source.winehq.org/git/wine.git/?a=commit;h=e5dd9b2a183c2df1a004f2b274...
Author: Henri Verbeet hverbeet@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) {