[PATCH 8/8] wined3d: Get rid of wined3d_surface_ops.surface_unmap().

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


From: Stefan Dösinger <stefan at codeweavers.com>

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/surface.c         | 101 +++++++++++++++--------------------------
 dlls/wined3d/swapchain.c       |  30 +++++++++---
 dlls/wined3d/wined3d_private.h |   4 +-
 3 files changed, 60 insertions(+), 75 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 1acc3b6..01095e9 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -672,55 +672,6 @@ static HRESULT surface_private_setup(struct wined3d_surface *surface)
     return WINED3D_OK;
 }
 
-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);
-
-    switch (surface->resource.map_binding)
-    {
-        case WINED3D_LOCATION_SYSMEM:
-        case WINED3D_LOCATION_USER_MEMORY:
-        case WINED3D_LOCATION_DIB:
-            break;
-
-        case WINED3D_LOCATION_BUFFER:
-            context = context_acquire(device, NULL);
-            gl_info = context->gl_info;
-
-            GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, surface->pbo));
-            GL_EXTCALL(glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER));
-            GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
-            checkGLcall("glUnmapBuffer");
-            context_release(context);
-            break;
-
-        default:
-            ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding));
-    }
-
-    if (surface->locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_TEXTURE_RGB))
-    {
-        TRACE("Not dirtified, nothing to do.\n");
-        return;
-    }
-
-    texture = surface->container;
-    if (texture->swapchain && texture->swapchain->front_buffer == texture)
-    {
-        context = context_acquire(device, surface);
-        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 (texture->resource.format_flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
-        FIXME("Depth / stencil buffer locking is not implemented.\n");
-}
-
 static BOOL surface_is_full_rect(const struct wined3d_surface *surface, const RECT *r)
 {
     if ((r->left && r->right) || abs(r->right - r->left) != surface->resource.width)
@@ -1215,7 +1166,6 @@ static const struct wined3d_resource_ops surface_resource_ops =
 static const struct wined3d_surface_ops surface_ops =
 {
     surface_private_setup,
-    surface_unmap,
 };
 
 /*****************************************************************************
@@ -1259,23 +1209,9 @@ static HRESULT gdi_surface_private_setup(struct wined3d_surface *surface)
     return WINED3D_OK;
 }
 
-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 (texture->swapchain && texture == texture->swapchain->front_buffer)
-        x11_copy_to_screen(texture->swapchain, &texture->swapchain->front_buffer_update);
-
-    memset(&texture->swapchain->front_buffer_update, 0, sizeof(texture->swapchain->front_buffer_update));
-}
-
 static const struct wined3d_surface_ops gdi_surface_ops =
 {
     gdi_surface_private_setup,
-    gdi_surface_unmap,
 };
 
 /* This call just downloads data, the caller is responsible for binding the
@@ -2239,6 +2175,11 @@ do { \
 
 HRESULT wined3d_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);
 
     if (!surface->resource.map_count)
@@ -2248,7 +2189,37 @@ HRESULT wined3d_surface_unmap(struct wined3d_surface *surface)
     }
     --surface->resource.map_count;
 
-    surface->surface_ops->surface_unmap(surface);
+    switch (surface->resource.map_binding)
+    {
+        case WINED3D_LOCATION_SYSMEM:
+        case WINED3D_LOCATION_USER_MEMORY:
+        case WINED3D_LOCATION_DIB:
+            break;
+
+        case WINED3D_LOCATION_BUFFER:
+            context = context_acquire(device, NULL);
+            gl_info = context->gl_info;
+
+            GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, surface->pbo));
+            GL_EXTCALL(glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER));
+            GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
+            checkGLcall("glUnmapBuffer");
+            context_release(context);
+            break;
+
+        default:
+            ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding));
+            break;
+    }
+
+    if (!(surface->locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_TEXTURE_RGB)))
+    {
+        texture = surface->container;
+        if (texture->swapchain && texture->swapchain->front_buffer == texture)
+            texture->swapchain->swapchain_ops->swapchain_frontbuffer_updated(texture->swapchain);
+        else if (texture->resource.format_flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
+            FIXME("Depth / stencil buffer locking is not implemented.\n");
+    }
 
     return WINED3D_OK;
 }
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index becad97..9b8d04c 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -647,13 +647,25 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT
     context_release(context);
 }
 
+static void swapchain_gl_frontbuffer_updated(struct wined3d_swapchain *swapchain)
+{
+    struct wined3d_surface *surface;
+    struct wined3d_context *context;
+
+    surface = surface_from_resource(swapchain->front_buffer->sub_resources[0].resource);
+    context = context_acquire(swapchain->device, surface);
+    surface_load_location(surface, context, surface->container->resource.draw_binding);
+    context_release(context);
+    SetRectEmpty(&swapchain->front_buffer_update);
+}
+
 static const struct wined3d_swapchain_ops swapchain_gl_ops =
 {
     swapchain_gl_present,
+    swapchain_gl_frontbuffer_updated,
 };
 
-/* Helper function that blits the front buffer contents to the target window. */
-void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *rect)
+static void swapchain_gdi_frontbuffer_updated(struct wined3d_swapchain *swapchain)
 {
     struct wined3d_surface *front;
     POINT offset = {0, 0};
@@ -661,7 +673,7 @@ void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *r
     RECT draw_rect;
     HWND window;
 
-    TRACE("swapchain %p, rect %s.\n", swapchain, wine_dbgstr_rect(rect));
+    TRACE("swapchain %p.\n", swapchain);
 
     front = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0));
     if (swapchain->palette)
