[PATCH 7/8] wined3d: Keep track of front buffer updates in the swapchain.

Henri Verbeet hverbeet at codeweavers.com
Tue Mar 1 12:31:48 CST 2016


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/surface.c         | 56 +++++++++++++++++++++++-------------------
 dlls/wined3d/wined3d_private.h |  3 +--
 2 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index ee6588e..1acc3b6 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -677,11 +677,10 @@ static void surface_unmap(struct wined3d_surface *surface)
     struct wined3d_device *device = surface->resource.device;
     const struct wined3d_gl_info *gl_info;
     struct wined3d_context *context;
+    struct wined3d_texture *texture;
 
     TRACE("surface %p.\n", surface);
 
-    memset(&surface->lockedRect, 0, sizeof(surface->lockedRect));
-
     switch (surface->resource.map_binding)
     {
         case WINED3D_LOCATION_SYSMEM:
@@ -710,13 +709,15 @@ static void surface_unmap(struct wined3d_surface *surface)
         return;
     }
 
-    if (surface->container->swapchain && surface->container->swapchain->front_buffer == surface->container)
+    texture = surface->container;
+    if (texture->swapchain && texture->swapchain->front_buffer == texture)
     {
         context = context_acquire(device, surface);
-        surface_load_location(surface, context, surface->container->resource.draw_binding);
+        surface_load_location(surface, context, texture->resource.draw_binding);
         context_release(context);
+        memset(&texture->swapchain->front_buffer_update, 0, sizeof(texture->swapchain->front_buffer_update));
     }
