From efc03f0a34354a55142b9a8291e47f1c41b89da4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Tue, 20 Feb 2007 22:46:31 +0100 Subject: [PATCH] wined3d: Index buffer fixes. --- dlls/ddraw/device.c | 2 +- dlls/ddraw/direct3d.c | 2 +- dlls/wined3d/device.c | 2 +- dlls/wined3d/indexbuffer.c | 9 +++++++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index c201df7016e..0814921b52a 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -3691,7 +3691,7 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, */ hr = IWineD3DIndexBuffer_Lock(This->indexbuffer, 0 /* OffSetToLock */, - 0 /* SizeToLock - doesn't matter */, + IndexCount * sizeof(WORD), (BYTE **) &LockedIndices, 0 /* Flags */); assert(IndexCount < 0x100000); diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c index 4896ba7d2ac..b716a60755c 100644 --- a/dlls/ddraw/direct3d.c +++ b/dlls/ddraw/direct3d.c @@ -804,7 +804,7 @@ IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface, */ hr = IWineD3DDevice_CreateIndexBuffer(This->wineD3DDevice, 0x40000, /* Length. Don't know how long it should be */ - 0, /* Usage */ + WINED3DUSAGE_DYNAMIC, /* Usage */ WINED3DFMT_INDEX16, /* Format. D3D7 uses WORDS */ WINED3DPOOL_DEFAULT, &object->indexbuffer, diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index c0397983275..2ac879779c7 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -4294,7 +4294,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice * UINT idxStride = 2; IWineD3DIndexBuffer *pIB; WINED3DINDEXBUFFER_DESC IdxBufDsc; - GLint vbo; + GLuint vbo; pIB = This->stateBlock->pIndexData; This->stateBlock->streamIsUP = FALSE; diff --git a/dlls/wined3d/indexbuffer.c b/dlls/wined3d/indexbuffer.c index b16ddd00ecc..ae2294aaad7 100644 --- a/dlls/wined3d/indexbuffer.c +++ b/dlls/wined3d/indexbuffer.c @@ -60,8 +60,11 @@ static ULONG WINAPI IWineD3DIndexBufferImpl_Release(IWineD3DIndexBuffer *iface) if (ref == 0) { if(This->vbo) { ENTER_GL(); - GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)); - checkGLcall("glBindBufferARB"); + /* No need to manually unset the buffer. glDeleteBuffers unsets it for the current context, + * but not for other contexts. However, because the d3d buffer is destroyed the app has to + * unset it before doing the next draw, thus dirtifying the index buffer state and forcing + * binding a new buffer + */ GL_EXTCALL(glDeleteBuffersARB(1, &This->vbo)); checkGLcall("glDeleteBuffersARB"); LEAVE_GL(); @@ -159,6 +162,8 @@ static HRESULT WINAPI IWineD3DIndexBufferImpl_Unlock(IWineD3DIndexBuffer *iface) LEAVE_GL(); This->dirtystart = 0; This->dirtyend = 0; + /* TODO: Move loading into preload when the buffer is used, that avoids dirtifying the state */ + IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_INDEXBUFFER); } return WINED3D_OK; }