From 03222a8dadcfaa119ad303b5ec61e1727fe82b8b Mon Sep 17 00:00:00 2001 From: Paul Gofman Date: Tue, 7 May 2019 21:57:53 +0300 Subject: [PATCH] ddraw: Fix vertex count in d3d_device3_DrawIndexedPrimitiveVB(). Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47129 Signed-off-by: Paul Gofman Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard (cherry picked from commit 08d630e250d24d6f0f8c1f6106dff0397b4d058e) Signed-off-by: Michael Stefaniuc --- dlls/ddraw/device.c | 19 ++++++++++++------- dlls/ddraw/tests/ddraw4.c | 10 +++++++--- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 6292a18b7a1..e16a163070d 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -4517,19 +4517,24 @@ static HRESULT WINAPI d3d_device7_DrawIndexedPrimitiveVB_FPUPreserve(IDirect3DDe } static HRESULT WINAPI d3d_device3_DrawIndexedPrimitiveVB(IDirect3DDevice3 *iface, - D3DPRIMITIVETYPE PrimitiveType, IDirect3DVertexBuffer *D3DVertexBuf, WORD *Indices, - DWORD IndexCount, DWORD Flags) + D3DPRIMITIVETYPE primitive_type, IDirect3DVertexBuffer *vertex_buffer, + WORD *indices, DWORD index_count, DWORD flags) { + struct d3d_vertex_buffer *vb = + unsafe_impl_from_IDirect3DVertexBuffer7((IDirect3DVertexBuffer7 *)vertex_buffer); struct d3d_device *device = impl_from_IDirect3DDevice3(iface); - struct d3d_vertex_buffer *vb = unsafe_impl_from_IDirect3DVertexBuffer7((IDirect3DVertexBuffer7 *)D3DVertexBuf); + DWORD stride; TRACE("iface %p, primitive_type %#x, vb %p, indices %p, index_count %u, flags %#x.\n", - iface, PrimitiveType, D3DVertexBuf, Indices, IndexCount, Flags); + iface, primitive_type, vertex_buffer, indices, index_count, flags); - setup_lighting(device, vb->fvf, Flags); + setup_lighting(device, vb->fvf, flags); - return IDirect3DDevice7_DrawIndexedPrimitiveVB(&device->IDirect3DDevice7_iface, PrimitiveType, - &vb->IDirect3DVertexBuffer7_iface, 0, IndexCount, Indices, IndexCount, Flags); + if (!(stride = get_flexible_vertex_size(vb->fvf))) + return D3D_OK; + + return IDirect3DDevice7_DrawIndexedPrimitiveVB(&device->IDirect3DDevice7_iface, primitive_type, + &vb->IDirect3DVertexBuffer7_iface, 0, vb->size / stride, indices, index_count, flags); } /***************************************************************************** diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index f913a4bf108..a42a433fad6 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -15479,12 +15479,16 @@ static void test_sysmem_draw(void) } quad[] = { + {{ 0.0f, 0.0f, 0.0f}, 0x00000000}, + {{ 0.0f, 0.0f, 0.0f}, 0x00000000}, + {{ 0.0f, 0.0f, 0.0f}, 0x00000000}, + {{ 0.0f, 0.0f, 0.0f}, 0x00000000}, {{-1.0f, -1.0f, 0.0f}, 0xffff0000}, {{-1.0f, 1.0f, 0.0f}, 0xff00ff00}, {{ 1.0f, -1.0f, 0.0f}, 0xff0000ff}, {{ 1.0f, 1.0f, 0.0f}, 0xffffffff}, }; - static WORD indices[] = {0, 1, 2, 3}; + static WORD indices[] = {4, 5, 6, 7}; window = create_window(); ok(!!window, "Failed to create a window.\n"); @@ -15511,7 +15515,7 @@ static void test_sysmem_draw(void) vb_desc.dwSize = sizeof(vb_desc); vb_desc.dwCaps = D3DVBCAPS_SYSTEMMEMORY; vb_desc.dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; - vb_desc.dwNumVertices = 4; + vb_desc.dwNumVertices = ARRAY_SIZE(quad); hr = IDirect3D3_CreateVertexBuffer(d3d, &vb_desc, &vb, 0, NULL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -15526,7 +15530,7 @@ static void test_sysmem_draw(void) hr = IDirect3DDevice3_BeginScene(device); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); - hr = IDirect3DDevice3_DrawPrimitiveVB(device, D3DPT_TRIANGLESTRIP, vb, 0, 4, 0); + hr = IDirect3DDevice3_DrawPrimitiveVB(device, D3DPT_TRIANGLESTRIP, vb, 4, 4, 0); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirect3DDevice3_EndScene(device); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);