HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **vertex_buf, struct ddraw *ddraw, D3DVERTEXBUFFERDESC *desc) { struct d3d_vertex_buffer *buffer; HRESULT hr = D3D_OK; TRACE("Vertex buffer description:\n"); TRACE(" dwSize %u\n", desc->dwSize); TRACE(" dwCaps %#x\n", desc->dwCaps); TRACE(" FVF %#x\n", desc->dwFVF); TRACE(" dwNumVertices %u\n", desc->dwNumVertices); buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*buffer)); if (!buffer) return DDERR_OUTOFMEMORY; buffer->IDirect3DVertexBuffer7_iface.lpVtbl = &d3d_vertex_buffer7_vtbl; buffer->IDirect3DVertexBuffer_iface.lpVtbl = &d3d_vertex_buffer1_vtbl; buffer->ref = 1; buffer->ddraw = ddraw; buffer->Caps = desc->dwCaps; buffer->fvf = desc->dwFVF; buffer->size = get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices; wined3d_mutex_lock(); hr = d3d_vertex_buffer_create_wined3d_buffer(buffer, FALSE, &buffer->wineD3DVertexBuffer); if (FAILED(hr)) { WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr); if (hr == WINED3DERR_INVALIDCALL) hr = DDERR_INVALIDPARAMS; goto end; } buffer->wineD3DVertexDeclaration = ddraw_find_decl(ddraw, desc->dwFVF); if (!buffer->wineD3DVertexDeclaration) { ERR("Failed to find vertex declaration for fvf %#x.\n", desc->dwFVF); wined3d_buffer_decref(buffer->wineD3DVertexBuffer); hr = DDERR_INVALIDPARAMS; goto end; } wined3d_vertex_declaration_incref(buffer->wineD3DVertexDeclaration); end: wined3d_mutex_unlock(); if (hr == D3D_OK) *vertex_buf = buffer; else HeapFree(GetProcessHeap(), 0, buffer); return hr; }
static ULONG STDMETHODCALLTYPE d3d10_input_layout_AddRef(ID3D10InputLayout *iface) { struct d3d10_input_layout *This = impl_from_ID3D10InputLayout(iface); ULONG refcount = InterlockedIncrement(&This->refcount); TRACE("%p increasing refcount to %u\n", This, refcount); if (refcount == 1) { wined3d_vertex_declaration_incref(This->wined3d_decl); } return refcount; }
HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer, IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc) { DWORD usage; HRESULT hr; buffer->lpVtbl = &d3d_vertex_buffer7_vtbl; buffer->IDirect3DVertexBuffer_vtbl = &d3d_vertex_buffer1_vtbl; buffer->ref = 1; buffer->ddraw = ddraw; buffer->Caps = desc->dwCaps; buffer->fvf = desc->dwFVF; usage = desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0; usage |= WINED3DUSAGE_STATICDECL; EnterCriticalSection(&ddraw_cs); hr = wined3d_buffer_create_vb(ddraw->wined3d_device, get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices, usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3DPOOL_SYSTEMMEM : WINED3DPOOL_DEFAULT, buffer, &ddraw_null_wined3d_parent_ops, &buffer->wineD3DVertexBuffer); if (FAILED(hr)) { WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr); LeaveCriticalSection(&ddraw_cs); if (hr == WINED3DERR_INVALIDCALL) return DDERR_INVALIDPARAMS; else return hr; } buffer->wineD3DVertexDeclaration = ddraw_find_decl(ddraw, desc->dwFVF); if (!buffer->wineD3DVertexDeclaration) { ERR("Failed to find vertex declaration for fvf %#x.\n", desc->dwFVF); wined3d_buffer_decref(buffer->wineD3DVertexBuffer); LeaveCriticalSection(&ddraw_cs); return DDERR_INVALIDPARAMS; } wined3d_vertex_declaration_incref(buffer->wineD3DVertexDeclaration); LeaveCriticalSection(&ddraw_cs); return D3D_OK; }
static ULONG WINAPI IDirect3DVertexDeclaration8Impl_AddRef(IDirect3DVertexDeclaration8 *iface) { IDirect3DVertexDeclaration8Impl *This = (IDirect3DVertexDeclaration8Impl *)iface; ULONG ref_count = InterlockedIncrement(&This->ref_count); TRACE("%p increasing refcount to %u.\n", iface, ref_count); if (ref_count == 1) { wined3d_mutex_lock(); wined3d_vertex_declaration_incref(This->wined3d_vertex_declaration); wined3d_mutex_unlock(); } return ref_count; }
static ULONG STDMETHODCALLTYPE d3d11_input_layout_AddRef(ID3D11InputLayout *iface) { struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface); ULONG refcount = InterlockedIncrement(&layout->refcount); TRACE("%p increasing refcount to %u.\n", layout, refcount); if (refcount == 1) { wined3d_mutex_lock(); wined3d_vertex_declaration_incref(layout->wined3d_decl); wined3d_mutex_unlock(); } return refcount; }
HRESULT d3d_vertex_buffer_create(IDirect3DVertexBufferImpl **vertex_buf, struct ddraw *ddraw, D3DVERTEXBUFFERDESC *desc) { IDirect3DVertexBufferImpl *buffer; DWORD usage; HRESULT hr = D3D_OK; TRACE("Vertex buffer description:\n"); TRACE(" dwSize %u\n", desc->dwSize); TRACE(" dwCaps %#x\n", desc->dwCaps); TRACE(" FVF %#x\n", desc->dwFVF); TRACE(" dwNumVertices %u\n", desc->dwNumVertices); buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*buffer)); if (!buffer) return DDERR_OUTOFMEMORY; buffer->IDirect3DVertexBuffer7_iface.lpVtbl = &d3d_vertex_buffer7_vtbl; buffer->IDirect3DVertexBuffer_iface.lpVtbl = &d3d_vertex_buffer1_vtbl; buffer->ref = 1; buffer->ddraw = ddraw; buffer->Caps = desc->dwCaps; buffer->fvf = desc->dwFVF; usage = desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0; usage |= WINED3DUSAGE_STATICDECL; wined3d_mutex_lock(); hr = wined3d_buffer_create_vb(ddraw->wined3d_device, get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices, usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3D_POOL_SYSTEM_MEM : WINED3D_POOL_DEFAULT, buffer, &ddraw_null_wined3d_parent_ops, &buffer->wineD3DVertexBuffer); if (FAILED(hr)) { WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr); if (hr == WINED3DERR_INVALIDCALL) hr = DDERR_INVALIDPARAMS; goto end; } buffer->wineD3DVertexDeclaration = ddraw_find_decl(ddraw, desc->dwFVF); if (!buffer->wineD3DVertexDeclaration) { ERR("Failed to find vertex declaration for fvf %#x.\n", desc->dwFVF); wined3d_buffer_decref(buffer->wineD3DVertexBuffer); hr = DDERR_INVALIDPARAMS; goto end; } wined3d_vertex_declaration_incref(buffer->wineD3DVertexDeclaration); end: wined3d_mutex_unlock(); if (hr == D3D_OK) *vertex_buf = buffer; else HeapFree(GetProcessHeap(), 0, buffer); return hr; }