Mesa (master): mesa: When storing texture data for a 1D array, map each slice separately.

Eric Anholt anholt at kemper.freedesktop.org
Mon Oct 3 14:16:59 PDT 2011


Module: Mesa
Branch: master
Commit: 229ebf511dcd9b501d9299cfc06d029d1d50079d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=229ebf511dcd9b501d9299cfc06d029d1d50079d

Author: Eric Anholt <eric at anholt.net>
Date:   Wed Sep 28 11:17:11 2011 -0700

mesa: When storing texture data for a 1D array, map each slice separately.

Reviewed-by: Brian Paul <brianp at vmware.com>

---

 src/mesa/main/texstore.c |   68 +++++++++++++++++++++++++++++++++++-----------
 1 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
index cbed26c..658db20 100644
--- a/src/mesa/main/texstore.c
+++ b/src/mesa/main/texstore.c
@@ -4626,22 +4626,53 @@ _mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level,
       return;
    }
 
-   /* Map dest texture buffer (write to whole region) */
-   ctx->Driver.MapTextureImage(ctx, texImage, 0,
-                               0, 0, width, height,
-                               rwMode,
-                               &dstMap, &dstRowStride);
-   assert(dstMap);
-   success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
-                            texImage->TexFormat,
-                            dstMap,
-                            0, 0, 0,  /* dstX/Y/Zoffset */
-                            dstRowStride,
-                            &zeroImageOffset,
-                            width, height, 1,
-                            format, type, pixels, packing);
-
-   ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
+   if (target == GL_TEXTURE_1D_ARRAY) {
+      const GLint srcStride =
+         _mesa_image_row_stride(packing, width, format, type);
+      int y;
+
+      success = GL_TRUE;
+
+      for (y = 0; y < height; y++) {
+         /* Map dest texture buffer (write to whole region) */
+         ctx->Driver.MapTextureImage(ctx, texImage, y,
+                                     0, 0, width, 1,
+                                     rwMode,
+                                     &dstMap, &dstRowStride);
+         assert(dstMap);
+         success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
+                                  texImage->TexFormat,
+                                  dstMap,
+                                  0, 0, 0,  /* dstX/Y/Zoffset */
+                                  dstRowStride,
+                                  &zeroImageOffset,
+                                  width, 1, 1,
+                                  format, type, pixels, packing);
+         ctx->Driver.UnmapTextureImage(ctx, texImage, y);
+
+         if (!success)
+            break;
+
+         pixels += srcStride;
+      }
+   } else {
+      /* Map dest texture buffer (write to whole region) */
+      ctx->Driver.MapTextureImage(ctx, texImage, 0,
+                                  0, 0, width, height,
+                                  rwMode,
+                                  &dstMap, &dstRowStride);
+      assert(dstMap);
+      success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
+                               texImage->TexFormat,
+                               dstMap,
+                               0, 0, 0,  /* dstX/Y/Zoffset */
+                               dstRowStride,
+                               &zeroImageOffset,
+                               width, height, 1,
+                               format, type, pixels, packing);
+
+      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
+   }
 
    if (!success)
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
@@ -4691,6 +4722,11 @@ _mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level,
       return;
    }
 
+   if (target == GL_TEXTURE_1D_ARRAY) {
+      depth = height;
+      height = 1;
+   }
+
    sliceMaps = (GLubyte **) malloc(depth * sizeof(GLubyte *));
    dstImageOffsets = (GLuint *) malloc(depth * sizeof(GLuint));
 



More information about the mesa-commit mailing list