-    else if (surface->container->resource.format_flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
+    else if (texture->resource.format_flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
         FIXME("Depth / stencil buffer locking is not implemented.\n");
 }
 
@@ -1260,13 +1261,15 @@ static HRESULT gdi_surface_private_setup(struct wined3d_surface *surface)
 
 static void gdi_surface_unmap(struct wined3d_surface *surface)
 {
+    struct wined3d_texture *texture = surface->container;
+
     TRACE("surface %p.\n", surface);
 
     /* Tell the swapchain to update the screen. */
-    if (surface->container->swapchain && surface->container == surface->container->swapchain->front_buffer)
-        x11_copy_to_screen(surface->container->swapchain, &surface->lockedRect);
+    if (texture->swapchain && texture == texture->swapchain->front_buffer)
+        x11_copy_to_screen(texture->swapchain, &texture->swapchain->front_buffer_update);
 
-    memset(&surface->lockedRect, 0, sizeof(RECT));
+    memset(&texture->swapchain->front_buffer_update, 0, sizeof(texture->swapchain->front_buffer_update));
 }
 
 static const struct wined3d_surface_ops gdi_surface_ops =
@@ -2253,9 +2256,10 @@ HRESULT wined3d_surface_unmap(struct wined3d_surface *surface)
 HRESULT wined3d_surface_map(struct wined3d_surface *surface, struct wined3d_map_desc *map_desc,
         const struct wined3d_box *box, DWORD flags)
 {
-    const struct wined3d_format *format = surface->resource.format;
-    unsigned int fmt_flags = surface->container->resource.format_flags;
-    struct wined3d_device *device = surface->resource.device;
+    struct wined3d_texture *texture = surface->container;
+    const struct wined3d_format *format = texture->resource.format;
+    struct wined3d_device *device = texture->resource.device;
+    unsigned int fmt_flags = texture->resource.format_flags;
     struct wined3d_context *context;
     const struct wined3d_gl_info *gl_info;
     BYTE *base_memory;
@@ -2270,7 +2274,7 @@ HRESULT wined3d_surface_map(struct wined3d_surface *surface, struct wined3d_map_
     }
 
     if ((fmt_flags & WINED3DFMT_FLAG_BLOCKS) && box
-            && !wined3d_texture_check_block_align(surface->container, surface->texture_level, box))
+            && !wined3d_texture_check_block_align(texture, surface->texture_level, box))
     {
         WARN("Map box %s is misaligned for %ux%u blocks.\n",
                 debug_box(box), format->block_width, format->block_height);
@@ -2289,13 +2293,13 @@ HRESULT wined3d_surface_map(struct wined3d_surface *surface, struct wined3d_map_
      * the need to download the surface from OpenGL all the time. The surface
      * is still downloaded if the OpenGL texture is changed. Note that this
      * only really makes sense for managed textures.*/
-    if (!(surface->container->flags & WINED3D_TEXTURE_DYNAMIC_MAP)
+    if (!(texture->flags & WINED3D_TEXTURE_DYNAMIC_MAP)
             && surface->resource.map_binding == WINED3D_LOCATION_SYSMEM)
     {
         if (++surface->lockCount > MAXLOCKCOUNT)
         {
             TRACE("Surface is mapped regularly, not freeing the system memory copy any more.\n");
-            surface->container->flags |= WINED3D_TEXTURE_DYNAMIC_MAP;
+            texture->flags |= WINED3D_TEXTURE_DYNAMIC_MAP;
         }
     }
 
@@ -2330,7 +2334,7 @@ HRESULT wined3d_surface_map(struct wined3d_surface *surface, struct wined3d_map_
             break;
 
         case WINED3D_LOCATION_USER_MEMORY:
-            base_memory = surface->container->user_memory;
+            base_memory = texture->user_memory;
             break;
 
         case WINED3D_LOCATION_DIB:
@@ -2361,17 +2365,13 @@ HRESULT wined3d_surface_map(struct wined3d_surface *surface, struct wined3d_map_
     }
     else
     {
-        wined3d_texture_get_pitch(surface->container, surface->texture_level,
+        wined3d_texture_get_pitch(texture, surface->texture_level,
                 &map_desc->row_pitch, &map_desc->slice_pitch);
     }
 
     if (!box)
     {
         map_desc->data = base_memory;
-        surface->lockedRect.left = 0;
-        surface->lockedRect.top = 0;
-        surface->lockedRect.right = surface->resource.width;
-        surface->lockedRect.bottom = surface->resource.height;
     }
     else
     {
@@ -2389,13 +2389,19 @@ HRESULT wined3d_surface_map(struct wined3d_surface *surface, struct wined3d_map_
                     + (map_desc->row_pitch * box->top)
                     + (box->left * format->byte_count);
         }
-        surface->lockedRect.left = box->left;
-        surface->lockedRect.top = box->top;
-        surface->lockedRect.right = box->right;
-        surface->lockedRect.bottom = box->bottom;
     }
 
-    TRACE("Locked rect %s.\n", wine_dbgstr_rect(&surface->lockedRect));
+    if (texture->swapchain && texture->swapchain->front_buffer == texture)
+    {
+        RECT *r = &texture->swapchain->front_buffer_update;
+
+        if (!box)
+            SetRect(r, 0, 0, texture->resource.width, texture->resource.height);
+        else
+            SetRect(r, box->left, box->top, box->right, box->bottom);
+        TRACE("Mapped front buffer %s.\n", wine_dbgstr_rect(r));
+    }
+
     TRACE("Returning memory %p, pitch %u.\n", map_desc->data, map_desc->row_pitch);
 
     return WINED3D_OK;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 409ab36..4066c79 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2522,8 +2522,6 @@ struct wined3d_surface
     GLenum texture_target;
     unsigned int texture_level;
     unsigned int texture_layer;
-
-    RECT                      lockedRect;
     int                       lockCount;
 
     /* For GetDC */
@@ -2936,6 +2934,7 @@ struct wined3d_swapchain
     BOOL render_to_fbo, reapply_mode;
     const struct wined3d_format *ds_format;
     struct wined3d_palette *palette;
+    RECT front_buffer_update;
 
     LONG prev_time, frames;   /* Performance tracking */
 
-- 
2.1.4




More information about the wine-patches mailing list