The old MESA_PBUFFER_ALLOC() function allocated memory on 512-byte boundaries.
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 5 Jul 2005 14:13:42 +0000 (14:13 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 5 Jul 2005 14:13:42 +0000 (14:13 +0000)
Restore that behavior with new _mesa_alloc_texmemory() function.
Should fix via_sse_memcpy() problem in found with flightgear.

src/mesa/main/teximage.c
src/mesa/main/teximage.h
src/mesa/main/texstore.c

index 62153dca4180bbf29b425f79c530da00b6d856aa..b5d2d266b002d8c691b24ea6351723af6ad6f07b 100644 (file)
 #include "mtypes.h"
 
 
+/**
+ * We allocate texture memory on 512-byte boundaries so we can use MMX/SSE
+ * elsewhere.
+ */
+void *
+_mesa_alloc_texmemory(GLsizei bytes)
+{
+   return _mesa_align_malloc(bytes, 512);
+}
+
+
+/**
+ * Free texture memory allocated with _mesa_alloc_texmemory()
+ */
+void
+_mesa_free_texmemory(void *m)
+{
+   _mesa_align_free(m);
+}
+
+
+
+
 #if 0
 static void PrintTexture(GLcontext *ctx, const struct gl_texture_image *img)
 {
@@ -572,17 +595,19 @@ _mesa_new_texture_image( GLcontext *ctx )
 
 /**
  * Free texture image data.
+ * This function is a fallback called via ctx->Driver.FreeTexImageData().
  *
  * \param teximage texture image.
  *
  * Free the texture image data if it's not marked as client data.
  */
 void
-_mesa_free_texture_image_data( GLcontext *ctx, struct gl_texture_image *texImage )
+_mesa_free_texture_image_data(GLcontext *ctx,
+                              struct gl_texture_image *texImage)
 {
    if (texImage->Data && !texImage->IsClientData) {
       /* free the old texture data */
-      _mesa_free(texImage->Data);
+      _mesa_free_texmemory(texImage->Data);
    }
 
    texImage->Data = NULL;
index 5fb696a9503c1c5c1efbb1070e5f25b5b4db6a4b..45c851e5c88227e7047de622257dcabdeb6664fc 100644 (file)
@@ -5,9 +5,9 @@
 
 /*
  * Mesa 3-D graphics library
- * Version:  6.1
+ * Version:  6.3
  *
- * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2005  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"),
 #include "mtypes.h"
 
 
+extern void *
+_mesa_alloc_texmemory(GLsizei bytes);
+
+extern void
+_mesa_free_texmemory(void *m);
+
+
 /** \name Internal functions */
 /*@{*/
 
index 8af23ae07c2fae89d769e4ade02af7a94a1eca3b..a2bd898969497999c935bd0832b4297d86cb7976 100644 (file)
@@ -2207,7 +2207,7 @@ _mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,
       sizeInBytes = texImage->CompressedSize;
    else
       sizeInBytes = postConvWidth * texImage->TexFormat->TexelBytes;
-   texImage->Data = _mesa_malloc(sizeInBytes);
+   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
    if (!texImage->Data) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
       return;
@@ -2295,7 +2295,7 @@ _mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,
       sizeInBytes = texImage->CompressedSize;
    else
       sizeInBytes = postConvWidth * postConvHeight * texelBytes;
-   texImage->Data = _mesa_malloc(sizeInBytes);
+   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
    if (!texImage->Data) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
       return;
@@ -2375,7 +2375,7 @@ _mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level,
       sizeInBytes = texImage->CompressedSize;
    else
       sizeInBytes = width * height * depth * texelBytes;
-   texImage->Data = _mesa_malloc(sizeInBytes);
+   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
    if (!texImage->Data) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
       return;
@@ -2633,7 +2633,7 @@ _mesa_store_compressed_teximage2d(GLcontext *ctx, GLenum target, GLint level,
    texImage->FetchTexelf = texImage->TexFormat->FetchTexel2Df;
 
    /* allocate storage */
-   texImage->Data = _mesa_malloc(imageSize);
+   texImage->Data = _mesa_alloc_texmemory(imageSize);
    if (!texImage->Data) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB");
       return;
@@ -3674,7 +3674,7 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,
 
       /* Free old image data */
       if (dstImage->Data)
-         _mesa_free(dstImage->Data);
+         ctx->Driver.FreeTexImageData(ctx, dstImage);
 
       /* initialize new image */
       _mesa_init_teximage_fields(ctx, target, dstImage, dstWidth, dstHeight,
@@ -3692,7 +3692,7 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,
        */
       if (dstImage->IsCompressed) {
          ASSERT(dstImage->CompressedSize > 0); /* set by init_teximage_fields*/
-         dstImage->Data = _mesa_malloc(dstImage->CompressedSize);
+         dstImage->Data = _mesa_alloc_texmemory(dstImage->CompressedSize);
          if (!dstImage->Data) {
             _mesa_error(ctx, GL_OUT_OF_MEMORY, "generating mipmaps");
             return;
@@ -3704,8 +3704,8 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,
       else {
          bytesPerTexel = srcImage->TexFormat->TexelBytes;
          ASSERT(dstWidth * dstHeight * dstDepth * bytesPerTexel > 0);
-         dstImage->Data = _mesa_malloc(dstWidth * dstHeight * dstDepth
-                                       * bytesPerTexel);
+         dstImage->Data = _mesa_alloc_texmemory(dstWidth * dstHeight
+                                                * dstDepth * bytesPerTexel);
          if (!dstImage->Data) {
             _mesa_error(ctx, GL_OUT_OF_MEMORY, "generating mipmaps");
             return;