Stefan Dösinger : wined3d: Index buffer fixes.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Feb 21 06:01:01 CST 2007
Module: wine
Branch: master
Commit: efc03f0a34354a55142b9a8291e47f1c41b89da4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=efc03f0a34354a55142b9a8291e47f1c41b89da4
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Tue Feb 20 22:46:31 2007 +0100
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 c201df7..0814921 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 4896ba7..b716a60 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 c039798..2ac8797 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 b16ddd0..ae2294a 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;
}
More information about the wine-cvs
mailing list