[PATCH 5/5] wined3d: Keep a reference to the backbuffer textures instead of the surfaces in the swapchain.

Henri Verbeet hverbeet at codeweavers.com
Wed Aug 20 06:20:03 CDT 2014


---
 dlls/wined3d/context.c         |    2 +-
 dlls/wined3d/device.c          |   12 ++++++++----
 dlls/wined3d/surface.c         |    7 ++++---
 dlls/wined3d/swapchain.c       |   29 +++++++++++++++++------------
 dlls/wined3d/wined3d_private.h |    2 +-
 5 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index bd8de7b..f62b962 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -3102,7 +3102,7 @@ struct wined3d_context *context_acquire(const struct wined3d_device *device, str
         {
             struct wined3d_swapchain *swapchain = device->swapchains[0];
             if (swapchain->back_buffers)
-                target = swapchain->back_buffers[0];
+                target = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0));
             else
                 target = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0));
         }
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index fc754b3..1f5a46c 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -854,7 +854,8 @@ static void device_init_swapchain_state(struct wined3d_device *device, struct wi
             wined3d_device_set_render_target(device, i, NULL, FALSE);
         }
         if (swapchain->back_buffers && swapchain->back_buffers[0])
-            wined3d_device_set_render_target(device, 0, swapchain->back_buffers[0], TRUE);
+            wined3d_device_set_render_target(device, 0,
+                    surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)), TRUE);
     }
 
     wined3d_device_set_depth_stencil(device, ds_enable ? device->auto_depth_stencil : NULL);
@@ -4170,7 +4171,8 @@ static HRESULT create_primary_opengl_context(struct wined3d_device *device, stru
         return E_OUTOFMEMORY;
     }
 
-    target = swapchain->back_buffers ? swapchain->back_buffers[0]
+    target = swapchain->back_buffers
+            ? surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0))
             : surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0));
     if (!(context = context_create(swapchain, target, swapchain->ds_format)))
     {
@@ -4233,7 +4235,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
             wined3d_device_set_render_target(device, i, NULL, FALSE);
         }
         if (swapchain->back_buffers && swapchain->back_buffers[0])
-            wined3d_device_set_render_target(device, 0, swapchain->back_buffers[0], FALSE);
+            wined3d_device_set_render_target(device, 0,
+                    surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)), FALSE);
     }
     wined3d_device_set_depth_stencil(device, NULL);
 
