wined3d: Index buffer fixes.

This commit is contained in:
Stefan Dösinger 2007-02-20 22:46:31 +01:00 committed by Alexandre Julliard
parent 6d66347cf9
commit efc03f0a34
4 changed files with 10 additions and 5 deletions

View file

@ -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);

View file

@ -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,

View file

@ -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;

View file

@ -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;
}