Henri Verbeet : wined3d: Move PBO handling mostly out of surface_upload_data().

Alexandre Julliard julliard at winehq.org
Fri Jun 10 11:16:19 CDT 2011


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Thu Jun  9 20:40:49 2011 +0200

wined3d: Move PBO handling mostly out of surface_upload_data().

Currently we essentially get half of the address from the caller and half from
the destination surface. Since we'd like to use surface_upload_data() for
wined3d_device_update_surface() as well, we should get all of it from the
caller.

---

 dlls/wined3d/surface.c         |   24 ++++++++++++------------
 dlls/wined3d/wined3d_private.h |    6 ++++++
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 25b99fd..77a4f2f 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -2162,7 +2162,7 @@ static void surface_download_data(struct wined3d_surface *surface, const struct
  * correct texture. */
 /* Context activation is done by the caller. */
 static void surface_upload_data(struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info,
-        const struct wined3d_format *format, BOOL srgb, const GLvoid *data)
+        const struct wined3d_format *format, BOOL srgb, const struct wined3d_bo_address *data)
 {
     GLsizei width = surface->resource.width;
     GLsizei height = surface->resource.height;
@@ -2181,8 +2181,8 @@ static void surface_upload_data(struct wined3d_surface *surface, const struct wi
         internal = format->glInternal;
     }
 
-    TRACE("surface %p, internal %#x, width %d, height %d, format %#x, type %#x, data %p.\n",
-            surface, internal, width, height, format->glFormat, format->glType, data);
+    TRACE("surface %p, internal %#x, width %d, height %d, format %#x, type %#x, data {%#x:%p}.\n",
+            surface, internal, width, height, format->glFormat, format->glType, data->buffer_object, data->addr);
     TRACE("target %#x, level %u, resource size %u.\n",
             surface->texture_target, surface->texture_level, surface->resource.size);
 
@@ -2190,13 +2190,10 @@ static void surface_upload_data(struct wined3d_surface *surface, const struct wi
 
     ENTER_GL();
 
-    if (surface->flags & SFLAG_PBO)
+    if (data->buffer_object)
     {
-        GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo));
+        GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, data->buffer_object));
         checkGLcall("glBindBufferARB");
-
-        TRACE("(%p) pbo: %#x, data: %p.\n", surface, surface->pbo, data);
-        data = NULL;
     }
 
     /* Make sure the correct pitch is used */
@@ -2207,7 +2204,7 @@ static void surface_upload_data(struct wined3d_surface *surface, const struct wi
         TRACE("Calling glCompressedTexSubImage2DARB.\n");
 
         GL_EXTCALL(glCompressedTexSubImage2DARB(surface->texture_target, surface->texture_level,
-                0, 0, width, height, internal, surface->resource.size, data));
+                0, 0, width, height, internal, surface->resource.size, data->addr));
         checkGLcall("glCompressedTexSubImage2DARB");
     }
     else
@@ -2215,14 +2212,14 @@ static void surface_upload_data(struct wined3d_surface *surface, const struct wi
         TRACE("Calling glTexSubImage2D.\n");
 
         glTexSubImage2D(surface->texture_target, surface->texture_level,
-                0, 0, width, height, format->glFormat, format->glType, data);
+                0, 0, width, height, format->glFormat, format->glType, data->addr);
         checkGLcall("glTexSubImage2D");
     }
 
     /* Restore the default pitch */
     glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
 
-    if (surface->flags & SFLAG_PBO)
+    if (data->buffer_object)
     {
         GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
         checkGLcall("glBindBufferARB");
@@ -6072,6 +6069,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD flag, const
             /* Upload from system memory */
             BOOL srgb = flag == SFLAG_INSRGBTEX;
             struct wined3d_context *context = NULL;
+            struct wined3d_bo_address data;
 
             d3dfmt_get_conv(surface, TRUE /* We need color keying */,
                     TRUE /* We will use textures */, &format, &convert);
@@ -6165,7 +6163,9 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD flag, const
                 mem = surface->resource.allocatedMemory;
             }
 
-            surface_upload_data(surface, gl_info, &format, srgb, mem);
+            data.buffer_object = surface->flags & SFLAG_PBO ? surface->pbo : 0;
+            data.addr = mem;
+            surface_upload_data(surface, gl_info, &format, srgb, &data);
 
             if (context) context_release(context);
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d898654..44efb85 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -894,6 +894,12 @@ enum wined3d_ffp_emit_idx
     WINED3D_FFP_EMIT_COUNT = 17
 };
 
+struct wined3d_bo_address
+{
+    GLuint buffer_object;
+    const BYTE *addr;
+};
+
 struct wined3d_stream_info_element
 {
     const struct wined3d_format *format;




More information about the wine-cvs mailing list