Henri Verbeet : wined3d: Use GL_UNPACK_ROW_LENGTH for partial updates of regular surfaces in IWineD3DDeviceImpl_UpdateSurface ().

Alexandre Julliard julliard at winehq.org
Tue Mar 30 10:39:45 CDT 2010


Module: wine
Branch: master
Commit: 0eae42ddc678638a6e22e69f5101bbc9aeb3a8ba
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0eae42ddc678638a6e22e69f5101bbc9aeb3a8ba

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Mar 30 11:24:44 2010 +0200

wined3d: Use GL_UNPACK_ROW_LENGTH for partial updates of regular surfaces in IWineD3DDeviceImpl_UpdateSurface().

---

 dlls/wined3d/device.c |   51 ++++++++++++++++++------------------------------
 1 files changed, 19 insertions(+), 32 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index cba1447..351d038 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5261,14 +5261,14 @@ static HRESULT  WINAPI  IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
 
     ENTER_GL();
 
-    /* TODO: Cube and volume support */
-    if (rowoffset) /* Not a whole row so we have to do it a line at a time. */
+    if (dst_format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
     {
-        if (dst_format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
+        const unsigned char *data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface));
+
+        if (rowoffset)
         {
-            const unsigned char *data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface));
             UINT row_length = (srcWidth / src_format_desc->block_width) * src_format_desc->block_byte_count;
-            UINT row_count = srcHeight /  src_format_desc->block_height;
+            UINT row_count = srcHeight / src_format_desc->block_height;
             UINT src_pitch = IWineD3DSurface_GetPitch(pSourceSurface);
             UINT y = destTop;
             UINT row;
@@ -5279,32 +5279,14 @@ static HRESULT  WINAPI  IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
             for (row = 0; row < row_count; ++row)
             {
                 GL_EXTCALL(glCompressedTexSubImage2DARB(dst_impl->texture_target, dst_impl->texture_level,
-                            destLeft, y, srcWidth, src_format_desc->block_height,
-                            dst_format_desc->glInternal, row_length, data));
+                        destLeft, y, srcWidth, src_format_desc->block_height,
+                        dst_format_desc->glInternal, row_length, data));
                 y += src_format_desc->block_height;
                 data += src_pitch;
             }
-            checkGLcall("glCompressedTexSubImage2DARB");
         }
         else
         {
-            const unsigned char *data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
-            unsigned int j;
-
-            for (j = destTop; j < (srcHeight + destTop); ++j)
-            {
-                glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, j,
-                        srcWidth, 1, dst_format_desc->glFormat, dst_format_desc->glType,data);
-                data += rowoffset;
-            }
-        }
-    }
-    else /* Full width, so just write out the whole texture. */
-    {
-        const unsigned char* data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
-
-        if (dst_format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
-        {
             if (destSurfaceHeight != srcHeight || destSurfaceWidth != srcWidth)
             {
                 /* FIXME: The easy way to do this is to lock the destination, and copy the bits across. */
@@ -5320,13 +5302,18 @@ static HRESULT  WINAPI  IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
                         dst_format_desc->glInternal, srcWidth, srcHeight, 0, destSize, data));
             }
         }
-        else
-        {
-            glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, destTop,
-                    srcWidth, srcHeight, dst_format_desc->glFormat, dst_format_desc->glType, data);
-        }
-     }
-    checkGLcall("glTexSubImage2D");
+        checkGLcall("glCompressedTexSubImage2DARB");
+    }
+    else
+    {
+        const unsigned char *data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
+
+        glPixelStorei(GL_UNPACK_ROW_LENGTH, srcSurfaceWidth);
+        glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, destTop,
+                srcWidth, srcHeight, dst_format_desc->glFormat, dst_format_desc->glType, data);
+        glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+        checkGLcall("glTexSubImage2D");
+    }
 
     LEAVE_GL();
     context_release(context);




More information about the wine-cvs mailing list