diff options
author | Keith Whitwell <keith@tungstengraphics.com> | 2005-02-01 11:25:21 +0000 |
---|---|---|
committer | Keith Whitwell <keith@tungstengraphics.com> | 2005-02-01 11:25:21 +0000 |
commit | aebc1b06c5a85f1cf19b23361d21f3fefac13f9b (patch) | |
tree | bd15d950b8ed591305928b26cc234ec9af38cea9 | |
parent | 54f513cfce8c96616c648922221def03696b6246 (diff) |
Use a driver callback to free texture image data.
-rw-r--r-- | src/mesa/main/context.c | 1 | ||||
-rw-r--r-- | src/mesa/main/dd.h | 6 | ||||
-rw-r--r-- | src/mesa/main/teximage.c | 84 | ||||
-rw-r--r-- | src/mesa/main/teximage.h | 7 | ||||
-rw-r--r-- | src/mesa/main/texobj.c | 2 |
5 files changed, 63 insertions, 37 deletions
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 779d11061b..59d63ee035 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1507,6 +1507,7 @@ _mesa_initialize_context( GLcontext *ctx, { ASSERT(driverContext); assert(driverFunctions->NewTextureObject); + assert(driverFunctions->FreeTexImageData); /* If the driver wants core Mesa to use special imports, it'll have to * override these defaults. diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index f7f7eacf06..a84336b796 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -505,11 +505,17 @@ struct dd_function_table { */ void (*DeleteTexture)( GLcontext *ctx, struct gl_texture_object *tObj ); + /** * Called to allocate a new texture image object. */ struct gl_texture_image * (*NewTextureImage)( GLcontext *ctx ); + /** + * Called to free tImage->Data. + */ + void (*FreeTexImageData)( GLcontext *ctx, struct gl_texture_image *tImage ); + /** * Called by glAreTextureResident(). */ diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 55d7511679..db7967aa47 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -570,21 +570,39 @@ _mesa_new_texture_image( GLcontext *ctx ) /** + * Free texture image data. + * + * \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 ) +{ + if (texImage->Data && !texImage->IsClientData) { + /* free the old texture data */ + MESA_PBUFFER_FREE(texImage->Data); + } + + texImage->Data = NULL; +} + + +/** * Free texture image. * * \param teximage texture image. * - * Free the texture image structure and the associated image data if it's not - * marked as client data. + * Free the texture image structure and the associated image data. */ void -_mesa_delete_texture_image( struct gl_texture_image *teximage ) +_mesa_delete_texture_image( GLcontext *ctx, struct gl_texture_image *texImage ) { - if (teximage->Data && !teximage->IsClientData) { - MESA_PBUFFER_FREE( teximage->Data ); - teximage->Data = NULL; + if (texImage->Data) { + ctx->Driver.FreeTexImageData( ctx, texImage ); } - FREE( teximage ); + ASSERT(texImage->Data == NULL); + FREE( texImage ); } @@ -2019,11 +2037,10 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); return; } - else if (texImage->Data && !texImage->IsClientData) { - /* free the old texture data */ - MESA_PBUFFER_FREE(texImage->Data); + else if (texImage->Data) { + ctx->Driver.FreeTexImageData( ctx, texImage ); } - texImage->Data = NULL; + ASSERT(texImage->Data == NULL); clear_teximage_fields(texImage); /* not really needed, but helpful */ _mesa_init_teximage_fields(ctx, target, texImage, postConvWidth, 1, 1, @@ -2119,11 +2136,10 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); return; } - else if (texImage->Data && !texImage->IsClientData) { - /* free the old texture data */ - MESA_PBUFFER_FREE(texImage->Data); + else if (texImage->Data) { + ctx->Driver.FreeTexImageData( ctx, texImage ); } - texImage->Data = NULL; + ASSERT(texImage->Data == NULL); clear_teximage_fields(texImage); /* not really needed, but helpful */ _mesa_init_teximage_fields(ctx, target, texImage, postConvWidth, postConvHeight, 1, @@ -2214,10 +2230,10 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); return; } - else if (texImage->Data && !texImage->IsClientData) { - MESA_PBUFFER_FREE(texImage->Data); + else if (texImage->Data) { + ctx->Driver.FreeTexImageData( ctx, texImage ); } - texImage->Data = NULL; + ASSERT(texImage->Data == NULL); clear_teximage_fields(texImage); /* not really needed, but helpful */ _mesa_init_teximage_fields(ctx, target, texImage, width, height, depth, @@ -2454,11 +2470,10 @@ _mesa_CopyTexImage1D( GLenum target, GLint level, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage1D"); return; } - else if (texImage->Data && !texImage->IsClientData) { - /* free the old texture data */ - MESA_PBUFFER_FREE(texImage->Data); + else if (texImage->Data) { + ctx->Driver.FreeTexImageData( ctx, texImage ); } - texImage->Data = NULL; + ASSERT(texImage->Data == NULL); clear_teximage_fields(texImage); /* not really needed, but helpful */ _mesa_init_teximage_fields(ctx, target, texImage, postConvWidth, 1, 1, @@ -2517,11 +2532,10 @@ _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage2D"); return; } - else if (texImage->Data && !texImage->IsClientData) { - /* free the old texture data */ - MESA_PBUFFER_FREE(texImage->Data); + else if (texImage->Data) { + ctx->Driver.FreeTexImageData( ctx, texImage ); } - texImage->Data = NULL; + ASSERT(texImage->Data == NULL); clear_teximage_fields(texImage); /* not really needed, but helpful */ _mesa_init_teximage_fields(ctx, target, texImage, @@ -2866,10 +2880,10 @@ _mesa_CompressedTexImage1DARB(GLenum target, GLint level, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage1D"); return; } - else if (texImage->Data && !texImage->IsClientData) { - MESA_PBUFFER_FREE(texImage->Data); + else if (texImage->Data) { + ctx->Driver.FreeTexImageData( ctx, texImage ); } - texImage->Data = NULL; + ASSERT(texImage->Data == NULL); _mesa_init_teximage_fields(ctx, target, texImage, width, 1, 1, border, internalFormat); @@ -2948,10 +2962,10 @@ _mesa_CompressedTexImage2DARB(GLenum target, GLint level, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); return; } - else if (texImage->Data && !texImage->IsClientData) { - MESA_PBUFFER_FREE(texImage->Data); + else if (texImage->Data) { + ctx->Driver.FreeTexImageData( ctx, texImage ); } - texImage->Data = NULL; + ASSERT(texImage->Data == NULL); _mesa_init_teximage_fields(ctx, target, texImage, width, height, 1, border, internalFormat); @@ -3029,10 +3043,10 @@ _mesa_CompressedTexImage3DARB(GLenum target, GLint level, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage3D"); return; } - else if (texImage->Data && !texImage->IsClientData) { - MESA_PBUFFER_FREE(texImage->Data); + else if (texImage->Data) { + ctx->Driver.FreeTexImageData( ctx, texImage ); } - texImage->Data = NULL; + ASSERT(texImage->Data == NULL); _mesa_init_teximage_fields(ctx, target, texImage, width, height, depth, border, internalFormat); diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h index d7b927ff64..5fb696a950 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -47,7 +47,12 @@ _mesa_new_texture_image( GLcontext *ctx ); extern void -_mesa_delete_texture_image( struct gl_texture_image *teximage ); +_mesa_delete_texture_image( GLcontext *ctx, struct gl_texture_image *teximage ); + + +extern void +_mesa_free_texture_image_data( GLcontext *ctx, + struct gl_texture_image *texImage ); extern void diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 4bbd348658..5a6740e91d 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -144,7 +144,7 @@ _mesa_delete_texture_object( GLcontext *ctx, struct gl_texture_object *texObj ) for (face = 0; face < 6; face++) { for (i = 0; i < MAX_TEXTURE_LEVELS; i++) { if (texObj->Image[face][i]) { - _mesa_delete_texture_image( texObj->Image[face][i] ); + _mesa_delete_texture_image( ctx, texObj->Image[face][i] ); } } } |