[PATCH 03/10] wined3d: Merge codepaths in surface_download_data().

Józef Kucia jkucia at codeweavers.com
Mon Apr 18 17:01:27 CDT 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
Also adds some asserations for conditions which should always be met.
---
 dlls/wined3d/surface.c | 214 +++++++++++++++++++++++--------------------------
 1 file changed, 100 insertions(+), 114 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 741bfa3..55f402e 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -947,7 +947,10 @@ static void surface_download_data(struct wined3d_surface *surface, const struct
 {
     struct wined3d_texture *texture = surface->container;
     const struct wined3d_format *format = texture->resource.format;
+    unsigned int dst_row_pitch, dst_slice_pitch;
+    unsigned int src_row_pitch, src_slice_pitch;
     struct wined3d_bo_address data;
+    void *mem;
 
     /* Only support read back of converted P8 surfaces. */
     if (texture->flags & WINED3D_TEXTURE_CONVERTED && format->id != WINED3DFMT_P8_UINT)
@@ -958,134 +961,117 @@ static void surface_download_data(struct wined3d_surface *surface, const struct
 
     wined3d_texture_get_memory(texture, surface_get_sub_resource_idx(surface), &data, dst_location);
 
-    if (texture->resource.format_flags & WINED3DFMT_FLAG_COMPRESSED)
+    if (texture->flags & WINED3D_TEXTURE_COND_NP2_EMULATED)
     {
-        TRACE("(%p) : Calling glGetCompressedTexImage level %d, format %#x, type %#x, data %p.\n",
-                surface, surface->texture_level, format->glFormat, format->glType, data.addr);
+        wined3d_texture_get_pitch(texture, surface->texture_level, &dst_row_pitch, &dst_slice_pitch);
+        wined3d_format_calculate_pitch(format, texture->resource.device->surface_alignment,
+                wined3d_texture_get_level_pow2_width(texture, surface->texture_level),
+                wined3d_texture_get_level_pow2_height(texture, surface->texture_level),
+                &src_row_pitch, &src_slice_pitch);
+        mem = HeapAlloc(GetProcessHeap(), 0, src_slice_pitch);
 
         if (data.buffer_object)
-        {
-            GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, data.buffer_object));
-            checkGLcall("glBindBuffer");
-            GL_EXTCALL(glGetCompressedTexImage(surface->texture_target, surface->texture_level, NULL));
-            checkGLcall("glGetCompressedTexImage");
-            GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
-            checkGLcall("glBindBuffer");
-        }
-        else
-        {
-            GL_EXTCALL(glGetCompressedTexImage(surface->texture_target,
-                    surface->texture_level, data.addr));
-            checkGLcall("glGetCompressedTexImage");
-        }
+            ERR("NP2 emulated texture uses PBO unexpectedly.\n");
+        if (texture->resource.format_flags & WINED3DFMT_FLAG_COMPRESSED)
+            ERR("Unexpected compressed format for NP2 emulated texture.\n");
     }
     else
     {
-        unsigned int dst_row_pitch, dst_slice_pitch;
-        unsigned int src_row_pitch, src_slice_pitch;
-        GLenum gl_format = format->glFormat;
-        GLenum gl_type = format->glType;
-        void *mem;
+        mem = data.addr;
+    }
 
-        if (texture->flags & WINED3D_TEXTURE_COND_NP2_EMULATED)
-        {
-            wined3d_texture_get_pitch(texture, surface->texture_level, &dst_row_pitch, &dst_slice_pitch);
-            wined3d_format_calculate_pitch(format, texture->resource.device->surface_alignment,
-                    wined3d_texture_get_level_pow2_width(texture, surface->texture_level),
-                    wined3d_texture_get_level_pow2_height(texture, surface->texture_level),
-                    &src_row_pitch, &src_slice_pitch);
-            mem = HeapAlloc(GetProcessHeap(), 0, src_slice_pitch);
-        }
-        else
-        {
-            mem = data.addr;
-        }
+    if (data.buffer_object)
+    {
+        GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, data.buffer_object));
+        checkGLcall("glBindBuffer");
+    }
 
-        TRACE("(%p) : Calling glGetTexImage level %d, format %#x, type %#x, data %p\n",
-                surface, surface->texture_level, gl_format, gl_type, mem);
+    if (texture->resource.format_flags & WINED3DFMT_FLAG_COMPRESSED)
+    {
+        TRACE("Downloading compressed surface %p, level %u, format %#x, type %#x, data %p.\n",
+                surface, surface->texture_level, format->glFormat, format->glType, mem);
 
-        if (data.buffer_object)
-        {
-            GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, data.buffer_object));
-            checkGLcall("glBindBuffer");
+        GL_EXTCALL(glGetCompressedTexImage(surface->texture_target, surface->texture_level, mem));
+        checkGLcall("glGetCompressedTexImage");
+    }
+    else
+    {
+        TRACE("Downloading surface %p, level %u, format %#x, type %#x, data %p.\n",
+                surface, surface->texture_level, format->glFormat, format->glType, mem);
 
-            gl_info->gl_ops.gl.p_glGetTexImage(surface->texture_target, surface->texture_level,
-                    gl_format, gl_type, NULL);
-            checkGLcall("glGetTexImage");
+        gl_info->gl_ops.gl.p_glGetTexImage(surface->texture_target, surface->texture_level,
+                format->glFormat, format->glType, mem);
+        checkGLcall("glGetTexImage");
+    }
 
