Stefan Dösinger : wined3d: Do not use glMapBuffer in ProcessVertices.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Feb 21 06:01:03 CST 2007
Module: wine
Branch: master
Commit: a72b561947ed485b8a2ca661eac49a9caa542383
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a72b561947ed485b8a2ca661eac49a9caa542383
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Tue Feb 20 23:00:02 2007 +0100
wined3d: Do not use glMapBuffer in ProcessVertices.
---
dlls/wined3d/device.c | 22 ++++++++++++----------
1 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index bee6650..82873c6 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3345,7 +3345,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetPixelShaderConstantF(
#define copy_and_next(dest, src, size) memcpy(dest, src, size); dest += (size)
static HRESULT
process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIndex, DWORD dwCount, WineDirect3DVertexStridedData *lpStrideData, DWORD SrcFVF, IWineD3DVertexBufferImpl *dest, DWORD dwFlags) {
- char *dest_ptr, *dest_conv = NULL;
+ char *dest_ptr, *dest_conv = NULL, *dest_conv_addr = NULL;
unsigned int i;
DWORD DestFVF = dest->fvf;
WINED3DVIEWPORT vp;
@@ -3396,12 +3396,12 @@ process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIndex, DWORD dwCo
}
if(dest->vbo) {
- GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, dest->vbo));
- dest_conv = GL_EXTCALL(glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB));
- if(!dest_conv) {
- ERR("glMapBuffer failed\n");
+ dest_conv_addr = HeapAlloc(GetProcessHeap(), 0, dwCount * get_flexible_vertex_size(DestFVF));
+ if(!dest_conv_addr) {
+ ERR("Out of memory\n");
/* Continue without storing converted vertices */
}
+ dest_conv = dest_conv_addr;
}
/* Should I clip?
@@ -3425,9 +3425,6 @@ process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIndex, DWORD dwCo
}
} else doClip = FALSE;
dest_ptr = ((char *) dest->resource.allocatedMemory) + dwDestIndex * get_flexible_vertex_size(DestFVF);
- if(dest_conv) {
- dest_conv = ((char *) dest_conv) + dwDestIndex * get_flexible_vertex_size(DestFVF);
- }
IWineD3DDevice_GetTransform( (IWineD3DDevice *) This,
WINED3DTS_VIEW,
@@ -3680,8 +3677,13 @@ process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIndex, DWORD dwCo
}
if(dest_conv) {
- GL_EXTCALL(glUnmapBufferARB(GL_ARRAY_BUFFER_ARB));
- checkGLcall("glUnmapBufferARB(GL_ARRAY_BUFFER_ARB)");
+ GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, dest->vbo));
+ checkGLcall("glBindBufferARB(GL_ARRAY_BUFFER_ARB)");
+ GL_EXTCALL(glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, dwDestIndex * get_flexible_vertex_size(DestFVF),
+ dwCount * get_flexible_vertex_size(DestFVF),
+ dest_conv_addr));
+ checkGLcall("glBufferSubDataARB(GL_ARRAY_BUFFER_ARB)");
+ HeapFree(GetProcessHeap(), 0, dest_conv_addr);
}
LEAVE_GL();
More information about the wine-cvs
mailing list