Module: wine Branch: master Commit: b1bf50d751692e280818e47c88ce7a5fc7973986 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b1bf50d751692e280818e47c88...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Thu Sep 17 23:03:31 2009 +0200
d3d8: Add a separate function for vertex buffer initialization.
---
dlls/d3d8/d3d8_private.h | 8 ++---- dlls/d3d8/device.c | 51 +++++++++++++++++++-------------------------- dlls/d3d8/vertexbuffer.c | 27 +++++++++++++++++++++++- 3 files changed, 51 insertions(+), 35 deletions(-)
diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index bb035d1..86b936a 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -319,11 +319,6 @@ struct IDirect3DResource8Impl /* ---------------------- */
/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl DECLSPEC_HIDDEN; - -/***************************************************************************** * IDirect3DVertexBuffer8 implementation structure */ struct IDirect3DVertexBuffer8Impl @@ -341,6 +336,9 @@ struct IDirect3DVertexBuffer8Impl DWORD fvf; };
+HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) DECLSPEC_HIDDEN; + /* --------------------- */ /* IDirect3DIndexBuffer8 */ /* --------------------- */ diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 3356d4f..688ea0d 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -749,42 +749,35 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(IDirect3DDevice8 *i return hr; }
-static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer) { - IDirect3DVertexBuffer8Impl *object; +static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(IDirect3DDevice8 *iface, UINT size, DWORD usage, + DWORD fvf, D3DPOOL pool, IDirect3DVertexBuffer8 **buffer) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hrc = D3D_OK; + IDirect3DVertexBuffer8Impl *object; + HRESULT hr;
- TRACE("(%p) Relay\n", This); - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVertexBuffer8Impl)); - if (NULL == object) { - FIXME("Allocation of memory failed\n"); - *ppVertexBuffer = NULL; + TRACE("iface %p, size %u, usage %#x, fvf %#x, pool %#x, buffer %p.\n", + iface, size, usage, fvf, pool, buffer); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate buffer memory.\n"); return D3DERR_OUTOFVIDEOMEMORY; }
- object->lpVtbl = &Direct3DVertexBuffer8_Vtbl; - object->ref = 1; - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage & WINED3DUSAGE_MASK, - 0 /* fvf for ddraw only */, (WINED3DPOOL)Pool, &object->wineD3DVertexBuffer, (IUnknown *)object); - wined3d_mutex_unlock(); - - object->fvf = FVF; - - if (D3D_OK != hrc) { - - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateVertexBuffer failed\n", This); + hr = vertexbuffer_init(object, This, size, usage, fvf, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex buffer, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *ppVertexBuffer = NULL; - } else { - IUnknown_AddRef(iface); - object->parentDevice = iface; - *ppVertexBuffer = (LPDIRECT3DVERTEXBUFFER8) object; + return hr; } - return hrc; + + TRACE("Created vertex buffer %p.\n", object); + *buffer = (IDirect3DVertexBuffer8 *)object; + + return D3D_OK; }
static HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(IDirect3DDevice8 *iface, UINT size, DWORD usage, diff --git a/dlls/d3d8/vertexbuffer.c b/dlls/d3d8/vertexbuffer.c index 617aff3..47ae051 100644 --- a/dlls/d3d8/vertexbuffer.c +++ b/dlls/d3d8/vertexbuffer.c @@ -210,7 +210,7 @@ static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetDesc(LPDIRECT3DVERTEXBUFFER8 return hr; }
-const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = +static const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = { /* IUnknown */ IDirect3DVertexBuffer8Impl_QueryInterface, @@ -230,3 +230,28 @@ const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = IDirect3DVertexBuffer8Impl_Unlock, IDirect3DVertexBuffer8Impl_GetDesc }; + +HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &Direct3DVertexBuffer8_Vtbl; + buffer->ref = 1; + buffer->fvf = fvf; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVertexBuffer(device->WineD3DDevice, size, usage & WINED3DUSAGE_MASK, + 0, (WINED3DPOOL)pool, &buffer->wineD3DVertexBuffer, (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; +}