From f18cb4c2f45878c40bbc27f826c4d97ddba304a0 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Wed, 30 Jun 2010 11:40:29 +0300 Subject: [PATCH] ddraw: Grow index buffer as needed. --- dlls/ddraw/device.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index aba7bdc5b99..6b00d4f4f26 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,37 @@ 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 = max(desc.Size * 2, IndexCount * sizeof(WORD)); + IWineD3DBuffer *buffer; + IUnknown *parent; + + 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 = (IUnknown *)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 +4363,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);