[PATCH 4/4] wined3d: Always use screen-sized frontbuffers.

Stefan Dösinger stefan at codeweavers.com
Mon Jul 6 16:47:28 CDT 2015


---
 dlls/wined3d/device.c    |  6 +++---
 dlls/wined3d/surface.c   | 22 +++++++++++++++++-----
 dlls/wined3d/swapchain.c | 27 +++++++++++++--------------
 3 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 56cf325..e5f3b26 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4546,9 +4546,9 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
     {
         UINT i;
 
-        if (FAILED(hr = wined3d_texture_update_desc(swapchain->front_buffer, swapchain->desc.backbuffer_width,
-                swapchain->desc.backbuffer_height, swapchain->desc.backbuffer_format,
-                swapchain->desc.multisample_type, swapchain->desc.multisample_quality, NULL, 0)))
+        if (FAILED(hr = wined3d_texture_update_desc(swapchain->front_buffer, m.width, m.height,
+                swapchain->desc.backbuffer_format, swapchain->desc.multisample_type,
+                swapchain->desc.multisample_quality, NULL, 0)))
             return hr;
 
         for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 597ddca..e3d34f1 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -2725,6 +2725,9 @@ static void read_from_framebuffer(struct wined3d_surface *surface, DWORD dst_loc
     int i;
     BOOL srcIsUpsideDown;
     struct wined3d_bo_address data;
+    ULONG_PTR offset = 0;
+    RECT rect = {0, 0, surface->resource.width, surface->resource.height};
+    DWORD pitch = wined3d_surface_get_pitch(surface);
 
     surface_get_memory(surface, &data, dst_location);
 
@@ -2752,6 +2755,16 @@ static void read_from_framebuffer(struct wined3d_surface *surface, DWORD dst_loc
         gl_info->gl_ops.gl.p_glReadBuffer(buffer);
         checkGLcall("glReadBuffer");
         srcIsUpsideDown = FALSE;
+
+        if (buffer == GL_FRONT)
+        {
+            POINT p = {0, 0};
+            memset(surface->resource.heap_memory, 0xaa, surface->resource.size);
+            GetClientRect(context->win_handle, &rect);
+            ClientToScreen(context->win_handle, &p);
+            offset = pitch * (surface->resource.height - p.y - rect.bottom)
+                    + surface->resource.format->byte_count * p.x;
+        }
     }
 
     if (data.buffer_object)
@@ -2761,14 +2774,13 @@ static void read_from_framebuffer(struct wined3d_surface *surface, DWORD dst_loc
     }
 
     /* Setup pixel store pack state -- to glReadPixels into the correct place */
-    gl_info->gl_ops.gl.p_glPixelStorei(GL_PACK_ROW_LENGTH,
-            wined3d_surface_get_pitch(surface) / surface->resource.format->byte_count);
+    gl_info->gl_ops.gl.p_glPixelStorei(GL_PACK_ROW_LENGTH, pitch / surface->resource.format->byte_count);
     checkGLcall("glPixelStorei");
 
-    gl_info->gl_ops.gl.p_glReadPixels(0, 0,
-            surface->resource.width, surface->resource.height,
+    gl_info->gl_ops.gl.p_glReadPixels(rect.left, rect.top,
+            rect.right - rect.left, rect.bottom - rect.top,
             surface->resource.format->glFormat,
-            surface->resource.format->glType, data.addr);
+            surface->resource.format->glType, data.addr + offset);
     checkGLcall("glReadPixels");
 
     /* Reset previous pixel store pack state */
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 146f5d6..18bba72 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -159,22 +159,11 @@ HRESULT CDECL wined3d_swapchain_get_front_buffer_data(const struct wined3d_swapc
         struct wined3d_surface *dst_surface)
 {
     struct wined3d_surface *src_surface;
-    RECT src_rect, dst_rect;
 
     TRACE("swapchain %p, dst_surface %p.\n", swapchain, dst_surface);
 
     src_surface = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0));
-    SetRect(&src_rect, 0, 0, src_surface->resource.width, src_surface->resource.height);
-    dst_rect = src_rect;
-
-    if (swapchain->desc.windowed)
-    {
-        MapWindowPoints(swapchain->win_handle, NULL, (POINT *)&dst_rect, 2);
-        FIXME("Using destination rect %s in windowed mode, this is likely wrong.\n",
-                wine_dbgstr_rect(&dst_rect));
-    }
-
-    return wined3d_surface_blt(dst_surface, &dst_rect, src_surface, &src_rect, 0, NULL, WINED3D_TEXF_POINT);
+    return wined3d_surface_blt(dst_surface, NULL, src_surface, NULL, 0, NULL, WINED3D_TEXF_POINT);
 }
 
 struct wined3d_surface * CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain,
@@ -849,8 +838,16 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
     surface_desc.multisample_quality = swapchain->desc.multisample_quality;
     surface_desc.usage = 0;
     surface_desc.pool = WINED3D_POOL_DEFAULT;
-    surface_desc.width = swapchain->desc.backbuffer_width;
-    surface_desc.height = swapchain->desc.backbuffer_height;
+    if (desc->windowed)
+    {
+        surface_desc.width = swapchain->original_mode.width;
+        surface_desc.height = swapchain->original_mode.height;
+    }
+    else
+    {
+        surface_desc.width = swapchain->desc.backbuffer_width;
+        surface_desc.height = swapchain->desc.backbuffer_height;
+    }
     surface_desc.depth = 1;
     surface_desc.size = 0;
 
@@ -960,6 +957,8 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
         }
 
         surface_desc.usage |= WINED3DUSAGE_RENDERTARGET;
+        surface_desc.width = swapchain->desc.backbuffer_width;
+        surface_desc.height = swapchain->desc.backbuffer_height;
         for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
         {
             struct wined3d_surface *back_buffer;
-- 
2.3.6




More information about the wine-patches mailing list