@@ -4411,7 +4414,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
 
         for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
         {
-            if (FAILED(hr = wined3d_surface_update_desc(swapchain->back_buffers[i], swapchain->desc.backbuffer_width,
+            if (FAILED(hr = wined3d_surface_update_desc(surface_from_resource(
+                    wined3d_texture_get_sub_resource(swapchain->back_buffers[i], 0)), swapchain->desc.backbuffer_width,
                     swapchain->desc.backbuffer_height, swapchain->desc.backbuffer_format,
                     swapchain->desc.multisample_type, swapchain->desc.multisample_quality, NULL, 0)))
                 return hr;
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 9be4ac2..20b36f2 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1985,7 +1985,7 @@ GLenum surface_get_gl_buffer(const struct wined3d_surface *surface)
         return GL_NONE;
     }
 
-    if (swapchain->back_buffers && swapchain->back_buffers[0] == surface)
+    if (swapchain->back_buffers && swapchain->back_buffers[0] == surface->container)
     {
         if (swapchain->render_to_fbo)
         {
@@ -3676,7 +3676,8 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
             wined3d_gl_min_mip_filter(minMipLookup, filter, WINED3D_TEXF_NONE));
     checkGLcall("glTexParameteri");
 
-    if (!src_surface->container->swapchain || src_surface == src_surface->container->swapchain->back_buffers[0])
+    if (!src_surface->container->swapchain
+            || src_surface->container == src_surface->container->swapchain->back_buffers[0])
     {
         src = backup ? backup : src_surface->container->texture_rgb.name;
     }
@@ -5832,7 +5833,7 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC
              * applications can't blit directly to the frontbuffer. */
             if (dst_swapchain && dst_swapchain->back_buffers
                     && dst_surface->container == dst_swapchain->front_buffer
-                    && src_surface == dst_swapchain->back_buffers[0])
+                    && src_surface->container == dst_swapchain->back_buffers[0])
             {
                 enum wined3d_swap_effect swap_effect = dst_swapchain->desc.swap_effect;
 
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index fb9bfa8..a816d6f 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -52,8 +52,8 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
 
         while (i--)
         {
-            wined3d_texture_set_swapchain(swapchain->back_buffers[i]->container, NULL);
-            if (wined3d_surface_decref(swapchain->back_buffers[i]))
+            wined3d_texture_set_swapchain(swapchain->back_buffers[i], NULL);
+            if (wined3d_texture_decref(swapchain->back_buffers[i]))
                 WARN("Something's still holding back buffer %u (%p).\n", i, swapchain->back_buffers[i]);
         }
         HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
@@ -198,7 +198,7 @@ struct wined3d_surface * CDECL wined3d_swapchain_get_back_buffer(const struct wi
 
     TRACE("Returning back buffer %p.\n", swapchain->back_buffers[back_buffer_idx]);
 
-    return swapchain->back_buffers[back_buffer_idx];
+    return surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[back_buffer_idx], 0));
 }
 
 HRESULT CDECL wined3d_swapchain_get_raster_status(const struct wined3d_swapchain *swapchain,
@@ -282,7 +282,8 @@ HRESULT CDECL wined3d_swapchain_get_gamma_ramp(const struct wined3d_swapchain *s
 static void swapchain_blit(const struct wined3d_swapchain *swapchain,
         struct wined3d_context *context, const RECT *src_rect, const RECT *dst_rect)
 {
-    struct wined3d_surface *backbuffer = swapchain->back_buffers[0];
+    struct wined3d_surface *backbuffer = surface_from_resource(
+            wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0));
     UINT src_w = src_rect->right - src_rect->left;
     UINT src_h = src_rect->bottom - src_rect->top;
     GLenum gl_filter;
@@ -345,7 +346,7 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain,
         float tex_right = src_rect->right;
         float tex_bottom = src_rect->bottom;
 
-        context2 = context_acquire(device, swapchain->back_buffers[0]);
+        context2 = context_acquire(device, backbuffer);
         context_apply_blit_state(context2, device);
 
         if (backbuffer->flags & SFLAG_NORMCOORD)
@@ -418,7 +419,8 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain,
 static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT *src_rect_in,
         const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags)
 {
-    struct wined3d_surface *back_buffer = swapchain->back_buffers[0];
+    struct wined3d_surface *back_buffer = surface_from_resource(
+            wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0));
     const struct wined3d_fb_state *fb = &swapchain->device->fb;
     const struct wined3d_gl_info *gl_info;
     struct wined3d_context *context;
@@ -670,7 +672,7 @@ static void swapchain_gdi_present(struct wined3d_swapchain *swapchain, const REC
     struct wined3d_surface *front, *back;
 
     front = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0));
-    back = swapchain->back_buffers[0];
+    back = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0));
 
     /* Flip the DC. */
     {
@@ -961,15 +963,18 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
         surface_desc.usage |= WINED3DUSAGE_RENDERTARGET;
         for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
         {
+            struct wined3d_surface *back_buffer;
+
             TRACE("Creating back buffer %u.\n", i);
             if (FAILED(hr = device->device_parent->ops->create_swapchain_surface(device->device_parent,
-                    parent, &surface_desc, &swapchain->back_buffers[i])))
+                    parent, &surface_desc, &back_buffer)))
             {
                 WARN("Failed to create back buffer %u, hr %#x.\n", i, hr);
                 swapchain->desc.backbuffer_count = i;
                 goto err;
             }
-            wined3d_texture_set_swapchain(swapchain->back_buffers[i]->container, swapchain);
+            swapchain->back_buffers[i] = back_buffer->container;
+            wined3d_texture_set_swapchain(swapchain->back_buffers[i], swapchain);
         }
     }
 
@@ -1010,8 +1015,8 @@ err:
         {
             if (swapchain->back_buffers[i])
             {
-                wined3d_texture_set_swapchain(swapchain->back_buffers[i]->container, NULL);
-                wined3d_surface_decref(swapchain->back_buffers[i]);
+                wined3d_texture_set_swapchain(swapchain->back_buffers[i], NULL);
+                wined3d_texture_decref(swapchain->back_buffers[i]);
             }
         }
         HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
@@ -1155,6 +1160,6 @@ void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
 
     for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
     {
-        wined3d_resource_update_draw_binding(&swapchain->back_buffers[i]->container->resource);
+        wined3d_resource_update_draw_binding(&swapchain->back_buffers[i]->resource);
     }
 }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b517d4e..f4d8815 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2621,7 +2621,7 @@ struct wined3d_swapchain
     const struct wined3d_swapchain_ops *swapchain_ops;
     struct wined3d_device *device;
 
-    struct wined3d_surface **back_buffers;
+    struct wined3d_texture **back_buffers;
     struct wined3d_texture *front_buffer;
     struct wined3d_swapchain_desc desc;
     struct wined3d_display_mode original_mode;
-- 
1.7.10.4




More information about the wine-patches mailing list