Module: wine Branch: master Commit: 0201ddf2643970c77d72d3c1da827cea6929e0c0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0201ddf2643970c77d72d3c1da...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Thu Sep 17 23:03:30 2009 +0200
d3d8: Add a separate function for index buffer initialization.
---
dlls/d3d8/d3d8_private.h | 8 ++---- dlls/d3d8/device.c | 49 +++++++++++++++++++-------------------------- dlls/d3d8/indexbuffer.c | 28 ++++++++++++++++++++++++- 3 files changed, 50 insertions(+), 35 deletions(-)
diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index 3125942..bb035d1 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -346,11 +346,6 @@ struct IDirect3DVertexBuffer8Impl /* --------------------- */
/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl DECLSPEC_HIDDEN; - -/***************************************************************************** * IDirect3DIndexBuffer8 implementation structure */ struct IDirect3DIndexBuffer8Impl @@ -368,6 +363,9 @@ struct IDirect3DIndexBuffer8Impl WINED3DFORMAT format; };
+HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* --------------------- */ /* IDirect3DBaseTexture8 */ /* --------------------- */ diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index a3a58db..3356d4f 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -787,42 +787,35 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 return hrc; }
-static HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer8** ppIndexBuffer) { - IDirect3DIndexBuffer8Impl *object; +static HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(IDirect3DDevice8 *iface, UINT size, DWORD usage, + D3DFORMAT format, D3DPOOL pool, IDirect3DIndexBuffer8 **buffer) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hrc = D3D_OK; + IDirect3DIndexBuffer8Impl *object; + HRESULT hr; + + TRACE("iface %p, size %u, usage %#x, format %#x, pool %#x, buffer %p.\n", + iface, size, usage, format, pool, buffer);
- TRACE("(%p) Relay\n", This); - /* Allocate the storage for the device */ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (NULL == object) { - FIXME("Allocation of memory failed\n"); - *ppIndexBuffer = NULL; + if (!object) + { + ERR("Failed to allocate buffer memory.\n"); return D3DERR_OUTOFVIDEOMEMORY; }
- object->lpVtbl = &Direct3DIndexBuffer8_Vtbl; - object->ref = 1; - object->format = wined3dformat_from_d3dformat(Format); - TRACE("Calling wined3d create index buffer\n"); - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage & WINED3DUSAGE_MASK, - (WINED3DPOOL)Pool, &object->wineD3DIndexBuffer, (IUnknown *)object); - wined3d_mutex_unlock(); - - if (D3D_OK != hrc) { - - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateIndexBuffer failed\n", This); + hr = indexbuffer_init(object, This, size, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize index buffer, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *ppIndexBuffer = NULL; - } else { - IUnknown_AddRef(iface); - object->parentDevice = iface; - *ppIndexBuffer = (LPDIRECT3DINDEXBUFFER8)object; + return hr; } - return hrc; + + TRACE("Created index buffer %p.\n", object); + *buffer = (IDirect3DIndexBuffer8 *)object; + + return D3D_OK; }
static HRESULT IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, diff --git a/dlls/d3d8/indexbuffer.c b/dlls/d3d8/indexbuffer.c index b59b1ab..dba6819 100644 --- a/dlls/d3d8/indexbuffer.c +++ b/dlls/d3d8/indexbuffer.c @@ -207,8 +207,7 @@ static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetDesc(LPDIRECT3DINDEXBUFFER8 i return hr; }
- -const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl = +static const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl = { /* IUnknown */ IDirect3DIndexBuffer8Impl_QueryInterface, @@ -228,3 +227,28 @@ const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl = IDirect3DIndexBuffer8Impl_Unlock, IDirect3DIndexBuffer8Impl_GetDesc }; + +HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &Direct3DIndexBuffer8_Vtbl; + buffer->ref = 1; + buffer->format = wined3dformat_from_d3dformat(format); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateIndexBuffer(device->WineD3DDevice, size, usage & WINED3DUSAGE_MASK, + (WINED3DPOOL)pool, &buffer->wineD3DIndexBuffer, (IUnknown *)buffer); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d buffer, hr %#x.\n", hr); + return hr; + } + + buffer->parentDevice = (IDirect3DDevice8 *)device; + IUnknown_AddRef(buffer->parentDevice); + + return D3D_OK; +}