From 5145b131998276e8d837df1e6d7ba5ef5aafdd57 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 24 Apr 2012 20:54:14 +0200 Subject: [PATCH] d3d9: Merge volumetexture.c into texture.c. --- dlls/d3d9/Makefile.in | 3 +- dlls/d3d9/texture.c | 419 ++++++++++++++++++++++++++++++++++++++++++ dlls/d3d9/volumetexture.c | 454 ---------------------------------------------- 3 files changed, 420 insertions(+), 456 deletions(-) delete mode 100644 dlls/d3d9/volumetexture.c diff --git a/dlls/d3d9/Makefile.in b/dlls/d3d9/Makefile.in index 52a077a3361..c60e2b60297 100644 --- a/dlls/d3d9/Makefile.in +++ b/dlls/d3d9/Makefile.in @@ -14,8 +14,7 @@ C_SRCS = \ swapchain.c \ texture.c \ vertexdeclaration.c \ - volume.c \ - volumetexture.c + volume.c RC_SRCS = version.rc diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c index 30703d11e0b..3c08cc3ec77 100644 --- a/dlls/d3d9/texture.c +++ b/dlls/d3d9/texture.c @@ -33,6 +33,11 @@ static inline struct d3d9_texture *impl_from_IDirect3DCubeTexture9(IDirect3DCube return CONTAINING_RECORD(iface, struct d3d9_texture, IDirect3DBaseTexture9_iface); } +static inline struct d3d9_texture *impl_from_IDirect3DVolumeTexture9(IDirect3DVolumeTexture9 *iface) +{ + return CONTAINING_RECORD(iface, struct d3d9_texture, IDirect3DBaseTexture9_iface); +} + static HRESULT WINAPI d3d9_texture_2d_QueryInterface(IDirect3DTexture9 *iface, REFIID riid, void **out) { TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); @@ -849,6 +854,395 @@ static const IDirect3DCubeTexture9Vtbl d3d9_texture_cube_vtbl = d3d9_texture_cube_AddDirtyRect, }; +static HRESULT WINAPI d3d9_texture_3d_QueryInterface(IDirect3DVolumeTexture9 *iface, REFIID riid, void **out) +{ + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + + if (IsEqualGUID(riid, &IID_IDirect3DVolumeTexture9) + || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9) + || IsEqualGUID(riid, &IID_IDirect3DResource9) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IDirect3DVolumeTexture9_AddRef(iface); + *out = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d9_texture_3d_AddRef(IDirect3DVolumeTexture9 *iface) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + ULONG ref = InterlockedIncrement(&texture->refcount); + + TRACE("%p increasing refcount to %u.\n", iface, ref); + + if (ref == 1) + { + IDirect3DDevice9Ex_AddRef(texture->parent_device); + wined3d_mutex_lock(); + wined3d_texture_incref(texture->wined3d_texture); + wined3d_mutex_unlock(); + } + + return ref; +} + +static ULONG WINAPI d3d9_texture_3d_Release(IDirect3DVolumeTexture9 *iface) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + ULONG ref = InterlockedDecrement(&texture->refcount); + + TRACE("%p decreasing refcount to %u.\n", iface, ref); + + if (!ref) + { + IDirect3DDevice9Ex *parent_device = texture->parent_device; + + wined3d_mutex_lock(); + wined3d_texture_decref(texture->wined3d_texture); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice9Ex_Release(parent_device); + } + return ref; +} + +static HRESULT WINAPI d3d9_texture_3d_GetDevice(IDirect3DVolumeTexture9 *iface, IDirect3DDevice9 **device) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice9 *)texture->parent_device; + IDirect3DDevice9_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_texture_3d_SetPrivateData(IDirect3DVolumeTexture9 *iface, + REFGUID guid, const void *data, DWORD data_size, DWORD flags) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + struct wined3d_resource *resource; + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", + iface, debugstr_guid(guid), data, data_size, flags); + + wined3d_mutex_lock(); + resource = wined3d_texture_get_resource(texture->wined3d_texture); + hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_texture_3d_GetPrivateData(IDirect3DVolumeTexture9 *iface, + REFGUID guid, void *data, DWORD *data_size) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + struct wined3d_resource *resource; + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %p.\n", + iface, debugstr_guid(guid), data, data_size); + + wined3d_mutex_lock(); + resource = wined3d_texture_get_resource(texture->wined3d_texture); + hr = wined3d_resource_get_private_data(resource, guid, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_texture_3d_FreePrivateData(IDirect3DVolumeTexture9 *iface, REFGUID guid) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + struct wined3d_resource *resource; + HRESULT hr; + + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + wined3d_mutex_lock(); + resource = wined3d_texture_get_resource(texture->wined3d_texture); + hr = wined3d_resource_free_private_data(resource, guid); + wined3d_mutex_unlock(); + + return hr; +} + +static DWORD WINAPI d3d9_texture_3d_SetPriority(IDirect3DVolumeTexture9 *iface, DWORD priority) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + DWORD ret; + + TRACE("iface %p, priority %u.\n", iface, priority); + + wined3d_mutex_lock(); + ret = wined3d_texture_set_priority(texture->wined3d_texture, priority); + wined3d_mutex_unlock(); + + return ret; +} + +static DWORD WINAPI d3d9_texture_3d_GetPriority(IDirect3DVolumeTexture9 *iface) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + DWORD ret; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + ret = wined3d_texture_get_priority(texture->wined3d_texture); + wined3d_mutex_unlock(); + + return ret; +} + +static void WINAPI d3d9_texture_3d_PreLoad(IDirect3DVolumeTexture9 *iface) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + wined3d_texture_preload(texture->wined3d_texture); + wined3d_mutex_unlock(); +} + +static D3DRESOURCETYPE WINAPI d3d9_texture_3d_GetType(IDirect3DVolumeTexture9 *iface) +{ + TRACE("iface %p.\n", iface); + + return D3DRTYPE_VOLUMETEXTURE; +} + +static DWORD WINAPI d3d9_texture_3d_SetLOD(IDirect3DVolumeTexture9 *iface, DWORD lod) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + DWORD ret; + + TRACE("iface %p, lod %u.\n", iface, lod); + + wined3d_mutex_lock(); + ret = wined3d_texture_set_lod(texture->wined3d_texture, lod); + wined3d_mutex_unlock(); + + return ret; +} + +static DWORD WINAPI d3d9_texture_3d_GetLOD(IDirect3DVolumeTexture9 *iface) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + DWORD ret; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + ret = wined3d_texture_get_lod(texture->wined3d_texture); + wined3d_mutex_unlock(); + + return ret; +} + +static DWORD WINAPI d3d9_texture_3d_GetLevelCount(IDirect3DVolumeTexture9 *iface) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + DWORD ret; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + ret = wined3d_texture_get_level_count(texture->wined3d_texture); + wined3d_mutex_unlock(); + + return ret; +} + +static HRESULT WINAPI d3d9_texture_3d_SetAutoGenFilterType(IDirect3DVolumeTexture9 *iface, + D3DTEXTUREFILTERTYPE filter_type) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + HRESULT hr; + + TRACE("iface %p, filter_type %#x.\n", iface, filter_type); + + wined3d_mutex_lock(); + hr = wined3d_texture_set_autogen_filter_type(texture->wined3d_texture, + (enum wined3d_texture_filter_type)filter_type); + wined3d_mutex_unlock(); + + return hr; +} + +static D3DTEXTUREFILTERTYPE WINAPI d3d9_texture_3d_GetAutoGenFilterType(IDirect3DVolumeTexture9 *iface) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + D3DTEXTUREFILTERTYPE filter_type; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + filter_type = (D3DTEXTUREFILTERTYPE)wined3d_texture_get_autogen_filter_type(texture->wined3d_texture); + wined3d_mutex_unlock(); + + return filter_type; +} + +static void WINAPI d3d9_texture_3d_GenerateMipSubLevels(IDirect3DVolumeTexture9 *iface) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + wined3d_texture_generate_mipmaps(texture->wined3d_texture); + wined3d_mutex_unlock(); +} + +static HRESULT WINAPI d3d9_texture_3d_GetLevelDesc(IDirect3DVolumeTexture9 *iface, UINT level, D3DVOLUME_DESC *desc) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + struct wined3d_resource *sub_resource; + HRESULT hr = D3D_OK; + + TRACE("iface %p, level %u, desc %p.\n", iface, level, desc); + + wined3d_mutex_lock(); + if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) + hr = D3DERR_INVALIDCALL; + else + { + struct wined3d_resource_desc wined3d_desc; + + wined3d_resource_get_desc(sub_resource, &wined3d_desc); + desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format); + desc->Type = wined3d_desc.resource_type; + desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK; + desc->Pool = wined3d_desc.pool; + desc->Width = wined3d_desc.width; + desc->Height = wined3d_desc.height; + desc->Depth = wined3d_desc.depth; + } + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_texture_3d_GetVolumeLevel(IDirect3DVolumeTexture9 *iface, + UINT level, IDirect3DVolume9 **volume) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + struct wined3d_resource *sub_resource; + + TRACE("iface %p, level %u, volume %p.\n", iface, level, volume); + + wined3d_mutex_lock(); + if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) + { + wined3d_mutex_unlock(); + return D3DERR_INVALIDCALL; + } + + *volume = wined3d_resource_get_parent(sub_resource); + IDirect3DVolume9_AddRef(*volume); + wined3d_mutex_unlock(); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_texture_3d_LockBox(IDirect3DVolumeTexture9 *iface, + UINT level, D3DLOCKED_BOX *locked_box, const D3DBOX *box, DWORD flags) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + struct wined3d_resource *sub_resource; + HRESULT hr; + + TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n", + iface, level, locked_box, box, flags); + + wined3d_mutex_lock(); + if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) + hr = D3DERR_INVALIDCALL; + else + hr = IDirect3DVolume9_LockBox((IDirect3DVolume9 *)wined3d_resource_get_parent(sub_resource), + locked_box, box, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_texture_3d_UnlockBox(IDirect3DVolumeTexture9 *iface, UINT level) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + struct wined3d_resource *sub_resource; + HRESULT hr; + + TRACE("iface %p, level %u.\n", iface, level); + + wined3d_mutex_lock(); + if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) + hr = D3DERR_INVALIDCALL; + else + hr = IDirect3DVolume9_UnlockBox((IDirect3DVolume9 *)wined3d_resource_get_parent(sub_resource)); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_texture_3d_AddDirtyBox(IDirect3DVolumeTexture9 *iface, const D3DBOX *dirty_box) +{ + struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); + HRESULT hr; + + TRACE("iface %p, dirty_box %p.\n", iface, dirty_box); + + wined3d_mutex_lock(); + hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const struct wined3d_box *)dirty_box); + wined3d_mutex_unlock(); + + return hr; +} + + +static const IDirect3DVolumeTexture9Vtbl d3d9_texture_3d_vtbl = +{ + /* IUnknown */ + d3d9_texture_3d_QueryInterface, + d3d9_texture_3d_AddRef, + d3d9_texture_3d_Release, + /* IDirect3DResource9 */ + d3d9_texture_3d_GetDevice, + d3d9_texture_3d_SetPrivateData, + d3d9_texture_3d_GetPrivateData, + d3d9_texture_3d_FreePrivateData, + d3d9_texture_3d_SetPriority, + d3d9_texture_3d_GetPriority, + d3d9_texture_3d_PreLoad, + d3d9_texture_3d_GetType, + /* IDirect3DBaseTexture9 */ + d3d9_texture_3d_SetLOD, + d3d9_texture_3d_GetLOD, + d3d9_texture_3d_GetLevelCount, + d3d9_texture_3d_SetAutoGenFilterType, + d3d9_texture_3d_GetAutoGenFilterType, + d3d9_texture_3d_GenerateMipSubLevels, + /* IDirect3DVolumeTexture9 */ + d3d9_texture_3d_GetLevelDesc, + d3d9_texture_3d_GetVolumeLevel, + d3d9_texture_3d_LockBox, + d3d9_texture_3d_UnlockBox, + d3d9_texture_3d_AddDirtyBox, +}; + static void STDMETHODCALLTYPE d3d9_texture_wined3d_object_destroyed(void *parent) { HeapFree(GetProcessHeap(), 0, parent); @@ -908,3 +1302,28 @@ HRESULT cubetexture_init(struct d3d9_texture *texture, IDirect3DDevice9Impl *dev return D3D_OK; } + +HRESULT volumetexture_init(struct d3d9_texture *texture, IDirect3DDevice9Impl *device, + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + texture->IDirect3DBaseTexture9_iface.lpVtbl = (const IDirect3DBaseTexture9Vtbl *)&d3d9_texture_3d_vtbl; + texture->refcount = 1; + + wined3d_mutex_lock(); + hr = wined3d_texture_create_3d(device->wined3d_device, width, height, depth, levels, + usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, + &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); + return hr; + } + + texture->parent_device = &device->IDirect3DDevice9Ex_iface; + IDirect3DDevice9Ex_AddRef(texture->parent_device); + + return D3D_OK; +} diff --git a/dlls/d3d9/volumetexture.c b/dlls/d3d9/volumetexture.c deleted file mode 100644 index 66ae1e6f9b9..00000000000 --- a/dlls/d3d9/volumetexture.c +++ /dev/null @@ -1,454 +0,0 @@ -/* - * IDirect3DVolumeTexture9 implementation - * - * Copyright 2002-2005 Jason Edmeades - * Raphael Junqueira - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d9_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d9); - -static inline struct d3d9_texture *impl_from_IDirect3DVolumeTexture9(IDirect3DVolumeTexture9 *iface) -{ - return CONTAINING_RECORD(iface, struct d3d9_texture, IDirect3DBaseTexture9_iface); -} - -static HRESULT WINAPI d3d9_texture_3d_QueryInterface(IDirect3DVolumeTexture9 *iface, REFIID riid, void **out) -{ - TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); - - if (IsEqualGUID(riid, &IID_IDirect3DVolumeTexture9) - || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9) - || IsEqualGUID(riid, &IID_IDirect3DResource9) - || IsEqualGUID(riid, &IID_IUnknown)) - { - IDirect3DVolumeTexture9_AddRef(iface); - *out = iface; - return S_OK; - } - - WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); - - *out = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI d3d9_texture_3d_AddRef(IDirect3DVolumeTexture9 *iface) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - ULONG ref = InterlockedIncrement(&texture->refcount); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice9Ex_AddRef(texture->parent_device); - wined3d_mutex_lock(); - wined3d_texture_incref(texture->wined3d_texture); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI d3d9_texture_3d_Release(IDirect3DVolumeTexture9 *iface) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - ULONG ref = InterlockedDecrement(&texture->refcount); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (!ref) - { - IDirect3DDevice9Ex *parent_device = texture->parent_device; - - wined3d_mutex_lock(); - wined3d_texture_decref(texture->wined3d_texture); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice9Ex_Release(parent_device); - } - return ref; -} - -static HRESULT WINAPI d3d9_texture_3d_GetDevice(IDirect3DVolumeTexture9 *iface, IDirect3DDevice9 **device) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice9 *)texture->parent_device; - IDirect3DDevice9_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI d3d9_texture_3d_SetPrivateData(IDirect3DVolumeTexture9 *iface, - REFGUID guid, const void *data, DWORD data_size, DWORD flags) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - struct wined3d_resource *resource; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", - iface, debugstr_guid(guid), data, data_size, flags); - - wined3d_mutex_lock(); - resource = wined3d_texture_get_resource(texture->wined3d_texture); - hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI d3d9_texture_3d_GetPrivateData(IDirect3DVolumeTexture9 *iface, - REFGUID guid, void *data, DWORD *data_size) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - struct wined3d_resource *resource; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %p.\n", - iface, debugstr_guid(guid), data, data_size); - - wined3d_mutex_lock(); - resource = wined3d_texture_get_resource(texture->wined3d_texture); - hr = wined3d_resource_get_private_data(resource, guid, data, data_size); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI d3d9_texture_3d_FreePrivateData(IDirect3DVolumeTexture9 *iface, REFGUID guid) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - struct wined3d_resource *resource; - HRESULT hr; - - TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); - - wined3d_mutex_lock(); - resource = wined3d_texture_get_resource(texture->wined3d_texture); - hr = wined3d_resource_free_private_data(resource, guid); - wined3d_mutex_unlock(); - - return hr; -} - -static DWORD WINAPI d3d9_texture_3d_SetPriority(IDirect3DVolumeTexture9 *iface, DWORD priority) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - DWORD ret; - - TRACE("iface %p, priority %u.\n", iface, priority); - - wined3d_mutex_lock(); - ret = wined3d_texture_set_priority(texture->wined3d_texture, priority); - wined3d_mutex_unlock(); - - return ret; -} - -static DWORD WINAPI d3d9_texture_3d_GetPriority(IDirect3DVolumeTexture9 *iface) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - DWORD ret; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - ret = wined3d_texture_get_priority(texture->wined3d_texture); - wined3d_mutex_unlock(); - - return ret; -} - -static void WINAPI d3d9_texture_3d_PreLoad(IDirect3DVolumeTexture9 *iface) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - wined3d_texture_preload(texture->wined3d_texture); - wined3d_mutex_unlock(); -} - -static D3DRESOURCETYPE WINAPI d3d9_texture_3d_GetType(IDirect3DVolumeTexture9 *iface) -{ - TRACE("iface %p.\n", iface); - - return D3DRTYPE_VOLUMETEXTURE; -} - -static DWORD WINAPI d3d9_texture_3d_SetLOD(IDirect3DVolumeTexture9 *iface, DWORD lod) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - DWORD ret; - - TRACE("iface %p, lod %u.\n", iface, lod); - - wined3d_mutex_lock(); - ret = wined3d_texture_set_lod(texture->wined3d_texture, lod); - wined3d_mutex_unlock(); - - return ret; -} - -static DWORD WINAPI d3d9_texture_3d_GetLOD(IDirect3DVolumeTexture9 *iface) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - DWORD ret; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - ret = wined3d_texture_get_lod(texture->wined3d_texture); - wined3d_mutex_unlock(); - - return ret; -} - -static DWORD WINAPI d3d9_texture_3d_GetLevelCount(IDirect3DVolumeTexture9 *iface) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - DWORD ret; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - ret = wined3d_texture_get_level_count(texture->wined3d_texture); - wined3d_mutex_unlock(); - - return ret; -} - -static HRESULT WINAPI d3d9_texture_3d_SetAutoGenFilterType(IDirect3DVolumeTexture9 *iface, - D3DTEXTUREFILTERTYPE filter_type) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - HRESULT hr; - - TRACE("iface %p, filter_type %#x.\n", iface, filter_type); - - wined3d_mutex_lock(); - hr = wined3d_texture_set_autogen_filter_type(texture->wined3d_texture, - (enum wined3d_texture_filter_type)filter_type); - wined3d_mutex_unlock(); - - return hr; -} - -static D3DTEXTUREFILTERTYPE WINAPI d3d9_texture_3d_GetAutoGenFilterType(IDirect3DVolumeTexture9 *iface) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - D3DTEXTUREFILTERTYPE filter_type; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - filter_type = (D3DTEXTUREFILTERTYPE)wined3d_texture_get_autogen_filter_type(texture->wined3d_texture); - wined3d_mutex_unlock(); - - return filter_type; -} - -static void WINAPI d3d9_texture_3d_GenerateMipSubLevels(IDirect3DVolumeTexture9 *iface) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - wined3d_texture_generate_mipmaps(texture->wined3d_texture); - wined3d_mutex_unlock(); -} - -static HRESULT WINAPI d3d9_texture_3d_GetLevelDesc(IDirect3DVolumeTexture9 *iface, UINT level, D3DVOLUME_DESC *desc) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - struct wined3d_resource *sub_resource; - HRESULT hr = D3D_OK; - - TRACE("iface %p, level %u, desc %p.\n", iface, level, desc); - - wined3d_mutex_lock(); - if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) - hr = D3DERR_INVALIDCALL; - else - { - struct wined3d_resource_desc wined3d_desc; - - wined3d_resource_get_desc(sub_resource, &wined3d_desc); - desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format); - desc->Type = wined3d_desc.resource_type; - desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK; - desc->Pool = wined3d_desc.pool; - desc->Width = wined3d_desc.width; - desc->Height = wined3d_desc.height; - desc->Depth = wined3d_desc.depth; - } - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI d3d9_texture_3d_GetVolumeLevel(IDirect3DVolumeTexture9 *iface, - UINT level, IDirect3DVolume9 **volume) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - struct wined3d_resource *sub_resource; - - TRACE("iface %p, level %u, volume %p.\n", iface, level, volume); - - wined3d_mutex_lock(); - if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) - { - wined3d_mutex_unlock(); - return D3DERR_INVALIDCALL; - } - - *volume = wined3d_resource_get_parent(sub_resource); - IDirect3DVolume9_AddRef(*volume); - wined3d_mutex_unlock(); - - return D3D_OK; -} - -static HRESULT WINAPI d3d9_texture_3d_LockBox(IDirect3DVolumeTexture9 *iface, - UINT level, D3DLOCKED_BOX *locked_box, const D3DBOX *box, DWORD flags) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - struct wined3d_resource *sub_resource; - HRESULT hr; - - TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n", - iface, level, locked_box, box, flags); - - wined3d_mutex_lock(); - if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) - hr = D3DERR_INVALIDCALL; - else - hr = IDirect3DVolume9_LockBox((IDirect3DVolume9 *)wined3d_resource_get_parent(sub_resource), - locked_box, box, flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI d3d9_texture_3d_UnlockBox(IDirect3DVolumeTexture9 *iface, UINT level) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - struct wined3d_resource *sub_resource; - HRESULT hr; - - TRACE("iface %p, level %u.\n", iface, level); - - wined3d_mutex_lock(); - if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level))) - hr = D3DERR_INVALIDCALL; - else - hr = IDirect3DVolume9_UnlockBox((IDirect3DVolume9 *)wined3d_resource_get_parent(sub_resource)); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI d3d9_texture_3d_AddDirtyBox(IDirect3DVolumeTexture9 *iface, const D3DBOX *dirty_box) -{ - struct d3d9_texture *texture = impl_from_IDirect3DVolumeTexture9(iface); - HRESULT hr; - - TRACE("iface %p, dirty_box %p.\n", iface, dirty_box); - - wined3d_mutex_lock(); - hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const struct wined3d_box *)dirty_box); - wined3d_mutex_unlock(); - - return hr; -} - - -static const IDirect3DVolumeTexture9Vtbl d3d9_texture_3d_vtbl = -{ - /* IUnknown */ - d3d9_texture_3d_QueryInterface, - d3d9_texture_3d_AddRef, - d3d9_texture_3d_Release, - /* IDirect3DResource9 */ - d3d9_texture_3d_GetDevice, - d3d9_texture_3d_SetPrivateData, - d3d9_texture_3d_GetPrivateData, - d3d9_texture_3d_FreePrivateData, - d3d9_texture_3d_SetPriority, - d3d9_texture_3d_GetPriority, - d3d9_texture_3d_PreLoad, - d3d9_texture_3d_GetType, - /* IDirect3DBaseTexture9 */ - d3d9_texture_3d_SetLOD, - d3d9_texture_3d_GetLOD, - d3d9_texture_3d_GetLevelCount, - d3d9_texture_3d_SetAutoGenFilterType, - d3d9_texture_3d_GetAutoGenFilterType, - d3d9_texture_3d_GenerateMipSubLevels, - /* IDirect3DVolumeTexture9 */ - d3d9_texture_3d_GetLevelDesc, - d3d9_texture_3d_GetVolumeLevel, - d3d9_texture_3d_LockBox, - d3d9_texture_3d_UnlockBox, - d3d9_texture_3d_AddDirtyBox, -}; - -static void STDMETHODCALLTYPE volumetexture_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d9_volumetexture_wined3d_parent_ops = -{ - volumetexture_wined3d_object_destroyed, -}; - -HRESULT volumetexture_init(struct d3d9_texture *texture, IDirect3DDevice9Impl *device, - UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) -{ - HRESULT hr; - - texture->IDirect3DBaseTexture9_iface.lpVtbl = (const IDirect3DBaseTexture9Vtbl *)&d3d9_texture_3d_vtbl; - texture->refcount = 1; - - wined3d_mutex_lock(); - hr = wined3d_texture_create_3d(device->wined3d_device, width, height, depth, levels, - usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, - &d3d9_volumetexture_wined3d_parent_ops, &texture->wined3d_texture); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); - return hr; - } - - texture->parent_device = &device->IDirect3DDevice9Ex_iface; - IDirect3DDevice9Ex_AddRef(texture->parent_device); - - return D3D_OK; -} -- 2.11.4.GIT