From: Matteo Bruni Subject: [PATCH 5/5] ddraw: Support drawing from D3DVBCAPS_SYSTEMMEMORY vertex buffers. Message-Id: <20181212160958.18212-5-mbruni@codeweavers.com> Date: Wed, 12 Dec 2018 17:09:58 +0100 In-Reply-To: <20181212160958.18212-1-mbruni@codeweavers.com> References: <20181212160958.18212-1-mbruni@codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45279 Signed-off-by: Matteo Bruni --- dlls/ddraw/device.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 0d48c7d704e..6f966d22e77 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -4275,8 +4275,11 @@ static HRESULT d3d_device7_DrawPrimitiveVB(IDirect3DDevice7 *iface, D3DPRIMITIVE { struct d3d_device *device = impl_from_IDirect3DDevice7(iface); struct d3d_vertex_buffer *vb_impl = unsafe_impl_from_IDirect3DVertexBuffer7(vb); - HRESULT hr; + struct wined3d_resource *wined3d_resource; + struct wined3d_map_desc wined3d_map_desc; + struct wined3d_box wined3d_box = {0}; DWORD stride; + HRESULT hr; TRACE("iface %p, primitive_type %#x, vb %p, start_vertex %u, vertex_count %u, flags %#x.\n", iface, primitive_type, vb, start_vertex, vertex_count, flags); @@ -4289,6 +4292,26 @@ static HRESULT d3d_device7_DrawPrimitiveVB(IDirect3DDevice7 *iface, D3DPRIMITIVE stride = get_flexible_vertex_size(vb_impl->fvf); + if (vb_impl->Caps & D3DVBCAPS_SYSTEMMEMORY) + { + TRACE("Drawing from D3DVBCAPS_SYSTEMMEMORY vertex buffer, falling back to DrawPrimitive.\n"); + wined3d_mutex_lock(); + wined3d_resource = wined3d_buffer_get_resource(vb_impl->wined3d_buffer); + wined3d_box.left = start_vertex * stride; + wined3d_box.right = (vertex_count - start_vertex) * stride; + if (FAILED(hr = wined3d_resource_map(wined3d_resource, 0, &wined3d_map_desc, + &wined3d_box, WINED3D_MAP_READ))) + { + wined3d_mutex_unlock(); + return D3DERR_VERTEXBUFFERLOCKED; + } + hr = d3d_device7_DrawPrimitive(iface, primitive_type, vb_impl->fvf, wined3d_map_desc.data, + vertex_count, flags); + wined3d_resource_unmap(wined3d_resource, 0); + wined3d_mutex_unlock(); + return hr; + } + wined3d_mutex_lock(); wined3d_device_set_vertex_declaration(device->wined3d_device, vb_impl->wined3d_declaration); if (FAILED(hr = wined3d_device_set_stream_source(device->wined3d_device, @@ -4366,6 +4389,7 @@ static HRESULT d3d_device7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, struct d3d_device *device = impl_from_IDirect3DDevice7(iface); struct d3d_vertex_buffer *vb_impl = unsafe_impl_from_IDirect3DVertexBuffer7(vb); DWORD stride = get_flexible_vertex_size(vb_impl->fvf); + struct wined3d_resource *wined3d_resource; struct wined3d_map_desc wined3d_map_desc; struct wined3d_box wined3d_box = {0}; struct wined3d_resource *ib; @@ -4382,6 +4406,24 @@ static HRESULT d3d_device7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, return D3D_OK; } + if (vb_impl->Caps & D3DVBCAPS_SYSTEMMEMORY) + { + TRACE("Drawing from D3DVBCAPS_SYSTEMMEMORY vertex buffer, falling back to DrawIndexedPrimitive.\n"); + wined3d_mutex_lock(); + wined3d_resource = wined3d_buffer_get_resource(vb_impl->wined3d_buffer); + if (FAILED(hr = wined3d_resource_map(wined3d_resource, 0, &wined3d_map_desc, + &wined3d_box, WINED3D_MAP_READ))) + { + wined3d_mutex_unlock(); + return D3DERR_VERTEXBUFFERLOCKED; + } + hr = d3d_device7_DrawIndexedPrimitive(iface, primitive_type, vb_impl->fvf, wined3d_map_desc.data, + start_vertex + vertex_count, indices, index_count, flags); + wined3d_resource_unmap(wined3d_resource, 0); + wined3d_mutex_unlock(); + return hr; + } + /* Steps: * 1) Upload the indices to the index buffer * 2) Set the index source -- 2.18.1