Henri Verbeet : wined3d: Load the backbuffer in the correct location before presenting in swapchain_gl_present ().

Alexandre Julliard julliard at winehq.org
Tue Mar 27 12:48:04 CDT 2012


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Mar 26 20:28:10 2012 +0200

wined3d: Load the backbuffer in the correct location before presenting in swapchain_gl_present().

---

 dlls/wined3d/swapchain.c |   31 ++++++++++++++++++-------------
 1 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index efe2293..2674ce6 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -449,13 +449,14 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain,
 static HRESULT 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];
     const struct wined3d_fb_state *fb = &swapchain->device->fb;
     const struct wined3d_gl_info *gl_info;
     struct wined3d_context *context;
     RECT src_rect, dst_rect;
     BOOL render_to_fbo;
 
-    context = context_acquire(swapchain->device, swapchain->back_buffers[0]);
+    context = context_acquire(swapchain->device, back_buffer);
     if (!context->valid)
     {
         context_release(context);
@@ -504,8 +505,8 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
          */
         if (swapchain->desc.windowed)
             MapWindowPoints(NULL, swapchain->win_handle, (POINT *)&destRect, 2);
-        wined3d_surface_blt(swapchain->back_buffers[0], &destRect,
-                &cursor, NULL, WINEDDBLT_KEYSRC, NULL, WINED3D_TEXF_POINT);
+        wined3d_surface_blt(back_buffer, &destRect, &cursor, NULL, WINEDDBLT_KEYSRC,
+                NULL, WINED3D_TEXF_POINT);
     }
 
     if (swapchain->device->logo_surface)
@@ -514,8 +515,8 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
         RECT rect = {0, 0, src_surface->resource.width, src_surface->resource.height};
 
         /* Blit the logo into the upper left corner of the drawable. */
-        wined3d_surface_blt(swapchain->back_buffers[0], &rect, src_surface, &rect,
-                 WINEDDBLT_KEYSRC, NULL, WINED3D_TEXF_POINT);
+        wined3d_surface_blt(back_buffer, &rect, src_surface, &rect, WINEDDBLT_KEYSRC,
+                NULL, WINED3D_TEXF_POINT);
     }
 
     TRACE("Presenting HDC %p.\n", context->hdc);
@@ -559,11 +560,15 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
      */
     if (!swapchain->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO)
     {
-        surface_load_location(swapchain->back_buffers[0], SFLAG_INTEXTURE, NULL);
-        surface_modify_location(swapchain->back_buffers[0], SFLAG_INDRAWABLE, FALSE);
+        surface_load_location(back_buffer, SFLAG_INTEXTURE, NULL);
+        surface_modify_location(back_buffer, SFLAG_INDRAWABLE, FALSE);
         swapchain->render_to_fbo = TRUE;
         swapchain_update_draw_bindings(swapchain);
     }
+    else
+    {
+        surface_load_location(back_buffer, back_buffer->draw_binding, NULL);
+    }
 
     if (swapchain->render_to_fbo)
     {
@@ -626,17 +631,17 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
     }
 
     if (!swapchain->render_to_fbo && ((swapchain->front_buffer->flags & SFLAG_INSYSMEM)
-            || (swapchain->back_buffers[0]->flags & SFLAG_INSYSMEM)))
+            || (back_buffer->flags & SFLAG_INSYSMEM)))
     {
         /* Both memory copies of the surfaces are ok, flip them around too instead of dirtifying
          * Doesn't work with render_to_fbo because we're not flipping
          */
         struct wined3d_surface *front = swapchain->front_buffer;
-        struct wined3d_surface *back = swapchain->back_buffers[0];
 
-        if(front->resource.size == back->resource.size) {
+        if (front->resource.size == back_buffer->resource.size)
+        {
             DWORD fbflags;
-            flip_surface(front, back);
+            flip_surface(front, back_buffer);
 
             /* Tell the front buffer surface that is has been modified. However,
              * the other locations were preserved during that, so keep the flags.
@@ -648,7 +653,7 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
         else
         {
             surface_modify_location(front, SFLAG_INDRAWABLE, TRUE);
-            surface_modify_location(back, SFLAG_INDRAWABLE, TRUE);
+            surface_modify_location(back_buffer, SFLAG_INDRAWABLE, TRUE);
         }
     }
     else
@@ -660,7 +665,7 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
          * the texture / sysmem copy needs to be reloaded from the drawable
          */
         if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP)
-            surface_modify_location(swapchain->back_buffers[0], swapchain->back_buffers[0]->draw_binding, TRUE);
+            surface_modify_location(back_buffer, back_buffer->draw_binding, TRUE);
     }
 
     if (fb->depth_stencil)




More information about the wine-cvs mailing list