Module: Mesa
Branch: mesa_7_7_branch
Commit: 9d0af686b27b82dce8ad1ee4c951098660807be6
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9d0af686b27b82dce8ad1ee4c951098660807be6

Author: Maciej Cencora <[email protected]>
Date:   Sat Nov 14 15:03:31 2009 +0100

radeon: minor refactoring of texture code

Also properly set dstImageOffsets for TexSubImage case.

---

 src/mesa/drivers/dri/radeon/radeon_texture.c |   57 +++++++++++++++++++++-----
 1 files changed, 46 insertions(+), 11 deletions(-)

diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c 
b/src/mesa/drivers/dri/radeon/radeon_texture.c
index 607ce78..8fc6865 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
@@ -508,6 +508,27 @@ gl_format radeonChooseTextureFormat(GLcontext * ctx,
        return MESA_FORMAT_NONE;                /* never get here */
 }
 
+static GLuint * allocate_image_offsets(GLcontext *ctx,
+       unsigned alignedWidth,
+       unsigned height,
+       unsigned depth)
+{
+       int i;
+       GLuint *offsets;
+
+       offsets = _mesa_malloc(depth * sizeof(GLuint)) ;
+       if (!offsets) {
+               _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTex[Sub]Image");
+               return NULL;
+       }
+
+       for (i = 0; i < depth; ++i) {
+               offsets[i] = alignedWidth * height * i;
+       }
+
+       return offsets;
+}
+
 /**
  * All glTexImage calls go through this function.
  */
@@ -605,8 +626,8 @@ static void radeon_teximage(
        }
 
        if (pixels) {
-               radeon_teximage_map(image, GL_TRUE);
                if (compressed) {
+                       radeon_teximage_map(image, GL_TRUE);
                        if (image->mt) {
                                uint32_t srcRowStride, bytesPerRow, rows;
                                srcRowStride = 
_mesa_format_row_stride(texImage->TexFormat, width);
@@ -629,19 +650,17 @@ static void radeon_teximage(
                        }
 
                        if (dims == 3) {
-                               int i;
-
-                               dstImageOffsets = _mesa_malloc(depth * 
sizeof(GLuint)) ;
-                               if (!dstImageOffsets)
-                                       _mesa_error(ctx, GL_OUT_OF_MEMORY, 
"glTexImage");
-
-                               for (i = 0; i < depth; ++i) {
-                                       dstImageOffsets[i] = 
dstRowStride/_mesa_get_format_bytes(texImage->TexFormat) * height * i;
+                               unsigned alignedWidth = 
dstRowStride/_mesa_get_format_bytes(texImage->TexFormat);
+                               dstImageOffsets = allocate_image_offsets(ctx, 
alignedWidth, height, depth);
+                               if (!dstImageOffsets) {
+                                       return;
                                }
                        } else {
                                dstImageOffsets = texImage->ImageOffsets;
                        }
 
+                       radeon_teximage_map(image, GL_TRUE);
+
                        if (!_mesa_texstore(ctx, dims,
                                            texImage->_BaseFormat,
                                            texImage->TexFormat,
@@ -752,7 +771,7 @@ static void radeon_texsubimage(GLcontext* ctx, int dims, 
GLenum target, int leve
 
        if (pixels) {
                GLint dstRowStride;
-               radeon_teximage_map(image, GL_TRUE);
+               GLuint *dstImageOffsets;
 
                if (image->mt) {
                        radeon_mipmap_level *lvl = 
&image->mt->levels[image->mtlevel];
@@ -761,6 +780,18 @@ static void radeon_texsubimage(GLcontext* ctx, int dims, 
GLenum target, int leve
                        dstRowStride = texImage->RowStride * 
_mesa_get_format_bytes(texImage->TexFormat);
                }
 
+               if (dims == 3) {
+                       unsigned alignedWidth = 
dstRowStride/_mesa_get_format_bytes(texImage->TexFormat);
+                       dstImageOffsets = allocate_image_offsets(ctx, 
alignedWidth, height, depth);
+                       if (!dstImageOffsets) {
+                               return;
+                       }
+               } else {
+                       dstImageOffsets = texImage->ImageOffsets;
+               }
+
+               radeon_teximage_map(image, GL_TRUE);
+
                if (compressed) {
                        uint32_t srcRowStride, bytesPerRow, rows;
                        GLubyte *img_start;
@@ -786,12 +817,16 @@ static void radeon_texsubimage(GLcontext* ctx, int dims, 
GLenum target, int leve
                                            texImage->TexFormat, texImage->Data,
                                            xoffset, yoffset, zoffset,
                                            dstRowStride,
-                                           texImage->ImageOffsets,
+                                           dstImageOffsets,
                                            width, height, depth,
                                            format, type, pixels, packing)) {
                                _mesa_error(ctx, GL_OUT_OF_MEMORY, 
"glTexSubImage");
                        }
                }
+
+               if (dims == 3) {
+                       _mesa_free(dstImageOffsets);
+               }
        }
 
        radeon_teximage_unmap(image);

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to