swrast: Move ImageOffsets allocation to shared code.
authorEric Anholt <eric@anholt.net>
Fri, 19 Apr 2013 18:56:35 +0000 (11:56 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 30 Apr 2013 17:40:43 +0000 (10:40 -0700)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/drivers/dri/intel/intel_tex.c
src/mesa/drivers/dri/radeon/radeon_texture.c
src/mesa/swrast/s_texture.c
src/mesa/swrast/swrast.h

index ee8db71372bcb32a28d6743b6a8607a9bfebdfaa..2fbd5c4e81527e4b38c6001805a97a30812a09bd 100644 (file)
@@ -64,7 +64,6 @@ intel_alloc_texture_image_buffer(struct gl_context *ctx,
    struct intel_texture_image *intel_image = intel_texture_image(image);
    struct gl_texture_object *texobj = image->TexObject;
    struct intel_texture_object *intel_texobj = intel_texture_object(texobj);
-   GLuint slices;
 
    assert(image->Border == 0);
 
@@ -81,23 +80,8 @@ intel_alloc_texture_image_buffer(struct gl_context *ctx,
     */
    ctx->Driver.FreeTextureImageBuffer(ctx, image);
 
-   /* Allocate the swrast_texture_image::ImageOffsets array now */
-   switch (texobj->Target) {
-   case GL_TEXTURE_3D:
-   case GL_TEXTURE_2D_ARRAY:
-   case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
-      slices = image->Depth;
-      break;
-   case GL_TEXTURE_1D_ARRAY:
-      slices = image->Height;
-      break;
-   default:
-      slices = 1;
-   }
-   assert(!intel_image->base.ImageOffsets);
-   intel_image->base.ImageOffsets = malloc(slices * sizeof(GLuint));
-
-   _swrast_init_texture_image(image);
+   if (!_swrast_init_texture_image(image))
+      return false;
 
    if (intel_texobj->mt &&
        intel_miptree_match_image(intel_texobj->mt, image)) {
index b6e551cd99228339ff1ca1fd5d6aa625298d40cd..a953858d3bb51a2b80524827366ac7f6fdf2c701 100644 (file)
@@ -105,23 +105,12 @@ radeonAllocTextureImageBuffer(struct gl_context *ctx,
                              struct gl_texture_image *timage)
 {
        radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
-       radeon_texture_image *image = get_radeon_texture_image(timage);
        struct gl_texture_object *texobj = timage->TexObject;
-       int slices;
 
        ctx->Driver.FreeTextureImageBuffer(ctx, timage);
 
-       switch (texobj->Target) {
-       case GL_TEXTURE_3D:
-               slices = timage->Depth;
-               break;
-       default:
-               slices = 1;
-       }
-       assert(!image->base.ImageOffsets);
-       image->base.ImageOffsets = malloc(slices * sizeof(GLuint));
-
-       _swrast_init_texture_image(timage);
+       if (!_swrast_init_texture_image(timage))
+               return GL_FALSE;
 
        teximage_assign_miptree(rmesa, texobj, timage);
                                
index 82b2ce6f18b455236f9fa02e371b60a55b7b5dcb..4d3cd0f8ce1c92294de7043635922b0364072eca 100644 (file)
@@ -92,6 +92,9 @@ _swrast_alloc_texture_image_buffer(struct gl_context *ctx,
                                           texImage->Height, texImage->Depth);
    GLuint i;
 
+   if (!_swrast_init_texture_image(texImage))
+      return GL_FALSE;
+
    assert(!swImg->Buffer);
    swImg->Buffer = _mesa_align_malloc(bytes, 512);
    if (!swImg->Buffer)
@@ -100,20 +103,10 @@ _swrast_alloc_texture_image_buffer(struct gl_context *ctx,
    /* RowStride and ImageOffsets[] describe how to address texels in 'Data' */
    swImg->RowStride = texImage->Width;
 
-   /* Allocate the ImageOffsets array and initialize to typical values.
-    * We allocate the array for 1D/2D textures too in order to avoid special-
-    * case code in the texstore routines.
-    */
-   swImg->ImageOffsets = malloc(texture_slices(texImage) * sizeof(GLuint));
-   if (!swImg->ImageOffsets)
-      return GL_FALSE;
-
    for (i = 0; i < texture_slices(texImage); i++) {
       swImg->ImageOffsets[i] = i * texImage->Width * texImage->Height;
    }
 
-   _swrast_init_texture_image(texImage);
-
    return GL_TRUE;
 }
 
@@ -121,11 +114,11 @@ _swrast_alloc_texture_image_buffer(struct gl_context *ctx,
 /**
  * Code that overrides ctx->Driver.AllocTextureImageBuffer may use this to
  * initialize the fields of swrast_texture_image without allocating the image
- * buffer or initializing ImageOffsets or RowStride.
+ * buffer or initializing RowStride or the contents of ImageOffsets.
  *
  * Returns GL_TRUE on success, GL_FALSE on memory allocation failure.
  */
-void
+GLboolean
 _swrast_init_texture_image(struct gl_texture_image *texImage)
 {
    struct swrast_texture_image *swImg = swrast_texture_image(texImage);
@@ -149,6 +142,13 @@ _swrast_init_texture_image(struct gl_texture_image *texImage)
       swImg->HeightScale = (GLfloat) texImage->Height;
       swImg->DepthScale = (GLfloat) texImage->Depth;
    }
+
+   assert(!swImg->ImageOffsets);
+   swImg->ImageOffsets = malloc(texture_slices(texImage) * sizeof(GLuint));
+   if (!swImg->ImageOffsets)
+      return GL_FALSE;
+
+   return GL_TRUE;
 }
 
 
index ce2a5a3ae1d04a3a5c180b505fc5a214bcdf6a62..e437c0a2459c5364534dbc90417c6226408c3348 100644 (file)
@@ -218,7 +218,7 @@ extern GLboolean
 _swrast_alloc_texture_image_buffer(struct gl_context *ctx,
                                    struct gl_texture_image *texImage);
 
-extern void
+extern GLboolean
 _swrast_init_texture_image(struct gl_texture_image *texImage);
 
 extern void