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 HRESULT d3d_vertex_buffer_create_wined3d_buffer(struct d3d_vertex_buffer *buffer, BOOL dynamic, struct wined3d_buffer **wined3d_buffer) { DWORD usage = WINED3DUSAGE_STATICDECL; enum wined3d_pool pool; if (buffer->Caps & D3DVBCAPS_SYSTEMMEMORY) pool = WINED3D_POOL_SYSTEM_MEM; else pool = WINED3D_POOL_DEFAULT; if (buffer->Caps & D3DVBCAPS_WRITEONLY) usage |= WINED3DUSAGE_WRITEONLY; if (dynamic) usage |= WINED3DUSAGE_DYNAMIC; return wined3d_buffer_create_vb(buffer->ddraw->wined3d_device, buffer->size, usage, pool, buffer, &ddraw_null_wined3d_parent_ops, wined3d_buffer); }
HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, UINT size, UINT usage, DWORD fvf, D3DPOOL pool) { HRESULT hr; buffer->IDirect3DVertexBuffer9_iface.lpVtbl = &d3d9_vertexbuffer_vtbl; buffer->ref = 1; buffer->fvf = fvf; wined3d_mutex_lock(); hr = wined3d_buffer_create_vb(device->wined3d_device, size, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, buffer, &d3d9_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 = &device->IDirect3DDevice9Ex_iface; IDirect3DDevice9Ex_AddRef(buffer->parentDevice); return D3D_OK; }
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; }