From 76c61cf536f757d82a0b871b4c7c6146e5004e3b Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Thu, 17 Sep 2009 12:35:30 +0200 Subject: [PATCH] d3d8: Add a separate function for texture initialization. --- dlls/d3d8/d3d8_private.h | 8 +++---- dlls/d3d8/device.c | 52 +++++++++++++++++----------------------- dlls/d3d8/texture.c | 26 +++++++++++++++++++- 3 files changed, 50 insertions(+), 36 deletions(-) diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index 5d1587eb1b3..31259426720 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -412,11 +412,6 @@ HRESULT cubetexture_init(IDirect3DCubeTexture8Impl *texture, IDirect3DDevice8Imp /* IDirect3DTexture8 */ /* ----------------- */ -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl DECLSPEC_HIDDEN; - /***************************************************************************** * IDirect3DTexture8 implementation structure */ @@ -433,6 +428,9 @@ struct IDirect3DTexture8Impl LPDIRECT3DDEVICE8 parentDevice; }; +HRESULT texture_init(IDirect3DTexture8Impl *texture, IDirect3DDevice8Impl *device, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* ----------------------- */ /* IDirect3DVolumeTexture8 */ /* ----------------------- */ diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index f7c56dbd69a..a3a58db78e5 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -654,44 +654,36 @@ static void WINAPI IDirect3DDevice8Impl_GetGammaRamp(LPDIRECT3DDEVICE8 iface, D3 wined3d_mutex_unlock(); } -static HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, - D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture8 **ppTexture) { - IDirect3DTexture8Impl *object; +static HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(IDirect3DDevice8 *iface, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, + D3DPOOL pool, IDirect3DTexture8 **texture) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hrc = D3D_OK; + IDirect3DTexture8Impl *object; + HRESULT hr; - TRACE("(%p) : W(%d) H(%d), Lvl(%d) d(%d), Fmt(%u), Pool(%d)\n", This, Width, Height, Levels, Usage, Format, Pool); + TRACE("iface %p, width %u, height %u, levels %u, usage %#x, format %#x, pool %#x, texture %p.\n", + iface, width, height, levels, usage, format, pool, texture); - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTexture8Impl)); - - if (NULL == object) { - FIXME("Allocation of memory failed\n"); -/* *ppTexture = NULL; */ + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate texture memory.\n"); return D3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &Direct3DTexture8_Vtbl; - object->ref = 1; - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage & WINED3DUSAGE_MASK, - wined3dformat_from_d3dformat(Format), Pool, &object->wineD3DTexture, (IUnknown *)object); - wined3d_mutex_unlock(); - - if (FAILED(hrc)) { - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateTexture failed\n", This); + hr = texture_init(object, This, width, height, levels, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize texture, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); -/* *ppTexture = NULL; */ - } else { - IUnknown_AddRef(iface); - object->parentDevice = iface; - *ppTexture = (LPDIRECT3DTEXTURE8) object; - TRACE("(%p) Created Texture %p, %p\n",This,object,object->wineD3DTexture); - } + return hr; + } - return hrc; + TRACE("Created texture %p.\n", object); + *texture = (IDirect3DTexture8 *)object; + + return D3D_OK; } static HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(IDirect3DDevice8 *iface, diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c index b4c4a5b0f20..25c9f551a5c 100644 --- a/dlls/d3d8/texture.c +++ b/dlls/d3d8/texture.c @@ -285,7 +285,7 @@ static HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(LPDIRECT3DTEXTURE8 ifac return hr; } -const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl = +static const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl = { /* IUnknown */ IDirect3DTexture8Impl_QueryInterface, @@ -311,3 +311,27 @@ const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl = IDirect3DTexture8Impl_UnlockRect, IDirect3DTexture8Impl_AddDirtyRect }; + +HRESULT texture_init(IDirect3DTexture8Impl *texture, IDirect3DDevice8Impl *device, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + texture->lpVtbl = &Direct3DTexture8_Vtbl; + texture->ref = 1; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateTexture(device->WineD3DDevice, width, height, levels, usage & WINED3DUSAGE_MASK, + wined3dformat_from_d3dformat(format), pool, &texture->wineD3DTexture, (IUnknown *)texture); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d texture, hr %#x.\n", hr); + return hr; + } + + texture->parentDevice = (IDirect3DDevice8 *)device; + IDirect3DDevice8_AddRef(texture->parentDevice); + + return D3D_OK; +}