@@ -689,14 +701,14 @@ void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *r
     draw_rect.right = front->resource.width;
     draw_rect.top = 0;
     draw_rect.bottom = front->resource.height;
-
-    if (rect)
-        IntersectRect(&draw_rect, &draw_rect, rect);
+    IntersectRect(&draw_rect, &draw_rect, &swapchain->front_buffer_update);
 
     BitBlt(dst_dc, draw_rect.left - offset.x, draw_rect.top - offset.y,
             draw_rect.right - draw_rect.left, draw_rect.bottom - draw_rect.top,
             src_dc, draw_rect.left, draw_rect.top, SRCCOPY);
     ReleaseDC(window, dst_dc);
+
+    SetRectEmpty(&swapchain->front_buffer_update);
 }
 
 static void swapchain_gdi_present(struct wined3d_swapchain *swapchain, const RECT *src_rect_in,
@@ -755,12 +767,16 @@ static void swapchain_gdi_present(struct wined3d_swapchain *swapchain, const REC
         }
     }
 
-    x11_copy_to_screen(swapchain, NULL);
+    SetRect(&swapchain->front_buffer_update, 0, 0,
+            swapchain->front_buffer->resource.width,
+            swapchain->front_buffer->resource.height);
+    swapchain_gdi_frontbuffer_updated(swapchain);
 }
 
 static const struct wined3d_swapchain_ops swapchain_gdi_ops =
 {
     swapchain_gdi_present,
+    swapchain_gdi_frontbuffer_updated,
 };
 
 static void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 4066c79..ce2f196 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2500,7 +2500,6 @@ struct fbo_entry
 struct wined3d_surface_ops
 {
     HRESULT (*surface_private_setup)(struct wined3d_surface *surface);
-    void (*surface_unmap)(struct wined3d_surface *surface);
 };
 
 struct wined3d_surface
@@ -2916,6 +2915,7 @@ struct wined3d_swapchain_ops
 {
     void (*swapchain_present)(struct wined3d_swapchain *swapchain, const RECT *src_rect,
             const RECT *dst_rect, const RGNDATA *dirty_region, DWORD flags);
+    void (*swapchain_frontbuffer_updated)(struct wined3d_swapchain *swaphchain);
 };
 
 struct wined3d_swapchain
@@ -2948,8 +2948,6 @@ struct wined3d_swapchain
     HWND backup_wnd;
 };
 
-void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *rect) DECLSPEC_HIDDEN;
-
 void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activate) DECLSPEC_HIDDEN;
 struct wined3d_context *swapchain_get_context(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
-- 
2.1.4




More information about the wine-patches mailing list