wined3d: Cleanup the surface loading code a bit

H. Verbeet hverbeet at gmail.com
Mon Sep 11 11:51:18 CDT 2006


This should make the surface loading code slightly more readable.

Changelog:
  - Separate allocation and uploading of textures
  - Move common code for allocating, uploading and downloading
textures into separate functions
  - Set the correct format and type for DXT textures
-------------- next part --------------
 dlls/wined3d/surface.c |  506 +++++++++++++++++++++---------------------------
 dlls/wined3d/utils.c   |   10 -
 2 files changed, 227 insertions(+), 289 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index fe4fd29..908211e 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -49,6 +49,137 @@ typedef enum {
 
 HRESULT d3dfmt_convert_surface(BYTE *src, BYTE *dst, unsigned long len, CONVERT_TYPES convert, IWineD3DSurfaceImpl *surf);
 
+static void surface_download_data(IWineD3DSurfaceImpl *This) {
+    if (This->resource.format == WINED3DFMT_DXT1 ||
+            This->resource.format == WINED3DFMT_DXT2 || This->resource.format == WINED3DFMT_DXT3 ||
+            This->resource.format == WINED3DFMT_DXT4 || This->resource.format == WINED3DFMT_DXT5) {
+        if (!GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { /* We can assume this as the texture would not have been created otherwise */
+            FIXME("(%p) : Attempting to lock a compressed texture when texture compression isn't supported by opengl\n", This);
+        } else {
+            TRACE("(%p) : Calling glGetCompressedTexImageARB level %d, format %#x, type %#x, data %p\n", This, This->glDescription.level,
+                This->glDescription.glFormat, This->glDescription.glType, This->resource.allocatedMemory);
+
+            ENTER_GL();
+
+            GL_EXTCALL(glGetCompressedTexImageARB(This->glDescription.target, This->glDescription.level, This->resource.allocatedMemory));
+            checkGLcall("glGetCompressedTexImageARB()");
+
+            LEAVE_GL();
+        }
+    } else {
+        TRACE("(%p) : Calling glGetTexImage level %d, format %#x, type %#x, data %p\n", This, This->glDescription.level,
+                This->glDescription.glFormat, This->glDescription.glType, This->resource.allocatedMemory);
+
+        ENTER_GL();
+
+        glGetTexImage(This->glDescription.target, This->glDescription.level, This->glDescription.glFormat,
+                This->glDescription.glType, This->resource.allocatedMemory);
+        checkGLcall("glGetTexImage()");
+
+        LEAVE_GL();
+
+        if (wined3d_settings.nonpower2_mode == NP2_REPACK) {
+            /*
+             * 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 allocatedMemory should work with the data as if were a
+             * standard texture with a non-power2 width instead of 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 currentDesc.Width.
+             */
+
+            if (This->Flags & SFLAG_NONPOW2) {
+                LPBYTE src_data, dst_data;
+                int src_pitch = This->bytesPerPixel * This->pow2Width;
+                int dst_pitch = This->bytesPerPixel * This->currentDesc.Width;
+                int y;
+
+                src_data = dst_data = This->resource.allocatedMemory;
+                FIXME("(%p) : Repacking the surface data from pitch %d to pitch %d\n", This, src_pitch, dst_pitch);
+                for (y = 1 ; y < This->currentDesc.Height; y++) {
+                    /* skip the first row */
+                    src_data += src_pitch;
+                    dst_data += dst_pitch;
+                    memcpy(dst_data, src_data, dst_pitch);
+                }
+            }
+        }
+    }
+}
+
+static void surface_upload_data(IWineD3DSurfaceImpl *This, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *data) {
+    if (This->resource.format == WINED3DFMT_DXT1 ||
+            This->resource.format == WINED3DFMT_DXT2 || This->resource.format == WINED3DFMT_DXT3 ||
+            This->resource.format == WINED3DFMT_DXT4 || This->resource.format == WINED3DFMT_DXT5) {
+        if (!GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
+            FIXME("Using DXT1/3/5 without advertized support\n");
+        } else {
+            TRACE("(%p) : Calling glCompressedTexSubImage2D w %d, h %d, data %p\n", This, width, height, data);
+            ENTER_GL();
+            GL_EXTCALL(glCompressedTexSubImage2DARB(This->glDescription.target, This->glDescription.level, 0, 0, width, height,
+                    This->glDescription.glFormatInternal, This->resource.size, data));
+            checkGLcall("glCompressedTexSubImage2D");
+            LEAVE_GL();
+        }
+    } else {
+        TRACE("(%p) : Calling glTexSubImage2D w %d,  h %d, data, %p\n", This, width, height, data);
+        ENTER_GL();
+        glTexSubImage2D(This->glDescription.target, This->glDescription.level, 0, 0, width, height, format, type, data);
+        checkGLcall("glTexSubImage2D");
+        LEAVE_GL();
+    }
+}
+
+static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal, GLsizei width, GLsizei height, GLenum format, GLenum type) {
+    TRACE("(%p) : Creating surface (target %#x)  level %d, d3d format %s, internal format %#x, width %d, height %d, gl format %#x, gl type=%#x\n", This,
+            This->glDescription.target, This->glDescription.level, debug_d3dformat(This->resource.format), internal, width, height, format, type);
+
+    ENTER_GL();
+
+    glTexImage2D(This->glDescription.target, This->glDescription.level, internal, width, height, 0, format, type, NULL);
+    checkGLcall("glTexImage2D");
+
+    LEAVE_GL();
+}
+
 /* *******************************************
    IWineD3DSurface IUnknown parts follow
    ******************************************* */
@@ -162,23 +293,19 @@ #if 0 /* TODO: context manager support *
      IWineD3DContextManager_PushState(This->contextManager, GL_TEXTURE_2D, ENABLED, NOW /* make sure the state is applied now */);
 #endif
     glEnable(This->glDescription.target);/* make sure texture support is enabled in this context */
-    if (This->glDescription.level == 0 &&  This->glDescription.textureName == 0) {
-          glGenTextures(1, &This->glDescription.textureName);
-          checkGLcall("glGenTextures");
-          TRACE("Surface %p given name %d\n", This, This->glDescription.textureName);
-          glBindTexture(This->glDescription.target, This->glDescription.textureName);
-          checkGLcall("glBindTexture");
-          IWineD3DSurface_LoadTexture(iface);
-          /* This is where we should be reducing the amount of GLMemoryUsed */
-    } else {
-        if (This->glDescription.level == 0) {
-          glBindTexture(This->glDescription.target, This->glDescription.textureName);
-          checkGLcall("glBindTexture");
-          IWineD3DSurface_LoadTexture(iface);
-        } else  if (This->glDescription.textureName != 0) { /* NOTE: the level 0 surface of a mpmapped texture must be loaded first! */
-            /* assume this is a coding error not a real error for now */
-            FIXME("Mipmap surface has a glTexture bound to it!\n");
-        }
+    if (!This->glDescription.level) {
+        if (!This->glDescription.textureName) {
+            glGenTextures(1, &This->glDescription.textureName);
+            checkGLcall("glGenTextures");
+            TRACE("Surface %p given name %d\n", This, This->glDescription.textureName);
+        }
+        glBindTexture(This->glDescription.target, This->glDescription.textureName);
+        checkGLcall("glBindTexture");
+        IWineD3DSurface_LoadTexture(iface);
+        /* This is where we should be reducing the amount of GLMemoryUsed */
+    } else if (This->glDescription.textureName) { /* NOTE: the level 0 surface of a mpmapped texture must be loaded first! */
+        /* assume this is a coding error not a real error for now */
+        FIXME("Mipmap surface has a glTexture bound to it!\n");
     }
     if (This->resource.pool == WINED3DPOOL_DEFAULT) {
        /* Tell opengl to try and keep this texture in video ram (well mostly) */
@@ -528,95 +655,11 @@ static HRESULT WINAPI IWineD3DSurfaceImp
                 /* Now I have to copy thing bits back */
                 This->Flags |= SFLAG_ACTIVELOCK; /* When this flag is set to true, loading the surface again won't free THis->resource.allocatedMemory */
                 /* TODO: make activeLock a bit more intelligent, maybe implement a method to purge the texture memory. */
-                ENTER_GL();
-    
+
                 /* Make sure that the texture is loaded */
                 IWineD3DSurface_PreLoad(iface); /* Make sure there is a texture to bind! */
-    
-                TRACE("(%p) glGetTexImage level(%d), fmt(%d), typ(%d), mem(%p)\n" , This, This->glDescription.level,  This->glDescription.glFormat, This->glDescription.glType, This->resource.allocatedMemory);
-    
-                if (This->resource.format == WINED3DFMT_DXT1 ||
-                    This->resource.format == WINED3DFMT_DXT2 ||
-                    This->resource.format == WINED3DFMT_DXT3 ||
-                    This->resource.format == WINED3DFMT_DXT4 ||
-                    This->resource.format == WINED3DFMT_DXT5) {
-                    TRACE("Locking a compressed texture\n");
-                    if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { /* we can assume this as the texture would not have been created otherwise */
-                        GL_EXTCALL(glGetCompressedTexImageARB)(This->glDescription.target,
-                                                            This->glDescription.level,
-                                                            This->resource.allocatedMemory);
-    
-                    } else {
-                        FIXME("(%p) attempting to lock a compressed texture when texture compression isn't supported by opengl\n", This);
-                    }
-                } else {
-                    glGetTexImage(This->glDescription.target,
-                                This->glDescription.level,
-                                This->glDescription.glFormat,
-                                This->glDescription.glType,
-                                This->resource.allocatedMemory);
-                    vcheckGLcall("glGetTexImage");
-                    if (NP2_REPACK == wined3d_settings.nonpower2_mode) {
-                        /* some games (e.g. warhammer 40k) don't work with the odd pitchs properly, 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 the bpp * pow2width.
-        
-                        Were 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
-                        |                  |              |   \/
-                        -----------------------------------
-        
-        
-                        were 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 allocatedMemory should work with the data as if were a standard texture with a non-power2 width instead of 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 currentDesc.Width.
-                        */
-                        if (This->Flags & SFLAG_NONPOW2) {
-                            BYTE* dataa, *datab;
-                            int pitcha = 0, pitchb = 0;
-                            int y;
-                            pitcha = This->bytesPerPixel * This->currentDesc.Width;
-                            pitchb = This->bytesPerPixel * This->pow2Width;
-                            datab = dataa = This->resource.allocatedMemory;
-                            FIXME("(%p) : Repacking the surface data from pitch %d to pitch %d\n", This, pitcha, pitchb);
-                            for (y = 1 ; y < This->currentDesc.Height; y++) {
-                                dataa += pitcha; /* skip the first row */
-                                datab += pitchb;
-                                memcpy(dataa, datab, pitcha);
-                            }
-                        }
-                    }
-                }
-                LEAVE_GL();
+
+                surface_download_data(This);
             }
         } else { /* Nothing to do */
             TRACE("Memory %p already allocted for texture\n",  This->resource.allocatedMemory);
@@ -1750,6 +1793,11 @@ void d3dfmt_p8_upload_palette(IWineD3DSu
 
 static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface) {
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
+    GLenum format, internal, type;
+    CONVERT_TYPES convert;
+    int bpp;
+    int pitch;
+    BYTE *mem;
 
     if (This->Flags & SFLAG_INTEXTURE) {
         TRACE("Surface already in texture\n");
@@ -1785,8 +1833,6 @@ static HRESULT WINAPI IWineD3DSurfaceImp
     }
 
     if (This->Flags & SFLAG_INPBUFFER) {
-        ENTER_GL();
-
         if (This->glDescription.level != 0)
             FIXME("Surface in texture is only supported for level 0\n");
         else if (This->resource.format == WINED3DFMT_P8 || This->resource.format == WINED3DFMT_A8P8 ||
@@ -1796,6 +1842,9 @@ static HRESULT WINAPI IWineD3DSurfaceImp
             FIXME("Format %d not supported\n", This->resource.format);
         else {
             GLint prevRead;
+
+            ENTER_GL();
+
             glGetIntegerv(GL_READ_BUFFER, &prevRead);
             vcheckGLcall("glGetIntegerv");
             glReadBuffer(GL_BACK);
@@ -1813,204 +1862,93 @@ static HRESULT WINAPI IWineD3DSurfaceImp
             checkGLcall("glCopyTexImage2D");
             glReadBuffer(prevRead);
             vcheckGLcall("glReadBuffer");
+
+            LEAVE_GL();
+
             TRACE("Updating target %d\n", This->glDescription.target);
             This->Flags |= SFLAG_INTEXTURE;
         }
-        LEAVE_GL();
         return WINED3D_OK;
     }
 
-    /* TODO: Compressed non-power 2 support */
-
-    if (This->resource.format == WINED3DFMT_DXT1 ||
-        This->resource.format == WINED3DFMT_DXT2 ||
-        This->resource.format == WINED3DFMT_DXT3 ||
-        This->resource.format == WINED3DFMT_DXT4 ||
-        This->resource.format == WINED3DFMT_DXT5) {
-        if (!GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
-            FIXME("Using DXT1/3/5 without advertized support\n");
-        } else if (This->resource.allocatedMemory) {
-            TRACE("Calling glCompressedTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,0=%d, sz=%d, Mem=%p\n",
-                  This->glDescription.target,
-                  This->glDescription.level,
-                  This->glDescription.glFormatInternal,
-                  This->currentDesc.Width,
-                  This->currentDesc.Height,
-                  0,
-                  This->resource.size,
-                  This->resource.allocatedMemory);
-
-            ENTER_GL();
+    if(This->CKeyFlags & DDSD_CKSRCBLT) {
+        This->Flags |= SFLAG_GLCKEY;
+        This->glCKey = This->SrcBltCKey;
+    }
+    else This->Flags &= ~SFLAG_GLCKEY;
 
-            GL_EXTCALL(glCompressedTexImage2DARB)(This->glDescription.target,
-                                                  This->glDescription.level,
-                                                  This->glDescription.glFormatInternal,
-                                                  This->currentDesc.Width,
-                                                  This->currentDesc.Height,
-                                                  0,
-                                                  This->resource.size,
-                                                  This->resource.allocatedMemory);
-            checkGLcall("glCommpressedTexImage2D");
+    d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */, &format, &internal, &type, &convert, &bpp);
 
-            LEAVE_GL();
+    /* The pitch is in 'length' not in bytes */
+    if (NP2_REPACK == wined3d_settings.nonpower2_mode || This->resource.usage & WINED3DUSAGE_RENDERTARGET)
+        pitch = This->currentDesc.Width;
+    else
+        pitch = This->pow2Width;
 
-            if(!(This->Flags & SFLAG_DONOTFREE)){
-                HeapFree(GetProcessHeap(), 0, This->resource.allocatedMemory);
-                This->resource.allocatedMemory = NULL;
-            }
-        }
-    } else {
-        GLenum format, internal, type;
-        CONVERT_TYPES convert;
-        int bpp;
-        int pitch;
-        BYTE *mem;
-
-        if(This->CKeyFlags & DDSD_CKSRCBLT) { 
-            This->Flags |= SFLAG_GLCKEY;
-            This->glCKey = This->SrcBltCKey;
-        }
-        else This->Flags &= ~SFLAG_GLCKEY;
-        d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */, &format, &internal, &type, &convert, &bpp);
-
-        /* The pitch is in 'length' not in bytes */
-        if (NP2_REPACK == wined3d_settings.nonpower2_mode || This->resource.usage & WINED3DUSAGE_RENDERTARGET)
-            pitch = This->currentDesc.Width;
-        else
-            pitch = This->pow2Width;
-
-        if((convert != NO_CONVERSION) && This->resource.allocatedMemory) {
-            int height = This->glRect.bottom - This->glRect.top;
+    if((convert != NO_CONVERSION) && This->resource.allocatedMemory) {
+        int height = This->glRect.bottom - This->glRect.top;
 
-            mem = HeapAlloc(GetProcessHeap(), 0, pitch * height * bpp);
-            if(!mem) {
-                ERR("Out of memory %d, %d!\n", pitch, height);
-                return WINED3DERR_OUTOFVIDEOMEMORY;
-            }
-            d3dfmt_convert_surface(This->resource.allocatedMemory,
-                                    mem,
-                                    pitch*height,
-                                    convert,
-                                    This);
-
-            This->Flags |= SFLAG_CONVERTED;
-        } else if(This->resource.format == WINED3DFMT_P8 && GL_SUPPORT(EXT_PALETTED_TEXTURE)) {
-            d3dfmt_p8_upload_palette(iface, convert);
-            This->Flags &= ~SFLAG_CONVERTED;
-            mem = This->resource.allocatedMemory;
-        } else {
-            This->Flags &= ~SFLAG_CONVERTED;
-            mem = This->resource.allocatedMemory;
+        mem = HeapAlloc(GetProcessHeap(), 0, pitch * height * bpp);
+        if(!mem) {
+            ERR("Out of memory %d, %d!\n", pitch, height);
+            return WINED3DERR_OUTOFVIDEOMEMORY;
         }
+        d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch * height, convert, This);
 
-        /* Make sure the correct pitch is used */
-        glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch);
-
-       /* TODO: possibly use texture rectangle (though we are probably more compatible without it) */
-        if (NP2_REPACK == wined3d_settings.nonpower2_mode && (This->Flags & SFLAG_NONPOW2) && !(This->Flags & SFLAG_OVERSIZE) ) {
-
-
-            TRACE("non power of two support\n");
-            ENTER_GL();
-            TRACE("(%p) Calling 2 glTexImage2D %x i=%d, d3dfmt=%s, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%x, Mem=%p\n", This,
-                This->glDescription.target,
-                This->glDescription.level,
-                debug_d3dformat(This->resource.format),
-                This->glDescription.glFormatInternal,
-                This->pow2Width,
-                This->pow2Height,
-                0,
-                This->glDescription.glFormat,
-                This->glDescription.glType,
-                NULL);
-
-            glTexImage2D(This->glDescription.target,
-                         This->glDescription.level,
-                         This->glDescription.glFormatInternal,
-                         This->pow2Width,
-                         This->pow2Height,
-                         0/*border*/,
-                         This->glDescription.glFormat,
-                         This->glDescription.glType,
-                         NULL);
-
-            checkGLcall("glTexImage2D");
-            if (This->resource.allocatedMemory != NULL) {
-                TRACE("(%p) Calling glTexSubImage2D w(%d) h(%d) mem(%p)\n", This, This->currentDesc.Width, This->currentDesc.Height, This->resource.allocatedMemory);
-                /* And map the non-power two data into the top left corner */
-                glTexSubImage2D(
-                    This->glDescription.target,
-                    This->glDescription.level,
-                    0 /* xoffset */,
-                    0 /* ysoffset */ ,
-                    This->currentDesc.Width,
-                    This->currentDesc.Height,
-                    This->glDescription.glFormat,
-                    This->glDescription.glType,
-                    This->resource.allocatedMemory
-                );
-                checkGLcall("glTexSubImage2D");
-            }
-            LEAVE_GL();
-
-        } else {
-
-            TRACE("Calling 2 glTexImage2D %x i=%d, d3dfmt=%s, intfmt=%x, w=%ld, h=%ld,0=%d, glFmt=%x, glType=%x, Mem=%p\n",
-                This->glDescription.target,
-                This->glDescription.level,
-                debug_d3dformat(This->resource.format),
-                This->glDescription.glFormatInternal,
-                This->glRect.right - This->glRect.left,
-                This->glRect.bottom - This->glRect.top,
-                0,
-                This->glDescription.glFormat,
-                This->glDescription.glType,
-                mem);
+        This->Flags |= SFLAG_CONVERTED;
+    } else if (This->resource.format == WINED3DFMT_P8 && GL_SUPPORT(EXT_PALETTED_TEXTURE)) {
+        d3dfmt_p8_upload_palette(iface, convert);
+        This->Flags &= ~SFLAG_CONVERTED;
+        mem = This->resource.allocatedMemory;
+    } else {
+        This->Flags &= ~SFLAG_CONVERTED;
+        mem = This->resource.allocatedMemory;
+    }
 
-            ENTER_GL();
+    /* Make sure the correct pitch is used */
+    glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch);
 
-            /* OK, create the texture */
-            glTexImage2D(This->glDescription.target,
-                        This->glDescription.level,
-                        internal,
-                        This->glRect.right - This->glRect.left,
-                        This->glRect.bottom - This->glRect.top,
-                        0 /* border */,
-                        format,
-                        type,
-                        mem);
+    if (NP2_REPACK == wined3d_settings.nonpower2_mode && (This->Flags & SFLAG_NONPOW2) && !(This->Flags & SFLAG_OVERSIZE)) {
+        TRACE("non power of two support\n");
+        surface_allocate_surface(This, internal, This->pow2Width, This->pow2Height, format, type);
+        if (mem) {
+            surface_upload_data(This, This->pow2Width, This->pow2Height, format, type, mem);
+        }
+    } else {
+        surface_allocate_surface(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type);
+        if (mem) {
+            surface_upload_data(This, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type, mem);
+        }
+    }
 
-            checkGLcall("glTexImage2D");
+    /* Restore the default pitch */
+    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
 
-            LEAVE_GL();
-        }
-        if(mem != This->resource.allocatedMemory)
-            HeapFree(GetProcessHeap(), 0, mem);
+    if (mem != This->resource.allocatedMemory)
+        HeapFree(GetProcessHeap(), 0, mem);
 
 #if 0
-        {
-            static unsigned int gen = 0;
-            char buffer[4096];
-            ++gen;
-            if ((gen % 10) == 0) {
-                snprintf(buffer, sizeof(buffer), "/tmp/surface%p_type%u_level%u_%u.ppm", This, This->glDescription.target, This->glDescription.level, gen);
-                IWineD3DSurfaceImpl_SaveSnapshot(iface, buffer);
-            }
-            /*
-             * debugging crash code
-            if (gen == 250) {
-              void** test = NULL;
-              *test = 0;
-            }
-            */
-        }
+    {
+        static unsigned int gen = 0;
+        char buffer[4096];
+        ++gen;
+        if ((gen % 10) == 0) {
+            snprintf(buffer, sizeof(buffer), "/tmp/surface%p_type%u_level%u_%u.ppm", This, This->glDescription.target, This->glDescription.level, gen);
+            IWineD3DSurfaceImpl_SaveSnapshot(iface, buffer);
+        }
+        /*
+         * debugging crash code
+         if (gen == 250) {
+         void** test = NULL;
+         *test = 0;
+         }
+         */
+    }
 #endif
-        if(!(This->Flags & SFLAG_DONOTFREE)){
-            HeapFree(GetProcessHeap(),0,This->resource.allocatedMemory);
-            This->resource.allocatedMemory = NULL;
-        }
 
-        glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+    if (!(This->Flags & SFLAG_DONOTFREE)) {
+        HeapFree(GetProcessHeap(), 0, This->resource.allocatedMemory);
+        This->resource.allocatedMemory = NULL;
     }
 
     return WINED3D_OK;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index e0778c0..2d072fa 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -38,11 +38,11 @@ static const PixelFormatDesc formats[] =
     /* FourCC formats, kept here to have WINED3DFMT_R8G8B8(=20) at position 20 */
     {WINED3DFMT_UYVY        ,0x0        ,0x0        ,0x0        ,0x0        ,1/*?*/ ,TRUE       ,0                      ,0                  ,0                              },
     {WINED3DFMT_YUY2        ,0x0        ,0x0        ,0x0        ,0x0        ,1/*?*/ ,TRUE       ,0                      ,0                  ,0                              },
-    {WINED3DFMT_DXT1        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,0        },
-    {WINED3DFMT_DXT2        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,0        },
-    {WINED3DFMT_DXT3        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,0        },
-    {WINED3DFMT_DXT4        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,0        },
-    {WINED3DFMT_DXT5        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,0        },
+    {WINED3DFMT_DXT1        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,GL_RGBA   ,GL_UNSIGNED_BYTE               },
+    {WINED3DFMT_DXT2        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,GL_RGBA   ,GL_UNSIGNED_BYTE               },
+    {WINED3DFMT_DXT3        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,GL_RGBA   ,GL_UNSIGNED_BYTE               },
+    {WINED3DFMT_DXT4        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,GL_RGBA   ,GL_UNSIGNED_BYTE               },
+    {WINED3DFMT_DXT5        ,0x0        ,0x0        ,0x0        ,0x0        ,1      ,TRUE       ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,GL_RGBA   ,GL_UNSIGNED_BYTE               },
     {WINED3DFMT_MULTI2_ARGB ,0x0        ,0x0        ,0x0        ,0x0        ,1/*?*/ ,TRUE       ,0                      ,0                  ,0                              },
     {WINED3DFMT_G8R8_G8B8   ,0x0        ,0x0        ,0x0        ,0x0        ,1/*?*/ ,TRUE       ,0                      ,0                  ,0                              },
     {WINED3DFMT_R8G8_B8G8   ,0x0        ,0x0        ,0x0        ,0x0        ,1/*?*/ ,TRUE       ,0                      ,0                  ,0                              },


More information about the wine-patches mailing list