=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Decide about PBO use at surface creation time.

Alexandre Julliard julliard at winehq.org
Wed Jan 15 13:51:53 CST 2014


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Wed Jan 15 14:54:11 2014 +0100

wined3d: Decide about PBO use at surface creation time.

---

 dlls/wined3d/surface.c         |   41 +++++++++++++++++++++++-----------------
 dlls/wined3d/wined3d_private.h |    1 +
 2 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 0d8de0f..ab7bbd6 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -538,20 +538,6 @@ static void surface_get_memory(const struct wined3d_surface *surface, struct win
     data->buffer_object = 0;
 }
 
-static BOOL surface_need_pbo(const struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info)
-{
-    if (surface->resource.pool == WINED3D_POOL_SYSTEM_MEM)
-        return FALSE;
-    if (!(surface->flags & SFLAG_DYNLOCK))
-        return FALSE;
-    if (surface->flags & (SFLAG_CONVERTED | SFLAG_NONPOW2 | SFLAG_PIN_SYSMEM))
-        return FALSE;
-    if (!gl_info->supported[ARB_PIXEL_BUFFER_OBJECT])
-        return FALSE;
-
-    return TRUE;
-}
-
 static void surface_create_pbo(struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info)
 {
     struct wined3d_context *context;
@@ -591,7 +577,7 @@ static void surface_prepare_system_memory(struct wined3d_surface *surface)
 
     TRACE("surface %p.\n", surface);
 
-    if (!surface->pbo && surface_need_pbo(surface, gl_info))
+    if (!surface->pbo && surface->flags & SFLAG_PBO)
         surface_create_pbo(surface, gl_info);
     else if (!(surface->resource.heap_memory || surface->pbo))
     {
@@ -666,6 +652,17 @@ static void surface_release_client_storage(struct wined3d_surface *surface)
     surface_force_reload(surface);
 }
 
+static BOOL surface_use_pbo(const struct wined3d_surface *surface)
+{
+    const struct wined3d_gl_info *gl_info = &surface->resource.device->adapter->gl_info;
+
+    return surface->resource.pool == WINED3D_POOL_DEFAULT
+                && surface->resource.access_flags & WINED3D_RESOURCE_ACCESS_CPU
+                && gl_info->supported[ARB_PIXEL_BUFFER_OBJECT]
+                && !surface->resource.format->convert
+                && !(surface->flags & (SFLAG_NONPOW2 | SFLAG_PIN_SYSMEM));
+}
+
 static HRESULT surface_private_setup(struct wined3d_surface *surface)
 {
     /* TODO: Check against the maximum texture sizes supported by the video card. */
@@ -753,6 +750,9 @@ static HRESULT surface_private_setup(struct wined3d_surface *surface)
     if (surface->resource.usage & WINED3DUSAGE_DEPTHSTENCIL)
         surface->flags |= SFLAG_DISCARDED;
 
+    if (surface_use_pbo(surface))
+        surface->flags |= SFLAG_PBO;
+
     return WINED3D_OK;
 }
 
@@ -2791,6 +2791,13 @@ HRESULT CDECL wined3d_surface_update_desc(struct wined3d_surface *surface,
     else
         surface->resource.size = resource_size;
 
+    /* The format might be changed to a format that needs conversion.
+     * If the surface didn't use PBOs previously but could now, don't
+     * change it - whatever made us not use PBOs might come back, e.g.
+     * color keys. */
+    if (!surface_use_pbo(surface))
+        surface->flags &= ~SFLAG_PBO;
+
     if (create_dib)
     {
         if (FAILED(hr = surface_create_dib_section(surface)))
@@ -5109,6 +5116,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface,
     {
         TRACE("Removing the pbo attached to surface %p.\n", surface);
         surface_remove_pbo(surface, gl_info);
+        surface->flags &= ~SFLAG_PBO;
     }
 
     surface_get_memory(surface, &data, surface->flags);
@@ -5209,8 +5217,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location)
     {
         TRACE("Location already up to date.\n");
 
-        if (location == SFLAG_INSYSMEM && !surface->pbo
-                && surface_need_pbo(surface, gl_info))
+        if (location == SFLAG_INSYSMEM && !surface->pbo && surface->flags & SFLAG_PBO)
             surface_create_pbo(surface, gl_info);
 
         return WINED3D_OK;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d8bdc9c..9d4c39c 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2305,6 +2305,7 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) D
 #define SFLAG_INRB_MULTISAMPLE  0x00080000 /* The multisample renderbuffer is current. */
 #define SFLAG_INRB_RESOLVED     0x00100000 /* The resolved renderbuffer is current. */
 #define SFLAG_DISCARDED         0x00200000 /* Surface was discarded, allocating new location is enough. */
+#define SFLAG_PBO               0x00400000 /* Use a PBO for mapping. */
 
 /* In some conditions the surface memory must not be freed:
  * SFLAG_CONVERTED: Converting the data back would take too long




More information about the wine-cvs mailing list