Use MESA_PBUFFER_ALLOC/FREE macros to allocate all framebuffer and texture
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 19 Mar 2002 16:47:04 +0000 (16:47 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 19 Mar 2002 16:47:04 +0000 (16:47 +0000)
memory.  These can be overridden by applications which need to manage this
memory specially.  Contributed by Gerk Huisma.
Also, new code for 8-bit -> 16-bit/channel texture image storage which
fills in the least-significant bits properly.

src/mesa/main/context.c
src/mesa/main/image.c
src/mesa/main/teximage.c
src/mesa/main/texstore.c
src/mesa/swrast/s_accum.c
src/mesa/swrast/s_alphabuf.c
src/mesa/swrast/s_depth.c
src/mesa/swrast/s_stencil.c

index 5ed31a18bc0b49a7839acef9e2cacaf1b6fead92..8d0c52a0c34e28b0cba0d9376ab64facda0794b6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.c,v 1.156 2002/03/16 00:53:15 brianp Exp $ */
+/* $Id: context.c,v 1.157 2002/03/19 16:47:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -398,31 +398,31 @@ _mesa_free_framebuffer_data( GLframebuffer *buffer )
       return;
 
    if (buffer->DepthBuffer) {
-      FREE( buffer->DepthBuffer );
+      MESA_PBUFFER_FREE( buffer->DepthBuffer );
       buffer->DepthBuffer = NULL;
    }
    if (buffer->Accum) {
-      FREE( buffer->Accum );
+      MESA_PBUFFER_FREE( buffer->Accum );
       buffer->Accum = NULL;
    }
    if (buffer->Stencil) {
-      FREE( buffer->Stencil );
+      MESA_PBUFFER_FREE( buffer->Stencil );
       buffer->Stencil = NULL;
    }
    if (buffer->FrontLeftAlpha) {
-      FREE( buffer->FrontLeftAlpha );
+      MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
       buffer->FrontLeftAlpha = NULL;
    }
    if (buffer->BackLeftAlpha) {
-      FREE( buffer->BackLeftAlpha );
+      MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
       buffer->BackLeftAlpha = NULL;
    }
    if (buffer->FrontRightAlpha) {
-      FREE( buffer->FrontRightAlpha );
+      MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
       buffer->FrontRightAlpha = NULL;
    }
    if (buffer->BackRightAlpha) {
-      FREE( buffer->BackRightAlpha );
+      MESA_PBUFFER_FREE( buffer->BackRightAlpha );
       buffer->BackRightAlpha = NULL;
    }
 }
index 1d779ea82bdb87a652151e80c8939366247a46b0..fc77bf881866a812034c72211eed13a9a1a8901f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: image.c,v 1.64 2002/03/13 04:34:32 brianp Exp $ */
+/* $Id: image.c,v 1.65 2002/03/19 16:47:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1787,6 +1787,18 @@ _mesa_pack_rgba_span( GLcontext *ctx,
          dest += 3;
       }
    }
+   else if (transferOps == 0 && dstFormat == GL_RGBA && dstType == GL_UNSIGNED_BYTE) {
+      /* common simple case */
+      GLuint i;
+      GLubyte *dest = (GLubyte *) dstAddr;
+      for (i = 0; i < n; i++) {
+         dest[0] = CHAN_TO_UBYTE(srcRgba[i][RCOMP]);
+         dest[1] = CHAN_TO_UBYTE(srcRgba[i][GCOMP]);
+         dest[2] = CHAN_TO_UBYTE(srcRgba[i][BCOMP]);
+         dest[3] = CHAN_TO_UBYTE(srcRgba[i][ACOMP]);
+         dest += 4;
+      }
+   }
    else {
       /* general solution */
       GLuint i;
@@ -2561,52 +2573,118 @@ _mesa_unpack_chan_color_span( GLcontext *ctx,
           srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
 
    /* Try simple cases first */
-   if (transferOps == 0 && srcType == CHAN_TYPE) {
-      if (dstFormat == GL_RGBA) {
-         if (srcFormat == GL_RGBA) {
-            MEMCPY( dest, source, n * 4 * sizeof(GLchan) );
-            return;
+   if (transferOps == 0 ){
+      if (srcType == CHAN_TYPE) {
+         if (dstFormat == GL_RGBA) {
+            if (srcFormat == GL_RGBA) {
+               MEMCPY( dest, source, n * 4 * sizeof(GLchan) );
+               return;
+            }
+            else if (srcFormat == GL_RGB) {
+               GLuint i;
+               const GLchan *src = (const GLchan *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = src[0];
+                  dst[1] = src[1];
+                  dst[2] = src[2];
+                  dst[3] = CHAN_MAX;
+                  src += 3;
+                  dst += 4;
+               }
+               return;
+            }
          }
-         else if (srcFormat == GL_RGB) {
-            GLuint i;
-            const GLchan *src = (const GLchan *) source;
-            GLchan *dst = dest;
-            for (i = 0; i < n; i++) {
-               dst[0] = src[0];
-               dst[1] = src[1];
-               dst[2] = src[2];
-               dst[3] = CHAN_MAX;
-               src += 3;
-               dst += 4;
+         else if (dstFormat == GL_RGB) {
+            if (srcFormat == GL_RGB) {
+               MEMCPY( dest, source, n * 3 * sizeof(GLchan) );
+               return;
+            }
+            else if (srcFormat == GL_RGBA) {
+               GLuint i;
+               const GLchan *src = (const GLchan *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = src[0];
+                  dst[1] = src[1];
+                  dst[2] = src[2];
+                  src += 4;
+                  dst += 3;
+               }
+               return;
             }
+         }
+         else if (dstFormat == srcFormat) {
+            GLint comps = _mesa_components_in_format(srcFormat);
+            assert(comps > 0);
+            MEMCPY( dest, source, n * comps * sizeof(GLchan) );
             return;
          }
       }
-      else if (dstFormat == GL_RGB) {
-         if (srcFormat == GL_RGB) {
-            MEMCPY( dest, source, n * 3 * sizeof(GLchan) );
-            return;
+      /*
+       * Common situation, loading 8bit RGBA/RGB source images
+       * into 16/32 bit destination. (OSMesa16/32)
+       */
+      else if (srcType == GL_UNSIGNED_BYTE) {
+         if (dstFormat == GL_RGBA) {
+            if (srcFormat == GL_RGB) {
+               GLuint i;
+               const GLubyte *src = (const GLubyte *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = UBYTE_TO_CHAN(src[0]);
+                  dst[1] = UBYTE_TO_CHAN(src[1]);
+                  dst[2] = UBYTE_TO_CHAN(src[2]);
+                  dst[3] = CHAN_MAX;
+                  src += 3;
+                  dst += 4;
+               }
+               return;
+            }
+            else if (srcFormat == GL_RGBA) {
+               GLuint i;
+               const GLubyte *src = (const GLubyte *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = UBYTE_TO_CHAN(src[0]);
+                  dst[1] = UBYTE_TO_CHAN(src[1]);
+                  dst[2] = UBYTE_TO_CHAN(src[2]);
+                  dst[3] = UBYTE_TO_CHAN(src[3]);
+                  src += 4;
+                  dst += 4;
+               }
+               return;
+             }
          }
-         else if (srcFormat == GL_RGBA) {
-            GLuint i;
-            const GLchan *src = (const GLchan *) source;
-            GLchan *dst = dest;
-            for (i = 0; i < n; i++) {
-               dst[0] = src[0];
-               dst[1] = src[1];
-               dst[2] = src[2];
-               src += 4;
-               dst += 3;
+         else if (dstFormat == GL_RGB) {
+            if (srcFormat == GL_RGB) {
+               GLuint i;
+               const GLubyte *src = (const GLubyte *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = UBYTE_TO_CHAN(src[0]);
+                  dst[1] = UBYTE_TO_CHAN(src[1]);
+                  dst[2] = UBYTE_TO_CHAN(src[2]);
+                  src += 3;
+                  dst += 3;
+               }
+               return;
+            }
+            else if (srcFormat == GL_RGBA) {
+               GLuint i;
+               const GLubyte *src = (const GLubyte *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = UBYTE_TO_CHAN(src[0]);
+                  dst[1] = UBYTE_TO_CHAN(src[1]);
+                  dst[2] = UBYTE_TO_CHAN(src[2]);
+                  src += 4;
+                  dst += 3;
+               }
+               return;
             }
-            return;
          }
       }
-      else if (dstFormat == srcFormat) {
-         GLint comps = _mesa_components_in_format(srcFormat);
-         assert(comps > 0);
-         MEMCPY( dest, source, n * comps * sizeof(GLchan) );
-         return;
-      }
    }
 
 
index 89cf12c8d0815cba1dfe447aabf649ecab6fdcb8..e383cbdfc9698450ac70a4f03e355e78cb42fa19 100644 (file)
@@ -1,10 +1,10 @@
-/* $Id: teximage.c,v 1.106 2001/11/18 22:48:13 brianp Exp $ */
+/* $Id: teximage.c,v 1.107 2002/03/19 16:47:05 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  4.0.2
  *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -382,7 +382,7 @@ void
 _mesa_free_texture_image( struct gl_texture_image *teximage )
 {
    if (teximage->Data) {
-      FREE( teximage->Data );
+      MESA_PBUFFER_FREE( teximage->Data );
       teximage->Data = NULL;
    }
    FREE( teximage );
@@ -1350,7 +1350,7 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
       }
       else if (texImage->Data) {
          /* free the old texture data */
-         FREE(texImage->Data);
+         MESA_PBUFFER_FREE(texImage->Data);
          texImage->Data = NULL;
       }
       clear_teximage_fields(texImage); /* not really needed, but helpful */
@@ -1475,7 +1475,7 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
       }
       else if (texImage->Data) {
          /* free the old texture data */
-         FREE(texImage->Data);
+         MESA_PBUFFER_FREE(texImage->Data);
          texImage->Data = NULL;
       }
       clear_teximage_fields(texImage); /* not really needed, but helpful */
@@ -1596,7 +1596,7 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
          }
       }
       else if (texImage->Data) {
-         FREE(texImage->Data);
+         MESA_PBUFFER_FREE(texImage->Data);
          texImage->Data = NULL;
       }
       clear_teximage_fields(texImage); /* not really needed, but helpful */
@@ -1866,7 +1866,7 @@ _mesa_CopyTexImage1D( GLenum target, GLint level,
    }
    else if (texImage->Data) {
       /* free the old texture data */
-      FREE(texImage->Data);
+      MESA_PBUFFER_FREE(texImage->Data);
       texImage->Data = NULL;
    }
 
@@ -1930,7 +1930,7 @@ _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat,
    }
    else if (texImage->Data) {
       /* free the old texture data */
-      FREE(texImage->Data);
+      MESA_PBUFFER_FREE(texImage->Data);
       texImage->Data = NULL;
    }
 
@@ -2115,7 +2115,7 @@ _mesa_CompressedTexImage1DARB(GLenum target, GLint level,
          }
       }
       else if (texImage->Data) {
-         FREE(texImage->Data);
+         MESA_PBUFFER_FREE(texImage->Data);
          texImage->Data = NULL;
       }
 
@@ -2214,7 +2214,7 @@ _mesa_CompressedTexImage2DARB(GLenum target, GLint level,
          }
       }
       else if (texImage->Data) {
-         FREE(texImage->Data);
+         MESA_PBUFFER_FREE(texImage->Data);
          texImage->Data = NULL;
       }
 
@@ -2312,7 +2312,7 @@ _mesa_CompressedTexImage3DARB(GLenum target, GLint level,
          }
       }
       else if (texImage->Data) {
-         FREE(texImage->Data);
+         MESA_PBUFFER_FREE(texImage->Data);
          texImage->Data = NULL;
       }
 
index 9798e32390f1e0f0a5b9fd1da031f9c6965e9b51..317e2114f3def574506ae11ed1c2a407fa344d2d 100644 (file)
@@ -1,10 +1,10 @@
-/* $Id: texstore.c,v 1.34 2001/09/19 20:30:44 kschultz Exp $ */
+/* $Id: texstore.c,v 1.35 2002/03/19 16:47:05 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  4.0.2
  *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -645,7 +645,7 @@ _mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,
    }
 
    /* allocate memory */
-   texImage->Data = MALLOC(sizeInBytes);
+   texImage->Data = MESA_PBUFFER_ALLOC(sizeInBytes);
    if (!texImage->Data) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
       return;
@@ -718,7 +718,7 @@ _mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,
    }
 
    /* allocate memory */
-   texImage->Data = MALLOC(sizeInBytes);
+   texImage->Data = MESA_PBUFFER_ALLOC(sizeInBytes);
    if (!texImage->Data) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
       return;
@@ -784,7 +784,7 @@ _mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level,
    }
 
    /* allocate memory */
-   texImage->Data = MALLOC(sizeInBytes);
+   texImage->Data = MESA_PBUFFER_ALLOC(sizeInBytes);
    if (!texImage->Data) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
       return;
@@ -1705,7 +1705,7 @@ _mesa_generate_mipmap(GLcontext *ctx,
 
          /* Free old image data */
          if (dstImage->Data)
-            FREE(dstImage->Data);
+            MESA_PBUFFER_FREE(dstImage->Data);
 
          /* initialize new image */
          _mesa_init_teximage_fields(ctx, dstImage, dstWidth, dstHeight,
@@ -1719,7 +1719,7 @@ _mesa_generate_mipmap(GLcontext *ctx,
          ASSERT(dstWidth * dstHeight * dstDepth * bytesPerTexel > 0);
 
          /* alloc new image buffer */
-         dstImage->Data = MALLOC(dstWidth * dstHeight * dstDepth
+         dstImage->Data = MESA_PBUFFER_ALLOC(dstWidth * dstHeight * dstDepth
                                  * bytesPerTexel);
          if (!dstImage->Data) {
             _mesa_error(ctx, GL_OUT_OF_MEMORY, "generating mipmaps");
index faf8313d4d18d12670df9608be166bf5c93dd4ac..be5c4b4a130bc836cca30c9f2694e4cddde9722f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_accum.c,v 1.15 2002/03/16 00:53:15 brianp Exp $ */
+/* $Id: s_accum.c,v 1.16 2002/03/19 16:47:05 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -74,13 +74,13 @@ _mesa_alloc_accum_buffer( GLframebuffer *buffer )
    GLint n;
 
    if (buffer->Accum) {
-      FREE( buffer->Accum );
+      MESA_PBUFFER_FREE( buffer->Accum );
       buffer->Accum = NULL;
    }
 
    /* allocate accumulation buffer if not already present */
    n = buffer->Width * buffer->Height * 4 * sizeof(GLaccum);
-   buffer->Accum = (GLaccum *) MALLOC( n );
+   buffer->Accum = (GLaccum *) MESA_PBUFFER_ALLOC( n );
    if (!buffer->Accum) {
       /* unable to setup accumulation buffer */
       _mesa_error( NULL, GL_OUT_OF_MEMORY, "glAccum" );
index 2b7c4f7de26764330e4c36d2a5e624e37da72719..56c4d552da2ba84172f727ba803f6b987ff99f0c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_alphabuf.c,v 1.9 2002/03/16 00:53:15 brianp Exp $ */
+/* $Id: s_alphabuf.c,v 1.10 2002/03/19 16:47:05 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -57,9 +57,9 @@ _mesa_alloc_alpha_buffers( GLframebuffer *buffer )
    ASSERT(buffer->UseSoftwareAlphaBuffers);
 
    if (buffer->FrontLeftAlpha) {
-      FREE( buffer->FrontLeftAlpha );
+      MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
    }
-   buffer->FrontLeftAlpha = (GLchan *) MALLOC( bytes );
+   buffer->FrontLeftAlpha = (GLchan *) MESA_PBUFFER_ALLOC( bytes );
    if (!buffer->FrontLeftAlpha) {
       /* out of memory */
       _mesa_error( NULL, GL_OUT_OF_MEMORY,
@@ -68,9 +68,9 @@ _mesa_alloc_alpha_buffers( GLframebuffer *buffer )
 
    if (buffer->Visual.doubleBufferMode) {
       if (buffer->BackLeftAlpha) {
-         FREE( buffer->BackLeftAlpha );
+         MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
       }
-      buffer->BackLeftAlpha = (GLchan *) MALLOC( bytes );
+      buffer->BackLeftAlpha = (GLchan *) MESA_PBUFFER_ALLOC( bytes );
       if (!buffer->BackLeftAlpha) {
          /* out of memory */
          _mesa_error( NULL, GL_OUT_OF_MEMORY,
@@ -80,9 +80,9 @@ _mesa_alloc_alpha_buffers( GLframebuffer *buffer )
 
    if (buffer->Visual.stereoMode) {
       if (buffer->FrontRightAlpha) {
-         FREE( buffer->FrontRightAlpha );
+         MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
       }
-      buffer->FrontRightAlpha = (GLchan *) MALLOC( bytes );
+      buffer->FrontRightAlpha = (GLchan *) MESA_PBUFFER_ALLOC( bytes );
       if (!buffer->FrontRightAlpha) {
          /* out of memory */
          _mesa_error( NULL, GL_OUT_OF_MEMORY,
@@ -91,9 +91,9 @@ _mesa_alloc_alpha_buffers( GLframebuffer *buffer )
 
       if (buffer->Visual.doubleBufferMode) {
          if (buffer->BackRightAlpha) {
-            FREE( buffer->BackRightAlpha );
+            MESA_PBUFFER_FREE( buffer->BackRightAlpha );
          }
-         buffer->BackRightAlpha = (GLchan *) MALLOC( bytes );
+         buffer->BackRightAlpha = (GLchan *) MESA_PBUFFER_ALLOC( bytes );
          if (!buffer->BackRightAlpha) {
             /* out of memory */
             _mesa_error( NULL, GL_OUT_OF_MEMORY,
index cadb0ecd1092f5d62ea899594ab96e72468ec915..81647f9fc9fabb0f314eec90448e6ae837462b97 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_depth.c,v 1.18 2002/03/16 00:53:15 brianp Exp $ */
+/* $Id: s_depth.c,v 1.19 2002/03/19 16:47:05 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1521,7 +1521,7 @@ _mesa_alloc_depth_buffer( GLframebuffer *buffer )
 
    /* deallocate current depth buffer if present */
    if (buffer->DepthBuffer) {
-      FREE(buffer->DepthBuffer);
+      MESA_PBUFFER_FREE(buffer->DepthBuffer);
       buffer->DepthBuffer = NULL;
    }
 
@@ -1531,7 +1531,8 @@ _mesa_alloc_depth_buffer( GLframebuffer *buffer )
    else
       bytesPerValue = sizeof(GLuint);
 
-   buffer->DepthBuffer =MALLOC(buffer->Width * buffer->Height * bytesPerValue);
+   buffer->DepthBuffer = MESA_PBUFFER_ALLOC(buffer->Width * buffer->Height
+                                            * bytesPerValue);
 
    if (!buffer->DepthBuffer) {
       /* out of memory */
index 6d62b65fd56569a9c173a9083fbdb992d3f57619..04e09971770e990438f82646d060ec4d04542d0f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_stencil.c,v 1.21 2002/03/16 00:53:15 brianp Exp $ */
+/* $Id: s_stencil.c,v 1.22 2002/03/19 16:47:05 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1116,13 +1116,13 @@ _mesa_alloc_stencil_buffer( GLframebuffer *buffer )
 {
    /* deallocate current stencil buffer if present */
    if (buffer->Stencil) {
-      FREE(buffer->Stencil);
+      MESA_PBUFFER_FREE(buffer->Stencil);
       buffer->Stencil = NULL;
    }
 
    /* allocate new stencil buffer */
-   buffer->Stencil = (GLstencil *) MALLOC(buffer->Width * buffer->Height
-                                          * sizeof(GLstencil));
+   buffer->Stencil = (GLstencil *)
+      MESA_PBUFFER_ALLOC(buffer->Width * buffer->Height * sizeof(GLstencil));
    if (!buffer->Stencil) {
       /* out of memory */
       _mesa_error( NULL, GL_OUT_OF_MEMORY, "_mesa_alloc_stencil_buffer" );