/***************************************************************************** * IDirect3DVertexBuffer7::Lock * * Locks the vertex buffer and returns a pointer to the vertex data * Locking vertex buffers is similar to locking surfaces, because Windows * uses surfaces to store vertex data internally (According to the DX sdk) * * Params: * Flags: Locking flags. Relevant here are DDLOCK_READONLY, DDLOCK_WRITEONLY, * DDLOCK_DISCARDCONTENTS and DDLOCK_NOOVERWRITE. * Data: Returns a pointer to the vertex data * Size: Returns the size of the buffer if not NULL * * Returns: * D3D_OK on success * DDERR_INVALIDPARAMS if Data is NULL * D3DERR_VERTEXBUFFEROPTIMIZED if called on an optimized buffer(WineD3D) * *****************************************************************************/ static HRESULT WINAPI IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface, DWORD Flags, void **Data, DWORD *Size) { ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface); WINED3DVERTEXBUFFER_DESC Desc; HRESULT hr; TRACE("(%p)->(%08x,%p,%p)\n", This, Flags, Data, Size); EnterCriticalSection(&ddraw_cs); if(Size) { /* Get the size, for returning it, and for locking */ hr = IWineD3DVertexBuffer_GetDesc(This->wineD3DVertexBuffer, &Desc); if(hr != D3D_OK) { ERR("(%p) IWineD3DVertexBuffer::GetDesc failed with hr=%08x\n", This, hr); LeaveCriticalSection(&ddraw_cs); return hr; } *Size = Desc.Size; } hr = IWineD3DVertexBuffer_Lock(This->wineD3DVertexBuffer, 0 /* OffsetToLock */, 0 /* SizeToLock, 0 == Full lock */, (BYTE **) Data, Flags); LeaveCriticalSection(&ddraw_cs); return hr; }
/* IDirect3DVertexBuffer9 Interface follow: */ static HRESULT WINAPI IDirect3DVertexBuffer9Impl_Lock(LPDIRECT3DVERTEXBUFFER9 iface, UINT OffsetToLock, UINT SizeToLock, void** ppbData, DWORD Flags) { IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; TRACE("(%p) Relay\n", This); return IWineD3DVertexBuffer_Lock(This->wineD3DVertexBuffer, OffsetToLock, SizeToLock, (BYTE **)ppbData, Flags); }