[PATCH 4/5] wined3d: Use draw_textured_quad() in swapchain_blit().

Henri Verbeet hverbeet at codeweavers.com
Wed Mar 22 17:11:28 CDT 2017


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/swapchain.c | 74 +++++++++---------------------------------------
 1 file changed, 14 insertions(+), 60 deletions(-)

diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index dff1354..a52edf6 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -310,6 +310,7 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain,
     UINT src_h = src_rect->bottom - src_rect->top;
     GLenum gl_filter;
     const struct wined3d_gl_info *gl_info = context->gl_info;
+    enum wined3d_texture_filter_type filter;
     RECT win_rect;
     UINT win_h;
 
@@ -317,9 +318,15 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain,
             swapchain, context, wine_dbgstr_rect(src_rect), wine_dbgstr_rect(dst_rect));
 
     if (src_w == dst_rect->right - dst_rect->left && src_h == dst_rect->bottom - dst_rect->top)
+    {
+        filter = WINED3D_TEXF_NONE;
         gl_filter = GL_NEAREST;
+    }
     else
+    {
+        filter = WINED3D_TEXF_LINEAR;
         gl_filter = GL_LINEAR;
+    }
 
     GetClientRect(swapchain->win_handle, &win_rect);
     win_h = win_rect.bottom - win_rect.top;
@@ -361,75 +368,22 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain,
     {
         struct wined3d_device *device = swapchain->device;
         struct wined3d_context *context2;
-        float tex_left = src_rect->left;
-        float tex_top = src_rect->top;
-        float tex_right = src_rect->right;
-        float tex_bottom = src_rect->bottom;
+        RECT r;
 
         context2 = context_acquire(device, texture, 0);
         context_apply_blit_state(context2, device);
 
-        if (texture->flags & WINED3D_TEXTURE_NORMALIZED_COORDS)
-        {
-            tex_left /= texture->pow2_width;
-            tex_right /= texture->pow2_width;
-            tex_top /= texture->pow2_height;
-            tex_bottom /= texture->pow2_height;
-        }
+        r = *dst_rect;
+        surface_translate_drawable_coords(back_buffer, swapchain->win_handle, &r);
 
         if (is_complex_fixup(texture->resource.format->color_fixup))
-            gl_filter = GL_NEAREST;
-
-        context_apply_fbo_state_blit(context2, GL_FRAMEBUFFER, front_buffer, NULL, WINED3D_LOCATION_DRAWABLE);
-        context_bind_texture(context2, back_buffer->texture_target, texture->texture_rgb.name);
-
-        /* Set up the texture. The surface is not in a wined3d_texture
-         * container, so there are no D3D texture settings to dirtify. */
-        device->blitter->set_shader(device->blit_priv, context2, back_buffer, NULL);
-        gl_info->gl_ops.gl.p_glTexParameteri(back_buffer->texture_target, GL_TEXTURE_MIN_FILTER, gl_filter);
-        gl_info->gl_ops.gl.p_glTexParameteri(back_buffer->texture_target, GL_TEXTURE_MAG_FILTER, gl_filter);
-        if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
-            gl_info->gl_ops.gl.p_glTexParameteri(back_buffer->texture_target,
-                    GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
+            filter = WINED3D_TEXF_NONE;
 
+        context_apply_fbo_state_blit(context2, GL_FRAMEBUFFER, back_buffer, NULL, WINED3D_LOCATION_DRAWABLE);
         context_set_draw_buffer(context, GL_BACK);
 
-        /* Set the viewport to the destination rectandle, disable any projection
-         * transformation set up by context_apply_blit_state(), and draw a
-         * (-1,-1)-(1,1) quad.
-         *
-         * Back up viewport and matrix to avoid breaking last_was_blit
-         *
-         * Note that context_apply_blit_state() set up viewport and ortho to
-         * match the surface size - we want the GL drawable(=window) size. */
-        gl_info->gl_ops.gl.p_glPushAttrib(GL_VIEWPORT_BIT);
-        gl_info->gl_ops.gl.p_glViewport(dst_rect->left, win_h - dst_rect->bottom,
-                dst_rect->right, win_h - dst_rect->top);
-        gl_info->gl_ops.gl.p_glMatrixMode(GL_PROJECTION);
-        gl_info->gl_ops.gl.p_glPushMatrix();
-        gl_info->gl_ops.gl.p_glLoadIdentity();
-
-        gl_info->gl_ops.gl.p_glBegin(GL_QUADS);
-            /* bottom left */
-            gl_info->gl_ops.gl.p_glTexCoord2f(tex_left, tex_bottom);
-            gl_info->gl_ops.gl.p_glVertex2i(-1, -1);
-
-            /* top left */
-            gl_info->gl_ops.gl.p_glTexCoord2f(tex_left, tex_top);
-            gl_info->gl_ops.gl.p_glVertex2i(-1, 1);
-
-            /* top right */
-            gl_info->gl_ops.gl.p_glTexCoord2f(tex_right, tex_top);
-            gl_info->gl_ops.gl.p_glVertex2i(1, 1);
-
-            /* bottom right */
-            gl_info->gl_ops.gl.p_glTexCoord2f(tex_right, tex_bottom);
-            gl_info->gl_ops.gl.p_glVertex2i(1, -1);
-        gl_info->gl_ops.gl.p_glEnd();
-
-        gl_info->gl_ops.gl.p_glPopMatrix();
-        gl_info->gl_ops.gl.p_glPopAttrib();
-
+        device->blitter->set_shader(device->blit_priv, context2, back_buffer, NULL);
+        draw_textured_quad(back_buffer, context2, src_rect, &r, filter);
         device->blitter->unset_shader(context->gl_info);
         checkGLcall("Swapchain present blit(manual)\n");
 
-- 
2.1.4




More information about the wine-patches mailing list