struct d3d_execute_buffer *unsafe_impl_from_IDirect3DExecuteBuffer(IDirect3DExecuteBuffer *iface) { if (!iface) return NULL; assert(iface->lpVtbl == &d3d_execute_buffer_vtbl); return impl_from_IDirect3DExecuteBuffer(iface); }
/***************************************************************************** * IDirect3DExecuteBuffer::AddRef * * A normal AddRef method, nothing special * * Returns: * The new refcount * *****************************************************************************/ static ULONG WINAPI d3d_execute_buffer_AddRef(IDirect3DExecuteBuffer *iface) { struct d3d_execute_buffer *buffer = impl_from_IDirect3DExecuteBuffer(iface); ULONG ref = InterlockedIncrement(&buffer->ref); TRACE("%p increasing refcount to %u.\n", buffer, ref); return ref; }
/***************************************************************************** * IDirect3DExecuteBuffer::AddRef * * A normal AddRef method, nothing special * * Returns: * The new refcount * *****************************************************************************/ static ULONG WINAPI IDirect3DExecuteBufferImpl_AddRef(IDirect3DExecuteBuffer *iface) { IDirect3DExecuteBufferImpl *This = impl_from_IDirect3DExecuteBuffer(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("%p increasing refcount to %u.\n", This, ref); return ref; }
/***************************************************************************** * IDirect3DExecuteBuffer::Lock * * Locks the buffer, so the app can write into it. * * Params: * Desc: Pointer to return the buffer description. This Description contains * a pointer to the buffer data. * * Returns: * This implementation always returns D3D_OK * *****************************************************************************/ static HRESULT WINAPI d3d_execute_buffer_Lock(IDirect3DExecuteBuffer *iface, D3DEXECUTEBUFFERDESC *desc) { struct d3d_execute_buffer *buffer = impl_from_IDirect3DExecuteBuffer(iface); DWORD dwSize; TRACE("iface %p, desc %p.\n", iface, desc); dwSize = desc->dwSize; memcpy(desc, &buffer->desc, dwSize); if (TRACE_ON(ddraw)) { TRACE(" Returning description :\n"); _dump_D3DEXECUTEBUFFERDESC(desc); } return D3D_OK; }
/***************************************************************************** * IDirect3DExecuteBuffer::GetExecuteData * * Returns the data in the execute buffer * * Params: * Data: Pointer to a D3DEXECUTEDATA structure used to return data * * Returns: * D3D_OK on success * *****************************************************************************/ static HRESULT WINAPI d3d_execute_buffer_GetExecuteData(IDirect3DExecuteBuffer *iface, D3DEXECUTEDATA *data) { struct d3d_execute_buffer *buffer = impl_from_IDirect3DExecuteBuffer(iface); DWORD dwSize; TRACE("iface %p, data %p.\n", iface, data); dwSize = data->dwSize; memcpy(data, &buffer->data, dwSize); if (TRACE_ON(ddraw)) { TRACE("Returning data :\n"); _dump_executedata(data); } return DD_OK; }
/***************************************************************************** * IDirect3DExecuteBuffer::Release * * A normal Release method, nothing special * * Returns: * The new refcount * *****************************************************************************/ static ULONG WINAPI d3d_execute_buffer_Release(IDirect3DExecuteBuffer *iface) { struct d3d_execute_buffer *buffer = impl_from_IDirect3DExecuteBuffer(iface); ULONG ref = InterlockedDecrement(&buffer->ref); TRACE("%p decreasing refcount to %u.\n", buffer, ref); if (!ref) { if (buffer->need_free) HeapFree(GetProcessHeap(), 0, buffer->desc.lpData); HeapFree(GetProcessHeap(), 0, buffer->vertex_data); HeapFree(GetProcessHeap(), 0, buffer->indices); HeapFree(GetProcessHeap(), 0, buffer); } return ref; }
/***************************************************************************** * IDirect3DExecuteBuffer::Lock * * Locks the buffer, so the app can write into it. * * Params: * Desc: Pointer to return the buffer description. This Description contains * a pointer to the buffer data. * * Returns: * This implementation always returns D3D_OK * *****************************************************************************/ static HRESULT WINAPI IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface, D3DEXECUTEBUFFERDESC *lpDesc) { IDirect3DExecuteBufferImpl *This = impl_from_IDirect3DExecuteBuffer(iface); DWORD dwSize; TRACE("iface %p, desc %p.\n", iface, lpDesc); dwSize = lpDesc->dwSize; memcpy(lpDesc, &This->desc, dwSize); if (TRACE_ON(ddraw)) { TRACE(" Returning description :\n"); _dump_D3DEXECUTEBUFFERDESC(lpDesc); } return D3D_OK; }
/***************************************************************************** * IDirect3DExecuteBuffer::Release * * A normal Release method, nothing special * * Returns: * The new refcount * *****************************************************************************/ static ULONG WINAPI IDirect3DExecuteBufferImpl_Release(IDirect3DExecuteBuffer *iface) { IDirect3DExecuteBufferImpl *This = impl_from_IDirect3DExecuteBuffer(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref) { if (This->need_free) HeapFree(GetProcessHeap(),0,This->desc.lpData); HeapFree(GetProcessHeap(),0,This->vertex_data); HeapFree(GetProcessHeap(),0,This->indices); HeapFree(GetProcessHeap(),0,This); return 0; } return ref; }
/***************************************************************************** * IDirect3DExecuteBuffer::GetExecuteData * * Returns the data in the execute buffer * * Params: * Data: Pointer to a D3DEXECUTEDATA structure used to return data * * Returns: * D3D_OK on success * *****************************************************************************/ static HRESULT WINAPI IDirect3DExecuteBufferImpl_GetExecuteData(IDirect3DExecuteBuffer *iface, D3DEXECUTEDATA *lpData) { IDirect3DExecuteBufferImpl *This = impl_from_IDirect3DExecuteBuffer(iface); DWORD dwSize; TRACE("iface %p, data %p.\n", iface, lpData); dwSize = lpData->dwSize; memcpy(lpData, &This->data, dwSize); if (TRACE_ON(ddraw)) { TRACE("Returning data :\n"); _dump_executedata(lpData); } return DD_OK; }
/***************************************************************************** * IDirect3DExecuteBuffer::SetExecuteData * * Sets the execute data. This data is used to describe the buffer's content * * Params: * Data: Pointer to a D3DEXECUTEDATA structure containing the data to * assign * * Returns: * D3D_OK on success * DDERR_OUTOFMEMORY if the vertex buffer allocation failed * *****************************************************************************/ static HRESULT WINAPI d3d_execute_buffer_SetExecuteData(IDirect3DExecuteBuffer *iface, D3DEXECUTEDATA *data) { struct d3d_execute_buffer *buffer = impl_from_IDirect3DExecuteBuffer(iface); DWORD nbvert; TRACE("iface %p, data %p.\n", iface, data); memcpy(&buffer->data, data, data->dwSize); /* Get the number of vertices in the execute buffer */ nbvert = buffer->data.dwVertexCount; /* Prepares the transformed vertex buffer */ HeapFree(GetProcessHeap(), 0, buffer->vertex_data); buffer->vertex_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nbvert * sizeof(D3DTLVERTEX)); if (TRACE_ON(ddraw)) _dump_executedata(data); return D3D_OK; }