diff --git a/dlls/d3d8/Makefile.in b/dlls/d3d8/Makefile.in index b77a89c26c3..45a3c8220a3 100644 --- a/dlls/d3d8/Makefile.in +++ b/dlls/d3d8/Makefile.in @@ -7,16 +7,15 @@ IMPORTLIB = d3d8 IMPORTS = dxguid uuid wined3d C_SRCS = \ + buffer.c \ cubetexture.c \ d3d8_main.c \ device.c \ directx.c \ - indexbuffer.c \ shader.c \ surface.c \ swapchain.c \ texture.c \ - vertexbuffer.c \ vertexdeclaration.c \ volume.c \ volumetexture.c diff --git a/dlls/d3d8/buffer.c b/dlls/d3d8/buffer.c new file mode 100644 index 00000000000..513c655e4e8 --- /dev/null +++ b/dlls/d3d8/buffer.c @@ -0,0 +1,557 @@ +/* + * Copyright 2005 Oliver Stieber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "d3d8_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d8); + +static HRESULT WINAPI d3d8_vertexbuffer_QueryInterface(IDirect3DVertexBuffer8 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DVertexBuffer8) + || IsEqualGUID(riid, &IID_IDirect3DResource8) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IUnknown_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d8_vertexbuffer_AddRef(IDirect3DVertexBuffer8 *iface) +{ + IDirect3DVertexBuffer8Impl *buffer = (IDirect3DVertexBuffer8Impl *)iface; + ULONG refcount = InterlockedIncrement(&buffer->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice8_AddRef(buffer->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(buffer->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d8_vertexbuffer_Release(IDirect3DVertexBuffer8 *iface) +{ + IDirect3DVertexBuffer8Impl *buffer = (IDirect3DVertexBuffer8Impl *)iface; + ULONG refcount = InterlockedDecrement(&buffer->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice8 *device = buffer->parentDevice; + + wined3d_mutex_lock(); + IWineD3DBuffer_Release(buffer->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice8_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d8_vertexbuffer_GetDevice(IDirect3DVertexBuffer8 *iface, IDirect3DDevice8 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice8 *)((IDirect3DVertexBuffer8Impl *)iface)->parentDevice; + IDirect3DDevice8_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d8_vertexbuffer_SetPrivateData(IDirect3DVertexBuffer8 *iface, + REFGUID guid, const void *data, DWORD data_size, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", + iface, debugstr_guid(guid), data, data_size, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_SetPrivateData(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, + guid, data, data_size, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_vertexbuffer_GetPrivateData(IDirect3DVertexBuffer8 *iface, + REFGUID guid, void *data, DWORD *data_size) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %p.\n", + iface, debugstr_guid(guid), data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_GetPrivateData(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, + guid, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_vertexbuffer_FreePrivateData(IDirect3DVertexBuffer8 *iface, REFGUID guid) +{ + HRESULT hr; + + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_FreePrivateData(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, guid); + wined3d_mutex_unlock(); + + return hr; +} + +static DWORD WINAPI d3d8_vertexbuffer_SetPriority(IDirect3DVertexBuffer8 *iface, DWORD priority) +{ + DWORD previous; + + TRACE("iface %p, priority %u.\n", iface, priority); + + wined3d_mutex_lock(); + previous = IWineD3DBuffer_SetPriority(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, priority); + wined3d_mutex_unlock(); + + return previous; +} + +static DWORD WINAPI d3d8_vertexbuffer_GetPriority(IDirect3DVertexBuffer8 *iface) +{ + DWORD priority; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + priority = IWineD3DBuffer_GetPriority(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + + return priority; +} + +static void WINAPI d3d8_vertexbuffer_PreLoad(IDirect3DVertexBuffer8 *iface) +{ + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + IWineD3DBuffer_PreLoad(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer); + wined3d_mutex_unlock(); +} + +static D3DRESOURCETYPE WINAPI d3d8_vertexbuffer_GetType(IDirect3DVertexBuffer8 *iface) +{ + TRACE("iface %p.\n", iface); + + return D3DRTYPE_VERTEXBUFFER; +} + +static HRESULT WINAPI d3d8_vertexbuffer_Lock(IDirect3DVertexBuffer8 *iface, + UINT offset, UINT size, BYTE **data, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", + iface, offset, size, data, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Map(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, + offset, size, data, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_vertexbuffer_Unlock(IDirect3DVertexBuffer8 *iface) +{ + HRESULT hr; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Unmap(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_vertexbuffer_GetDesc(IDirect3DVertexBuffer8 *iface, D3DVERTEXBUFFER_DESC *desc) +{ + IDirect3DVertexBuffer8Impl *buffer = (IDirect3DVertexBuffer8Impl *)iface; + WINED3DBUFFER_DESC wined3d_desc; + HRESULT hr; + + TRACE("iface %p, desc %p.\n", iface, desc); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_GetDesc(buffer->wineD3DVertexBuffer, &wined3d_desc); + wined3d_mutex_unlock(); + + if (SUCCEEDED(hr)) + { + desc->Type = D3DRTYPE_VERTEXBUFFER; + desc->Usage = wined3d_desc.Usage; + desc->Pool = wined3d_desc.Pool; + desc->Size = wined3d_desc.Size; + desc->FVF = buffer->fvf; + desc->Format = D3DFMT_VERTEXDATA; + } + + return hr; +} + +static const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = +{ + /* IUnknown */ + d3d8_vertexbuffer_QueryInterface, + d3d8_vertexbuffer_AddRef, + d3d8_vertexbuffer_Release, + /* IDirect3DResource8 */ + d3d8_vertexbuffer_GetDevice, + d3d8_vertexbuffer_SetPrivateData, + d3d8_vertexbuffer_GetPrivateData, + d3d8_vertexbuffer_FreePrivateData, + d3d8_vertexbuffer_SetPriority, + d3d8_vertexbuffer_GetPriority, + d3d8_vertexbuffer_PreLoad, + d3d8_vertexbuffer_GetType, + /* IDirect3DVertexBuffer8 */ + d3d8_vertexbuffer_Lock, + d3d8_vertexbuffer_Unlock, + d3d8_vertexbuffer_GetDesc, +}; + +static void STDMETHODCALLTYPE d3d8_vertexbuffer_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_vertexbuffer_wined3d_parent_ops = +{ + d3d8_vertexbuffer_wined3d_object_destroyed, +}; + +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, + (WINED3DPOOL)pool, buffer, &d3d8_vertexbuffer_wined3d_parent_ops, &buffer->wineD3DVertexBuffer); + 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; +} + +static HRESULT WINAPI d3d8_indexbuffer_QueryInterface(IDirect3DIndexBuffer8 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DIndexBuffer8) + || IsEqualGUID(riid, &IID_IDirect3DResource8) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IUnknown_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d8_indexbuffer_AddRef(IDirect3DIndexBuffer8 *iface) +{ + IDirect3DIndexBuffer8Impl *buffer = (IDirect3DIndexBuffer8Impl *)iface; + ULONG refcount = InterlockedIncrement(&buffer->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice8_AddRef(buffer->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(buffer->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d8_indexbuffer_Release(IDirect3DIndexBuffer8 *iface) +{ + IDirect3DIndexBuffer8Impl *buffer = (IDirect3DIndexBuffer8Impl *)iface; + ULONG refcount = InterlockedDecrement(&buffer->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice8 *device = buffer->parentDevice; + + wined3d_mutex_lock(); + IWineD3DBuffer_Release(buffer->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice8_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d8_indexbuffer_GetDevice(IDirect3DIndexBuffer8 *iface, IDirect3DDevice8 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice8 *)((IDirect3DIndexBuffer8Impl *)iface)->parentDevice; + IDirect3DDevice8_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d8_indexbuffer_SetPrivateData(IDirect3DIndexBuffer8 *iface, + REFGUID guid, const void *data, DWORD data_size, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", + iface, debugstr_guid(guid), data, data_size, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_SetPrivateData(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, + guid, data, data_size, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_indexbuffer_GetPrivateData(IDirect3DIndexBuffer8 *iface, + REFGUID guid, void *data, DWORD *data_size) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %p.\n", + iface, debugstr_guid(guid), data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_GetPrivateData(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, + guid, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_indexbuffer_FreePrivateData(IDirect3DIndexBuffer8 *iface, REFGUID guid) +{ + HRESULT hr; + + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_FreePrivateData(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, guid); + wined3d_mutex_unlock(); + + return hr; +} + +static DWORD WINAPI d3d8_indexbuffer_SetPriority(IDirect3DIndexBuffer8 *iface, DWORD priority) +{ + DWORD previous; + + TRACE("iface %p, priority %u.\n", iface, priority); + + wined3d_mutex_lock(); + previous = IWineD3DBuffer_SetPriority(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, priority); + wined3d_mutex_unlock(); + + return previous; +} + +static DWORD WINAPI d3d8_indexbuffer_GetPriority(IDirect3DIndexBuffer8 *iface) +{ + DWORD priority; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + priority = IWineD3DBuffer_GetPriority(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + + return priority; +} + +static void WINAPI d3d8_indexbuffer_PreLoad(IDirect3DIndexBuffer8 *iface) +{ + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + IWineD3DBuffer_PreLoad(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer); + wined3d_mutex_unlock(); +} + +static D3DRESOURCETYPE WINAPI d3d8_indexbuffer_GetType(IDirect3DIndexBuffer8 *iface) +{ + TRACE("iface %p.\n", iface); + + return D3DRTYPE_INDEXBUFFER; +} + +static HRESULT WINAPI d3d8_indexbuffer_Lock(IDirect3DIndexBuffer8 *iface, + UINT offset, UINT size, BYTE **data, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", + iface, offset, size, data, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Map(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, + offset, size, data, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_indexbuffer_Unlock(IDirect3DIndexBuffer8 *iface) +{ + HRESULT hr; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Unmap(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_indexbuffer_GetDesc(IDirect3DIndexBuffer8 *iface, D3DINDEXBUFFER_DESC *desc) +{ + IDirect3DIndexBuffer8Impl *buffer = (IDirect3DIndexBuffer8Impl *)iface; + HRESULT hr; + WINED3DBUFFER_DESC wined3d_desc; + + TRACE("iface %p, desc %p.\n", iface, desc); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_GetDesc(buffer->wineD3DIndexBuffer, &wined3d_desc); + wined3d_mutex_unlock(); + + if (SUCCEEDED(hr)) + { + desc->Format = d3dformat_from_wined3dformat(buffer->format); + desc->Type = D3DRTYPE_INDEXBUFFER; + desc->Usage = wined3d_desc.Usage; + desc->Pool = wined3d_desc.Pool; + desc->Size = wined3d_desc.Size; + } + + return hr; +} + +static const IDirect3DIndexBuffer8Vtbl d3d8_indexbuffer_vtbl = +{ + /* IUnknown */ + d3d8_indexbuffer_QueryInterface, + d3d8_indexbuffer_AddRef, + d3d8_indexbuffer_Release, + /* IDirect3DResource8 */ + d3d8_indexbuffer_GetDevice, + d3d8_indexbuffer_SetPrivateData, + d3d8_indexbuffer_GetPrivateData, + d3d8_indexbuffer_FreePrivateData, + d3d8_indexbuffer_SetPriority, + d3d8_indexbuffer_GetPriority, + d3d8_indexbuffer_PreLoad, + d3d8_indexbuffer_GetType, + /* IDirect3DIndexBuffer8 */ + d3d8_indexbuffer_Lock, + d3d8_indexbuffer_Unlock, + d3d8_indexbuffer_GetDesc, +}; + +static void STDMETHODCALLTYPE d3d8_indexbuffer_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_indexbuffer_wined3d_parent_ops = +{ + d3d8_indexbuffer_wined3d_object_destroyed, +}; + +HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &d3d8_indexbuffer_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, &d3d8_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer); + 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; +} diff --git a/dlls/d3d8/indexbuffer.c b/dlls/d3d8/indexbuffer.c deleted file mode 100644 index 0e0b42d3d53..00000000000 --- a/dlls/d3d8/indexbuffer.c +++ /dev/null @@ -1,284 +0,0 @@ -/* - * IDirect3DIndexBuffer8 implementation - * - * Copyright 2005 Oliver Stieber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d8_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d8); - -/* IDirect3DIndexBuffer8 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_QueryInterface(LPDIRECT3DINDEXBUFFER8 iface, REFIID riid, LPVOID *ppobj) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DResource8) - || IsEqualGUID(riid, &IID_IDirect3DIndexBuffer8)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DIndexBuffer8Impl_AddRef(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice8_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DBuffer_AddRef(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DIndexBuffer8Impl_Release(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice8 *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DBuffer_Release(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice8_Release(parentDevice); - } - return ref; -} - -/* IDirect3DIndexBuffer8 IDirect3DResource8 Interface follow: */ -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetDevice(IDirect3DIndexBuffer8 *iface, IDirect3DDevice8 **device) -{ - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice8 *)This->parentDevice; - IDirect3DDevice8_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_SetPrivateData(LPDIRECT3DINDEXBUFFER8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", - iface, debugstr_guid(refguid), pData, SizeOfData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_SetPrivateData(This->wineD3DIndexBuffer, refguid, pData, SizeOfData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetPrivateData(LPDIRECT3DINDEXBUFFER8 iface, REFGUID refguid, void *pData, DWORD *pSizeOfData) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %p.\n", - iface, debugstr_guid(refguid), pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetPrivateData(This->wineD3DIndexBuffer, refguid, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_FreePrivateData(LPDIRECT3DINDEXBUFFER8 iface, REFGUID refguid) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid)); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_FreePrivateData(This->wineD3DIndexBuffer, refguid); - wined3d_mutex_unlock(); - - return hr; -} - -static DWORD WINAPI IDirect3DIndexBuffer8Impl_SetPriority(LPDIRECT3DINDEXBUFFER8 iface, DWORD PriorityNew) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - DWORD ret; - - TRACE("iface %p, priority %u.\n", iface, PriorityNew); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_SetPriority(This->wineD3DIndexBuffer, PriorityNew); - wined3d_mutex_unlock(); - - return ret; -} - -static DWORD WINAPI IDirect3DIndexBuffer8Impl_GetPriority(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - DWORD ret; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_GetPriority(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - - return ret; -} - -static void WINAPI IDirect3DIndexBuffer8Impl_PreLoad(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - IWineD3DBuffer_PreLoad(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); -} - -static D3DRESOURCETYPE WINAPI IDirect3DIndexBuffer8Impl_GetType(IDirect3DIndexBuffer8 *iface) -{ - TRACE("iface %p.\n", iface); - - return D3DRTYPE_INDEXBUFFER; -} - -/* IDirect3DIndexBuffer8 Interface follow: */ -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_Lock(LPDIRECT3DINDEXBUFFER8 iface, UINT OffsetToLock, UINT SizeToLock, BYTE **ppbData, DWORD Flags) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", - iface, OffsetToLock, SizeToLock, ppbData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Map(This->wineD3DIndexBuffer, OffsetToLock, SizeToLock, ppbData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_Unlock(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Unmap(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetDesc(LPDIRECT3DINDEXBUFFER8 iface, D3DINDEXBUFFER_DESC *pDesc) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - WINED3DBUFFER_DESC desc; - - TRACE("iface %p, desc %p.\n", iface, pDesc); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetDesc(This->wineD3DIndexBuffer, &desc); - wined3d_mutex_unlock(); - - if (SUCCEEDED(hr)) { - pDesc->Format = d3dformat_from_wined3dformat(This->format); - pDesc->Type = D3DRTYPE_INDEXBUFFER; - pDesc->Usage = desc.Usage; - pDesc->Pool = desc.Pool; - pDesc->Size = desc.Size; - } - - return hr; -} - -static const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl = -{ - /* IUnknown */ - IDirect3DIndexBuffer8Impl_QueryInterface, - IDirect3DIndexBuffer8Impl_AddRef, - IDirect3DIndexBuffer8Impl_Release, - /* IDirect3DResource8 */ - IDirect3DIndexBuffer8Impl_GetDevice, - IDirect3DIndexBuffer8Impl_SetPrivateData, - IDirect3DIndexBuffer8Impl_GetPrivateData, - IDirect3DIndexBuffer8Impl_FreePrivateData, - IDirect3DIndexBuffer8Impl_SetPriority, - IDirect3DIndexBuffer8Impl_GetPriority, - IDirect3DIndexBuffer8Impl_PreLoad, - IDirect3DIndexBuffer8Impl_GetType, - /* IDirect3DIndexBuffer8 */ - IDirect3DIndexBuffer8Impl_Lock, - IDirect3DIndexBuffer8Impl_Unlock, - IDirect3DIndexBuffer8Impl_GetDesc -}; - -static void STDMETHODCALLTYPE d3d8_indexbuffer_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d8_indexbuffer_wined3d_parent_ops = -{ - d3d8_indexbuffer_wined3d_object_destroyed, -}; - -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, &d3d8_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer); - 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; -} diff --git a/dlls/d3d8/vertexbuffer.c b/dlls/d3d8/vertexbuffer.c deleted file mode 100644 index eec89f7c79e..00000000000 --- a/dlls/d3d8/vertexbuffer.c +++ /dev/null @@ -1,287 +0,0 @@ -/* - * IDirect3DVertexBuffer8 implementation - * - * Copyright 2005 Oliver Stieber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d8_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d8); - -/* IDirect3DVertexBuffer8 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_QueryInterface(LPDIRECT3DVERTEXBUFFER8 iface, REFIID riid, LPVOID *ppobj) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DResource8) - || IsEqualGUID(riid, &IID_IDirect3DVertexBuffer8)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DVertexBuffer8Impl_AddRef(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice8_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DBuffer_AddRef(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DVertexBuffer8Impl_Release(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice8 *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DBuffer_Release(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice8_Release(parentDevice); - } - - return ref; -} - -/* IDirect3DVertexBuffer8 IDirect3DResource8 Interface follow: */ -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetDevice(IDirect3DVertexBuffer8 *iface, IDirect3DDevice8 **device) -{ - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice8 *)This->parentDevice; - IDirect3DDevice8_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_SetPrivateData(LPDIRECT3DVERTEXBUFFER8 iface, REFGUID refguid, CONST void *pData, DWORD SizeOfData, DWORD Flags) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", - iface, debugstr_guid(refguid), pData, SizeOfData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_SetPrivateData(This->wineD3DVertexBuffer, refguid, pData, SizeOfData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetPrivateData(LPDIRECT3DVERTEXBUFFER8 iface, REFGUID refguid, void *pData, DWORD *pSizeOfData) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %p.\n", - iface, debugstr_guid(refguid), pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetPrivateData(This->wineD3DVertexBuffer, refguid, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_FreePrivateData(LPDIRECT3DVERTEXBUFFER8 iface, REFGUID refguid) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid)); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_FreePrivateData(This->wineD3DVertexBuffer, refguid); - wined3d_mutex_unlock(); - - return hr; -} - -static DWORD WINAPI IDirect3DVertexBuffer8Impl_SetPriority(LPDIRECT3DVERTEXBUFFER8 iface, DWORD PriorityNew) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - DWORD ret; - - TRACE("iface %p, priority %u.\n", iface, PriorityNew); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_SetPriority(This->wineD3DVertexBuffer, PriorityNew); - wined3d_mutex_unlock(); - - return ret; -} - -static DWORD WINAPI IDirect3DVertexBuffer8Impl_GetPriority(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - DWORD ret; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_GetPriority(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - - return ret; -} - -static void WINAPI IDirect3DVertexBuffer8Impl_PreLoad(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - IWineD3DBuffer_PreLoad(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); -} - -static D3DRESOURCETYPE WINAPI IDirect3DVertexBuffer8Impl_GetType(IDirect3DVertexBuffer8 *iface) -{ - TRACE("iface %p.\n", iface); - - return D3DRTYPE_VERTEXBUFFER; -} - -/* IDirect3DVertexBuffer8 Interface follow: */ -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_Lock(LPDIRECT3DVERTEXBUFFER8 iface, UINT OffsetToLock, UINT SizeToLock, BYTE **ppbData, DWORD Flags) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", - iface, OffsetToLock, SizeToLock, ppbData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Map(This->wineD3DVertexBuffer, OffsetToLock, SizeToLock, ppbData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_Unlock(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Unmap(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetDesc(LPDIRECT3DVERTEXBUFFER8 iface, D3DVERTEXBUFFER_DESC *pDesc) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - WINED3DBUFFER_DESC desc; - - TRACE("iface %p, desc %p.\n", iface, pDesc); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetDesc(This->wineD3DVertexBuffer, &desc); - wined3d_mutex_unlock(); - - if (SUCCEEDED(hr)) { - pDesc->Type = D3DRTYPE_VERTEXBUFFER; - pDesc->Usage = desc.Usage; - pDesc->Pool = desc.Pool; - pDesc->Size = desc.Size; - pDesc->FVF = This->fvf; - pDesc->Format = D3DFMT_VERTEXDATA; - } - - return hr; -} - -static const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = -{ - /* IUnknown */ - IDirect3DVertexBuffer8Impl_QueryInterface, - IDirect3DVertexBuffer8Impl_AddRef, - IDirect3DVertexBuffer8Impl_Release, - /* IDirect3DResource8 */ - IDirect3DVertexBuffer8Impl_GetDevice, - IDirect3DVertexBuffer8Impl_SetPrivateData, - IDirect3DVertexBuffer8Impl_GetPrivateData, - IDirect3DVertexBuffer8Impl_FreePrivateData, - IDirect3DVertexBuffer8Impl_SetPriority, - IDirect3DVertexBuffer8Impl_GetPriority, - IDirect3DVertexBuffer8Impl_PreLoad, - IDirect3DVertexBuffer8Impl_GetType, - /* IDirect3DVertexBuffer8 */ - IDirect3DVertexBuffer8Impl_Lock, - IDirect3DVertexBuffer8Impl_Unlock, - IDirect3DVertexBuffer8Impl_GetDesc -}; - -static void STDMETHODCALLTYPE d3d8_vertexbuffer_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d8_vertexbuffer_wined3d_parent_ops = -{ - d3d8_vertexbuffer_wined3d_object_destroyed, -}; - -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, - (WINED3DPOOL)pool, buffer, &d3d8_vertexbuffer_wined3d_parent_ops, &buffer->wineD3DVertexBuffer); - 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; -}