[PATCH 3/5] wined3d: Create a PBO in surface_load_location() even if SFLAG_INSYSMEM is already set.

Henri Verbeet hverbeet at codeweavers.com
Thu Dec 1 00:31:41 CST 2011


In the longer term, sysmem and pbo should be separate resource locations.
---
 dlls/wined3d/surface.c |   73 ++++++++++++++++++++++++++---------------------
 1 files changed, 40 insertions(+), 33 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 373b443..d5b73e3 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -534,49 +534,51 @@ static BOOL surface_need_pbo(const struct wined3d_surface *surface, const struct
     return TRUE;
 }
 
-static void surface_prepare_system_memory(struct wined3d_surface *surface)
+static void surface_load_pbo(struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info)
 {
-    struct wined3d_device *device = surface->resource.device;
-    const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+    struct wined3d_context *context;
+    GLenum error;
 
-    TRACE("surface %p.\n", surface);
+    context = context_acquire(surface->resource.device, NULL);
+    ENTER_GL();
 
-    if (!(surface->flags & SFLAG_PBO) && surface_need_pbo(surface, gl_info))
-    {
-        struct wined3d_context *context;
-        GLenum error;
+    GL_EXTCALL(glGenBuffersARB(1, &surface->pbo));
+    error = glGetError();
+    if (!surface->pbo || error != GL_NO_ERROR)
+        ERR("Failed to create a PBO with error %s (%#x).\n", debug_glerror(error), error);
 
-        context = context_acquire(device, NULL);
-        ENTER_GL();
+    TRACE("Binding PBO %u.\n", surface->pbo);
 
-        GL_EXTCALL(glGenBuffersARB(1, &surface->pbo));
-        error = glGetError();
-        if (!surface->pbo || error != GL_NO_ERROR)
-            ERR("Failed to create a PBO with error %s (%#x).\n", debug_glerror(error), error);
+    GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo));
+    checkGLcall("glBindBufferARB");
 
-        TRACE("Binding PBO %u.\n", surface->pbo);
+    GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.size + 4,
+            surface->resource.allocatedMemory, GL_STREAM_DRAW_ARB));
+    checkGLcall("glBufferDataARB");
 
-        GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo));
-        checkGLcall("glBindBufferARB");
+    GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
+    checkGLcall("glBindBufferARB");
 
-        GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.size + 4,
-                surface->resource.allocatedMemory, GL_STREAM_DRAW_ARB));
-        checkGLcall("glBufferDataARB");
+    /* We don't need the system memory anymore and we can't even use it for PBOs. */
+    if (!(surface->flags & SFLAG_CLIENT))
+    {
+        HeapFree(GetProcessHeap(), 0, surface->resource.heapMemory);
+        surface->resource.heapMemory = NULL;
+    }
+    surface->resource.allocatedMemory = NULL;
+    surface->flags |= SFLAG_PBO;
+    LEAVE_GL();
+    context_release(context);
+}
 
-        GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
-        checkGLcall("glBindBufferARB");
+static void surface_prepare_system_memory(struct wined3d_surface *surface)
+{
+    const struct wined3d_gl_info *gl_info = &surface->resource.device->adapter->gl_info;
 
-        /* We don't need the system memory anymore and we can't even use it for PBOs. */
-        if (!(surface->flags & SFLAG_CLIENT))
-        {
-            HeapFree(GetProcessHeap(), 0, surface->resource.heapMemory);
-            surface->resource.heapMemory = NULL;
-        }
-        surface->resource.allocatedMemory = NULL;
-        surface->flags |= SFLAG_PBO;
-        LEAVE_GL();
-        context_release(context);
-    }
+    TRACE("surface %p.\n", surface);
+
+    if (!(surface->flags & SFLAG_PBO) && surface_need_pbo(surface, gl_info))
+        surface_load_pbo(surface, gl_info);
     else if (!(surface->resource.allocatedMemory || surface->flags & SFLAG_PBO))
     {
         /* Whatever surface we have, make sure that there is memory allocated
@@ -6136,6 +6138,11 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, c
     if (surface->flags & location)
     {
         TRACE("Location already up to date.\n");
+
+        if (location == SFLAG_INSYSMEM && !(surface->flags & SFLAG_PBO)
+                && surface_need_pbo(surface, gl_info))
+            surface_load_pbo(surface, gl_info);
+
         return WINED3D_OK;
     }
 
-- 
1.7.3.4




More information about the wine-patches mailing list