diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index e373af8b4fc..e80d1a2f8ec 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -197,9 +197,6 @@ extern HRESULT WINAPI IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDe extern HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(IDirect3DDevice9Ex *iface, UINT iSwapChain, IDirect3DSwapChain9 **pSwapChain) DECLSPEC_HIDDEN; extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN; -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_CreateVertexBuffer(IDirect3DDevice9Ex *iface, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9 **ppVertexBuffer, HANDLE *pSharedHandle) DECLSPEC_HIDDEN; @@ -441,6 +438,9 @@ typedef struct IDirect3DTexture9Impl LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DTexture9Impl; +HRESULT texture_init(IDirect3DTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* ----------------------- */ /* IDirect3DVolumeTexture9 */ /* ----------------------- */ diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 06cfcee4b24..7ddc0d61855 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -644,6 +644,38 @@ static void WINAPI IDirect3DDevice9Impl_GetGammaRamp(LPDIRECT3DDEVICE9EX iface, wined3d_mutex_unlock(); } +static HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(IDirect3DDevice9Ex *iface, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, + D3DPOOL pool, IDirect3DTexture9 **texture, HANDLE *shared_handle) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DTexture9Impl *object; + HRESULT hr; + + TRACE("iface %p, width %u, height %u, levels %u, usage %#x, format %#x, pool %#x, texture %p, shared_handle %p.\n", + iface, width, height, levels, usage, format, pool, texture, shared_handle); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate texture memory.\n"); + return D3DERR_OUTOFVIDEOMEMORY; + } + + 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); + return hr; + } + + TRACE("Created texture %p.\n", object); + *texture = (IDirect3DTexture9 *)object; + + return D3D_OK; +} + 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) diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c index ea1cde850f5..c3a3232d6ec 100644 --- a/dlls/d3d9/texture.c +++ b/dlls/d3d9/texture.c @@ -350,43 +350,26 @@ static const IDirect3DTexture9Vtbl Direct3DTexture9_Vtbl = IDirect3DTexture9Impl_AddDirtyRect }; +HRESULT texture_init(IDirect3DTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; -/* IDirect3DDevice9 IDirect3DTexture9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, - D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle) { - IDirect3DTexture9Impl *object; - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hrc = D3D_OK; - - TRACE("(%p) : W(%d) H(%d), Lvl(%d) d(%d), Fmt(%#x), Pool(%d)\n", This, Width, Height, Levels, Usage, Format, Pool); - - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTexture9Impl)); - - if (NULL == object) { - ERR("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n"); - return D3DERR_OUTOFVIDEOMEMORY; - } - - object->lpVtbl = &Direct3DTexture9_Vtbl; - object->ref = 1; + texture->lpVtbl = &Direct3DTexture9_Vtbl; + texture->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); + 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(hrc)) + if (FAILED(hr)) { - /* free up object */ - WARN("(%p) call to IWineD3DDevice_CreateTexture failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppTexture= (LPDIRECT3DTEXTURE9) object; - TRACE("(%p) Created Texture %p, %p\n", This, object, object->wineD3DTexture); - } + WARN("Failed to create wined3d texture, hr %#x.\n", hr); + return hr; + } - return hrc; + texture->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(texture->parentDevice); + + return D3D_OK; }