wined3d: Check the alignment of mapped buffer pointers.

Windows returns 32 byte aligned pointers when locking vertex and index
buffers, and some applications(Half Life 2, Alpha Prime, possibly others)
rely on this. Check the alignment and fall back to double buffered
buffers with HeapAlloced and aligned pointers if the alignment doesn't
fit.
This commit is contained in:
Stefan Dösinger 2010-03-11 13:20:32 +01:00 committed by Alexandre Julliard
parent 6c53871d30
commit cc6d17ba7c
1 changed files with 15 additions and 0 deletions

View File

@ -1186,6 +1186,21 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
}
LEAVE_GL();
if (((DWORD_PTR) This->resource.allocatedMemory) & (RESOURCE_ALIGNMENT - 1))
{
WARN("Pointer %p is not %u byte aligned, falling back to double buffered operation\n",
This->resource.allocatedMemory, RESOURCE_ALIGNMENT);
ENTER_GL();
GL_EXTCALL(glUnmapBufferARB(This->buffer_type_hint));
checkGLcall("glUnmapBufferARB");
LEAVE_GL();
This->resource.allocatedMemory = NULL;
buffer_get_sysmem(This);
TRACE("New pointer is %p\n", This->resource.allocatedMemory);
}
context_release(context);
}
}