Stefan Dösinger : wined3d: Drop the VBO when the GL alignment doesn't fit on dynamic buffers.

Alexandre Julliard julliard at winehq.org
Fri Jun 17 13:13:47 CDT 2011


Module: wine
Branch: master
Commit: 12140b515871bd4cf672a7776f350b40c89b7cfb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=12140b515871bd4cf672a7776f350b40c89b7cfb

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue Apr 19 21:23:15 2011 +0200

wined3d: Drop the VBO when the GL alignment doesn't fit on dynamic buffers.

---

 dlls/wined3d/buffer.c |   19 ++++++++++++++++---
 1 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 2f6ff2a..d9d9a2a 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1053,8 +1053,7 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN
 
                 if (((DWORD_PTR)buffer->resource.allocatedMemory) & (RESOURCE_ALIGNMENT - 1))
                 {
-                    WARN("Pointer %p is not %u byte aligned, falling back to double buffered operation.\n",
-                            buffer->resource.allocatedMemory, RESOURCE_ALIGNMENT);
+                    WARN("Pointer %p is not %u byte aligned.\n", buffer->resource.allocatedMemory, RESOURCE_ALIGNMENT);
 
                     ENTER_GL();
                     GL_EXTCALL(glUnmapBufferARB(buffer->buffer_type_hint));
@@ -1062,7 +1061,21 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN
                     LEAVE_GL();
                     buffer->resource.allocatedMemory = NULL;
 
-                    buffer_get_sysmem(buffer, gl_info);
+                    if (buffer->resource.usage & WINED3DUSAGE_DYNAMIC)
+                    {
+                        /* The extra copy is more expensive than not using VBOs at
+                         * all on the Nvidia Linux driver, which is the only driver
+                         * that returns unaligned pointers
+                         */
+                        TRACE("Dynamic buffer, dropping VBO\n");
+                        buffer_unload(&buffer->resource);
+                        buffer->flags &= ~WINED3D_BUFFER_CREATEBO;
+                    }
+                    else
+                    {
+                        TRACE("Falling back to doublebuffered operation\n");
+                        buffer_get_sysmem(buffer, gl_info);
+                    }
                     TRACE("New pointer is %p.\n", buffer->resource.allocatedMemory);
                 }
                 context_release(context);




More information about the wine-cvs mailing list