Commit ca52d341 authored by Stefan Dösinger's avatar Stefan Dösinger Committed by Alexandre Julliard

wined3d: Some more ProcessVertices fixes.

Remove vbos from the input strided data from the fixed function attributes explicitly and avoid writing beyond the end of a temporary buffer when cloning a windows bug.
parent bed50115
...@@ -3537,7 +3537,13 @@ process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIndex, DWORD dwCo ...@@ -3537,7 +3537,13 @@ process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIndex, DWORD dwCo
} }
if(dest->vbo) { if(dest->vbo) {
dest_conv_addr = HeapAlloc(GetProcessHeap(), 0, dwCount * get_flexible_vertex_size(DestFVF)); unsigned char extrabytes = 0;
/* If the destination vertex buffer has D3DFVF_XYZ position(non-rhw), native d3d writes RHW position, where the RHW
* gets written into the 4 bytes after the Z position. In the case of a dest buffer that only has D3DFVF_XYZ data,
* this may write 4 extra bytes beyond the area that should be written
*/
if(DestFVF == WINED3DFVF_XYZ) extrabytes = 4;
dest_conv_addr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCount * get_flexible_vertex_size(DestFVF) + extrabytes);
if(!dest_conv_addr) { if(!dest_conv_addr) {
ERR("Out of memory\n"); ERR("Out of memory\n");
/* Continue without storing converted vertices */ /* Continue without storing converted vertices */
...@@ -3871,25 +3877,38 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface, ...@@ -3871,25 +3877,38 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
* *
* Also get the start index in, but only loop over all elements if there's something to add at all. * Also get the start index in, but only loop over all elements if there's something to add at all.
*/ */
for(i=0; i < 16; i++) { #define FIXSRC(type) \
if(strided.u.input[i].VBO) { if(strided.u.s.type.VBO) { \
IWineD3DVertexBufferImpl *vb = (IWineD3DVertexBufferImpl *) This->stateBlock->streamSource[strided.u.input[i].streamNo]; IWineD3DVertexBufferImpl *vb = (IWineD3DVertexBufferImpl *) This->stateBlock->streamSource[strided.u.s.type.streamNo]; \
strided.u.s.type.VBO = 0; \
/* The vertex buffer is supposed to have a system memory copy */ strided.u.s.type.lpData = (BYTE *) ((unsigned long) strided.u.s.type.lpData + (unsigned long) vb->resource.allocatedMemory); \
strided.u.input[i].VBO = 0; ENTER_GL(); \
strided.u.input[i].lpData = (BYTE *) ((unsigned long) strided.u.input[i].lpData + (unsigned long) vb->resource.allocatedMemory); GL_EXTCALL(glDeleteBuffersARB(1, &vb->vbo)); \
ENTER_GL(); vb->vbo = 0; \
GL_EXTCALL(glDeleteBuffersARB(1, &vb->vbo)); LEAVE_GL(); \
vb->vbo = 0; } \
LEAVE_GL(); if(strided.u.s.type.lpData) { \
strided.u.s.type.lpData += strided.u.s.type.dwStride * SrcStartIndex; \
/* To be safe. An app could technically draw, then call ProcessVertices, then draw again without ever changing the stream sources */ }
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_STREAMSRC); FIXSRC(position);
} FIXSRC(blendWeights);
if(strided.u.input[i].lpData) { FIXSRC(blendMatrixIndices);
strided.u.input[i].lpData += strided.u.input[i].dwStride * SrcStartIndex; FIXSRC(normal);
} FIXSRC(pSize);
FIXSRC(diffuse);
FIXSRC(specular);
for(i = 0; i < WINED3DDP_MAXTEXCOORD; i++) {
FIXSRC(texCoords[i]);
} }
FIXSRC(position2);
FIXSRC(normal2);
FIXSRC(tangent);
FIXSRC(binormal);
FIXSRC(tessFactor);
FIXSRC(fog);
FIXSRC(depth);
FIXSRC(sample);
#undef FIXSRC
} }
return process_vertices_strided(This, DestIndex, VertexCount, &strided, (IWineD3DVertexBufferImpl *) pDestBuffer, Flags); return process_vertices_strided(This, DestIndex, VertexCount, &strided, (IWineD3DVertexBufferImpl *) pDestBuffer, Flags);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment