[PATCH] ddraw: Grow indexbuffer as needed

Mikko Rasa tdb at tdb.fi
Wed Jun 23 14:09:14 CDT 2010


---
 dlls/ddraw/device.c |   36 +++++++++++++++++++++++++++++++++++-
 1 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index aba7bdc..64be522 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -4299,6 +4299,7 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface,
     DWORD stride = get_flexible_vertex_size(vb->fvf);
     WORD *LockedIndices;
     HRESULT hr;
+    WINED3DBUFFER_DESC desc;
 
     TRACE("(%p)->(%08x,%p,%d,%d,%p,%d,%08x)\n", This, PrimitiveType, vb, StartVertex, NumVertices, Indices, IndexCount, Flags);
 
@@ -4320,6 +4321,40 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface,
         return hr;
     }
 
+    /* check that the buffer is large enough to hold the indices,
+     * reallocate if necessary.
+     */
+    hr = IWineD3DBuffer_GetDesc(This->indexbuffer, &desc);
+    if(desc.Size < IndexCount * sizeof(WORD))
+    {
+        unsigned size = desc.Size;
+        IWineD3DBuffer *buffer;
+        IUnknown *parent;
+
+        while(size < IndexCount * sizeof(WORD))
+            size *= 2;
+
+        TRACE("Growing index buffer to %u bytes\n", size);
+
+        IWineD3DBuffer_GetParent(This->indexbuffer, &parent);
+        hr = IWineD3DDevice_CreateIndexBuffer(This->wineD3DDevice, size,
+                WINED3DUSAGE_DYNAMIC /* Usage */, WINED3DPOOL_DEFAULT, &buffer, parent,
+                &ddraw_null_wined3d_parent_ops);
+        if(hr != D3D_OK)
+        {
+            ERR("(%p) IWineD3DDevice::CreateIndexBuffer failed with hr = %08x\n", This, hr);
+            IParent_Release(parent);
+            LeaveCriticalSection(&ddraw_cs);
+            return hr;
+        }
+
+        IWineD3DBuffer_Release(This->indexbuffer);
+        This->indexbuffer = buffer;
+
+        ((IParentImpl *)parent)->child = buffer;
+        IParent_Release(parent);
+    }
+
     /* copy the index stream into the index buffer.
      * A new IWineD3DDevice method could be created
      * which takes an user pointer containing the indices
@@ -4331,7 +4366,6 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface,
                             IndexCount * sizeof(WORD),
                             (BYTE **) &LockedIndices,
                             0 /* Flags */);
-    assert(IndexCount < 0x100000);
     if(hr != D3D_OK)
     {
         ERR("(%p) IWineD3DBuffer::Map failed with hr = %08x\n", This, hr);
-- 
1.7.1




More information about the wine-patches mailing list