From 5b7b4f59d28a12148db9dc9a8f28e66bcaf3a6ba Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 16 Sep 2009 08:37:22 +0200 Subject: [PATCH] d3d9: Add a separate function for volume texture initialization. --- dlls/d3d9/d3d9_private.h | 6 ++--- dlls/d3d9/device.c | 34 ++++++++++++++++++++++++ dlls/d3d9/volumetexture.c | 54 ++++++++++++--------------------------- 3 files changed, 54 insertions(+), 40 deletions(-) diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index 793e5b10095..9158590988c 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -200,9 +200,6 @@ extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(IDirect3DDevice9Ex extern HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(IDirect3DDevice9Ex *iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9 **ppTexture, HANDLE *pSharedHandle) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(IDirect3DDevice9Ex *iface, - UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, - D3DPOOL Pool, IDirect3DVolumeTexture9 **ppVolumeTexture, HANDLE *pSharedHandle) DECLSPEC_HIDDEN; extern HRESULT WINAPI IDirect3DDevice9Impl_CreateCubeTexture(IDirect3DDevice9Ex *iface, UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture9 **ppCubeTexture, HANDLE *pSharedHandle) DECLSPEC_HIDDEN; @@ -465,6 +462,9 @@ typedef struct IDirect3DVolumeTexture9Impl LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DVolumeTexture9Impl; +HRESULT volumetexture_init(IDirect3DVolumeTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* ----------------------- */ /* IDirect3DStateBlock9 */ /* ----------------------- */ diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index cdd46a1f751..2137e1fc09c 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -644,6 +644,40 @@ static void WINAPI IDirect3DDevice9Impl_GetGammaRamp(LPDIRECT3DDEVICE9EX iface, wined3d_mutex_unlock(); } +static HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(IDirect3DDevice9Ex *iface, + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, + D3DPOOL pool, IDirect3DVolumeTexture9 **texture, HANDLE *shared_handle) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DVolumeTexture9Impl *object; + HRESULT hr; + + TRACE("iface %p, width %u, height %u, depth %u, levels %u\n", + iface, width, height, depth, levels); + TRACE("usage %#x, format %#x, pool %#x, texture %p, shared_handle %p.\n", + usage, format, pool, texture, shared_handle); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate volume texture memory.\n"); + return D3DERR_OUTOFVIDEOMEMORY; + } + + hr = volumetexture_init(object, This, width, height, depth, levels, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize volume texture, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created volume texture %p.\n", object); + *texture = (IDirect3DVolumeTexture9 *)object; + + return D3D_OK; +} + static HRESULT IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface9 **ppSurface, UINT Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality) diff --git a/dlls/d3d9/volumetexture.c b/dlls/d3d9/volumetexture.c index 8980663c49d..cc4a6986228 100644 --- a/dlls/d3d9/volumetexture.c +++ b/dlls/d3d9/volumetexture.c @@ -403,47 +403,27 @@ static const IDirect3DVolumeTexture9Vtbl Direct3DVolumeTexture9_Vtbl = IDirect3DVolumeTexture9Impl_AddDirtyBox }; - -/* IDirect3DDevice9 IDirect3DVolumeTexture9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(IDirect3DDevice9Ex *iface, - UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, - D3DPOOL Pool, IDirect3DVolumeTexture9 **ppVolumeTexture, HANDLE *pSharedHandle) +HRESULT volumetexture_init(IDirect3DVolumeTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) { - IDirect3DVolumeTexture9Impl *object; - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hrc = D3D_OK; + HRESULT hr; - TRACE("(%p) Relay\n", This); - - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolumeTexture9Impl)); - if (NULL == object) { - ERR("(%p) allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n", This); - return D3DERR_OUTOFVIDEOMEMORY; - } - - object->lpVtbl = &Direct3DVolumeTexture9_Vtbl; - object->ref = 1; + texture->lpVtbl = &Direct3DVolumeTexture9_Vtbl; + texture->ref = 1; wined3d_mutex_lock(); - - hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels, - Usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(Format), - Pool, &object->wineD3DVolumeTexture, (IUnknown *)object); - + hr = IWineD3DDevice_CreateVolumeTexture(device->WineD3DDevice, width, height, depth, levels, + usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), + pool, &texture->wineD3DVolumeTexture, (IUnknown *)texture); wined3d_mutex_unlock(); - - if (hrc != D3D_OK) { - - /* free up object */ - WARN("(%p) call to IWineD3DDevice_CreateVolumeTexture failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE9) object; - TRACE("(%p) : Created volume texture %p\n", This, object); + if (FAILED(hr)) + { + WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); + return hr; } - TRACE("(%p) returning %p\n", This , *ppVolumeTexture); - return hrc; + + texture->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(texture->parentDevice); + + return D3D_OK; }