Paul Gofman : ddraw: Fix vertex count in d3d_device3_DrawIndexedPrimitiveVB().

Alexandre Julliard julliard at winehq.org
Wed May 8 18:22:47 CDT 2019


Module: wine
Branch: master
Commit: 08d630e250d24d6f0f8c1f6106dff0397b4d058e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=08d630e250d24d6f0f8c1f6106dff0397b4d058e

Author: Paul Gofman <gofmanp at gmail.com>
Date:   Tue May  7 21:57:53 2019 +0300

ddraw: Fix vertex count in d3d_device3_DrawIndexedPrimitiveVB().

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47129
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 054e2dc..18e5854 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -4518,19 +4518,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);
+
+    if (!(stride = get_flexible_vertex_size(vb->fvf)))
+        return D3D_OK;
 
-    return IDirect3DDevice7_DrawIndexedPrimitiveVB(&device->IDirect3DDevice7_iface, PrimitiveType,
-            &vb->IDirect3DVertexBuffer7_iface, 0, IndexCount, Indices, IndexCount, Flags);
+    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 0116106..cb7582c 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -15523,12 +15523,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");
@@ -15557,7 +15561,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);
 
@@ -15572,7 +15576,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);




More information about the wine-cvs mailing list