From: Steve Schnepp steve.schnepp@pwkf.org
--- dlls/ddraw/ddraw_private.h | 1 + dlls/ddraw/device.c | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 325ff22c1ae..8455b157522 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -320,6 +320,7 @@ void *ddraw_get_object(struct ddraw_handle_table *t, DWORD handle, enum ddraw_ha #define D3D_BUFFER_SIZE (2 * 1024 * 1024) /* 2 MiB buffer */
struct d3d_device_buffer { + DWORD fvf; DWORD buffer_indice_count; DWORD buffer_vertex_count; WORD buffer_indices[D3DMAXNUMVERTICES]; diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index ce5709c615f..ed1873d1594 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -7002,7 +7002,6 @@ HRESULT d3d_device_create(struct ddraw *ddraw, const GUID *guid, struct ddraw_su * For now, it only supports : * d3d_device.version == 7 * primitive_type == D3DPT_TRIANGLEFAN - * fvf == 0x2c4 * flags == 0 * vertex_count >= 3 * @@ -7014,7 +7013,6 @@ static HRESULT ddraw_buffer_add_d7(IDirect3DDevice7 *iface, D3DPRIMITIVETYPE pri
if (!TRACE_ON(ddraw_buffer)) return WINED3DERR_NOTAVAILABLE; if (primitive_type != D3DPT_TRIANGLEFAN) return WINED3DERR_NOTAVAILABLE; - if (fvf != 0x2c4) return WINED3DERR_NOTAVAILABLE; if (flags) return WINED3DERR_NOTAVAILABLE;
if (vertex_count < 3) { @@ -7022,6 +7020,18 @@ static HRESULT ddraw_buffer_add_d7(IDirect3DDevice7 *iface, D3DPRIMITIVETYPE pri return WINED3DERR_NOTAVAILABLE; }
+ if (device->ddraw_device_buffer.buffer_vertex_count) { + if (fvf != device->ddraw_device_buffer.fvf) { + /* Not the same fvf as the buffered one. Cannot buffer more of those */ + TRACE_(ddraw_perf)("Buffering failed due to mismatched fvf %ld != buffer.fvf %ld \n", fvf, device->ddraw_device_buffer.fvf); + return WINED3DERR_NOTAVAILABLE; + } + } else { + /* New buffer, setting fvf */ + device->ddraw_device_buffer.fvf = fvf; + } + + /* append all the vertices to the buffer */ memcpy(device->ddraw_device_buffer.buffer_vertices + device->ddraw_device_buffer.buffer_vertex_count * stride, vertices, vertex_count * stride);
@@ -7073,7 +7083,7 @@ static HRESULT ddraw_buffer_flush_d7(IDirect3DDevice7 *iface) { HRESULT ret; const DWORD from_flush_flags = 0xF0F0F0F0; // Using a specific flag to recognise & avoid recursion loops
- ret = d3d_device7_DrawIndexedPrimitive(iface, D3DPT_TRIANGLELIST, 0x2c4, + ret = d3d_device7_DrawIndexedPrimitive(iface, D3DPT_TRIANGLELIST, device->ddraw_device_buffer.fvf, device->ddraw_device_buffer.buffer_vertices, device->ddraw_device_buffer.buffer_vertex_count, device->ddraw_device_buffer.buffer_indices, device->ddraw_device_buffer.buffer_indice_count, from_flush_flags);