-            GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
-            checkGLcall("glBindBuffer");
-        }
-        else
-        {
-            gl_info->gl_ops.gl.p_glGetTexImage(surface->texture_target, surface->texture_level,
-                    gl_format, gl_type, mem);
-            checkGLcall("glGetTexImage");
-        }
+    if (data.buffer_object)
+    {
+        GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
+        checkGLcall("glBindBuffer");
+    }
 
-        if (texture->flags & WINED3D_TEXTURE_COND_NP2_EMULATED)
+    if (texture->flags & WINED3D_TEXTURE_COND_NP2_EMULATED)
+    {
+        const BYTE *src_data;
+        unsigned int h, y;
+        BYTE *dst_data;
+        /*
+         * Some games (e.g. warhammer 40k) don't work properly with the odd pitches, preventing
+         * the surface pitch from being used to box non-power2 textures. Instead we have to use a hack to
+         * repack the texture so that the bpp * width pitch can be used instead of bpp * pow2width.
+         *
+         * We're doing this...
+         *
+         * instead of boxing the texture :
+         * |<-texture width ->|  -->pow2width|   /\
+         * |111111111111111111|              |   |
+         * |222 Texture 222222| boxed empty  | texture height
+         * |3333 Data 33333333|              |   |
+         * |444444444444444444|              |   \/
+         * -----------------------------------   |
+         * |     boxed  empty | boxed empty  | pow2height
+         * |                  |              |   \/
+         * -----------------------------------
+         *
+         *
+         * we're repacking the data to the expected texture width
+         *
+         * |<-texture width ->|  -->pow2width|   /\
+         * |111111111111111111222222222222222|   |
+         * |222333333333333333333444444444444| texture height
+         * |444444                           |   |
+         * |                                 |   \/
+         * |                                 |   |
+         * |            empty                | pow2height
+         * |                                 |   \/
+         * -----------------------------------
+         *
+         * == is the same as
+         *
+         * |<-texture width ->|    /\
+         * |111111111111111111|
+         * |222222222222222222|texture height
+         * |333333333333333333|
+         * |444444444444444444|    \/
+         * --------------------
+         *
+         * This also means that any references to surface memory should work with the data as if it were a
+         * standard texture with a non-power2 width instead of a texture boxed up to be a power2 texture.
+         *
+         * internally the texture is still stored in a boxed format so any references to textureName will
+         * get a boxed texture with width pow2width and not a texture of width resource.width. */
+        src_data = mem;
+        dst_data = data.addr;
+        TRACE("Repacking the surface data from pitch %u to pitch %u.\n", src_row_pitch, dst_row_pitch);
+        h = wined3d_texture_get_level_height(texture, surface->texture_level);
+        for (y = 0; y < h; ++y)
         {
-            const BYTE *src_data;
-            unsigned int h, y;
-            BYTE *dst_data;
-            /*
-             * Some games (e.g. warhammer 40k) don't work properly with the odd pitches, preventing
-             * the surface pitch from being used to box non-power2 textures. Instead we have to use a hack to
-             * repack the texture so that the bpp * width pitch can be used instead of bpp * pow2width.
-             *
-             * We're doing this...
-             *
-             * instead of boxing the texture :
-             * |<-texture width ->|  -->pow2width|   /\
-             * |111111111111111111|              |   |
-             * |222 Texture 222222| boxed empty  | texture height
-             * |3333 Data 33333333|              |   |
-             * |444444444444444444|              |   \/
-             * -----------------------------------   |
-             * |     boxed  empty | boxed empty  | pow2height
-             * |                  |              |   \/
-             * -----------------------------------
-             *
-             *
-             * we're repacking the data to the expected texture width
-             *
-             * |<-texture width ->|  -->pow2width|   /\
-             * |111111111111111111222222222222222|   |
-             * |222333333333333333333444444444444| texture height
-             * |444444                           |   |
-             * |                                 |   \/
-             * |                                 |   |
-             * |            empty                | pow2height
-             * |                                 |   \/
-             * -----------------------------------
-             *
-             * == is the same as
-             *
-             * |<-texture width ->|    /\
-             * |111111111111111111|
-             * |222222222222222222|texture height
-             * |333333333333333333|
-             * |444444444444444444|    \/
-             * --------------------
-             *
-             * This also means that any references to surface memory should work with the data as if it were a
-             * standard texture with a non-power2 width instead of a texture boxed up to be a power2 texture.
-             *
-             * internally the texture is still stored in a boxed format so any references to textureName will
-             * get a boxed texture with width pow2width and not a texture of width resource.width. */
-            src_data = mem;
-            dst_data = data.addr;
-            TRACE("Repacking the surface data from pitch %u to pitch %u.\n", src_row_pitch, dst_row_pitch);
-            h = wined3d_texture_get_level_height(texture, surface->texture_level);
-            for (y = 0; y < h; ++y)
-            {
-                memcpy(dst_data, src_data, dst_row_pitch);
-                src_data += src_row_pitch;
-                dst_data += dst_row_pitch;
-            }
-
-            HeapFree(GetProcessHeap(), 0, mem);
+            memcpy(dst_data, src_data, dst_row_pitch);
+            src_data += src_row_pitch;
+            dst_data += dst_row_pitch;
         }
+
+        HeapFree(GetProcessHeap(), 0, mem);
     }
 }
 
-- 
2.4.10




More information about the wine-patches mailing list