mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-29 16:00:24 +01:00
add FreeTexImageData hook to help single-copy texturing in drivers
This commit is contained in:
parent
050b77a9ac
commit
3e62d3a8d8
6 changed files with 63 additions and 37 deletions
|
|
@ -103,6 +103,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
|
|||
driver->NewTextureObject = _mesa_new_texture_object;
|
||||
driver->DeleteTexture = _mesa_delete_texture_object;
|
||||
driver->NewTextureImage = _mesa_new_texture_image;
|
||||
driver->FreeTexImageData = _mesa_free_texture_image_data;
|
||||
driver->IsTextureResident = NULL;
|
||||
driver->PrioritizeTexture = NULL;
|
||||
driver->ActiveTexture = NULL;
|
||||
|
|
|
|||
|
|
@ -1536,6 +1536,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.
|
||||
|
|
|
|||
|
|
@ -511,6 +511,11 @@ struct dd_function_table {
|
|||
*/
|
||||
struct gl_texture_image * (*NewTextureImage)( GLcontext *ctx );
|
||||
|
||||
/**
|
||||
* Called to free tImage->Data.
|
||||
*/
|
||||
void (*FreeTexImageData)( GLcontext *ctx, struct gl_texture_image *tImage );
|
||||
|
||||
/**
|
||||
* Called by glAreTextureResident().
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -570,22 +570,40 @@ _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 );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2024,11 +2042,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,
|
||||
|
|
@ -2124,11 +2141,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,
|
||||
|
|
@ -2220,10 +2236,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,
|
||||
|
|
@ -2460,11 +2476,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,
|
||||
|
|
@ -2523,11 +2538,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,
|
||||
|
|
@ -2873,10 +2887,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);
|
||||
|
|
@ -2956,10 +2970,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);
|
||||
|
|
@ -3038,10 +3052,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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue