[PATCH] [try 4] ddraw: Grow indexbuffer as needed
Mikko Rasa
tdb at tdb.fi
Thu Jun 24 04:54:49 CDT 2010
---
dlls/ddraw/device.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 47 insertions(+), 1 deletions(-)
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index aba7bdc..56274b9 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,52 @@ 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))
+ {
+ UINT size = desc.Size;
+ IWineD3DBuffer *buffer;
+ IUnknown *parent;
+
+ while(size < IndexCount * sizeof(WORD))
+ {
+ size <<= 1;
+ /* We keep adding zero bits to the right, so an overflow
+ * will eventually result in all zeroes. Detect this to
+ * avoid infinite loop.
+ */
+ if(!size)
+ {
+ ERR("UINT overflow while trying to grow indexbuffer to hold %u indices\n", IndexCount);
+ LeaveCriticalSection(&ddraw_cs);
+ return D3DERR_TOOMANYPRIMITIVES;
+ }
+ }
+
+ 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 +4378,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