From 08056a38ee36b52844cda96aaf590576e46a74c0 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 7 Sep 2000 15:30:48 +0000 Subject: added device driver function for texture proxy testing --- src/mesa/main/dd.h | 12 ++++++++- src/mesa/main/teximage.c | 68 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 62 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 318f1e18554..992bf5a4331 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -1,4 +1,4 @@ -/* $Id: dd.h,v 1.26.4.2 2000/08/29 22:58:57 brianp Exp $ */ +/* $Id: dd.h,v 1.26.4.3 2000/09/07 15:30:48 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -641,6 +641,16 @@ struct dd_function_table { * Core Mesa will perform any image format/type conversions that are needed. */ + GLboolean (*TestProxyTexImage)(GLcontext *ctx, GLenum target, + GLint level, GLint internalFormat, + GLenum format, GLenum type, + GLint width, GLint height, + GLint depth, GLint border); + /* Called by glTexImage[123]D when user specifies a proxy texture + * target. Return GL_TRUE if the proxy test passes, return GL_FALSE + * if the test fails. + */ + GLboolean (*CompressedTexImage1D)( GLcontext *ctx, GLenum target, GLint level, GLsizei imageSize, const GLvoid *data, diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 41c288cd3c0..28d967d72ca 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -1,4 +1,3 @@ -/* $Id: teximage.c,v 1.39.4.4 2000/09/05 22:09:03 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -1537,10 +1536,16 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat, gl_put_texobj_on_dirty_list( ctx, texObj ); ctx->NewState |= NEW_TEXTURING; } - else if (target==GL_PROXY_TEXTURE_1D) { + else if (target == GL_PROXY_TEXTURE_1D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - format, type, 1, width, 1, 1, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + format, type, 1, width, 1, 1, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, format, type, + width, 1, 1, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { clear_proxy_teximage(ctx->Texture.Proxy1D->Image[level]); @@ -1668,10 +1673,16 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat, gl_put_texobj_on_dirty_list( ctx, texObj ); ctx->NewState |= NEW_TEXTURING; } - else if (target==GL_PROXY_TEXTURE_2D) { + else if (target == GL_PROXY_TEXTURE_2D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - format, type, 2, width, height, 1, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + format, type, 2, width, height, 1, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, format, type, + width, height, 1, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { clear_proxy_teximage(ctx->Texture.Proxy2D->Image[level]); @@ -1691,7 +1702,6 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat, } - /* * Called by the API or display list executor. * Note that width and height include the border. @@ -1792,10 +1802,16 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat, gl_put_texobj_on_dirty_list( ctx, texObj ); ctx->NewState |= NEW_TEXTURING; } - else if (target==GL_PROXY_TEXTURE_3D) { + else if (target == GL_PROXY_TEXTURE_3D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - format, type, 3, width, height, depth, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + format, type, 3, width, height, depth, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, format, type, + width, height, depth, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { clear_proxy_teximage(ctx->Texture.Proxy3D->Image[level]); @@ -2739,8 +2755,14 @@ _mesa_CompressedTexImage1DARB(GLenum target, GLint level, } else if (target == GL_PROXY_TEXTURE_1D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - GL_NONE, GL_NONE, 1, width, 1, 1, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + GL_NONE, GL_NONE, 1, width, 1, 1, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, GL_NONE, GL_NONE, + width, 1, 1, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { clear_proxy_teximage(ctx->Texture.Proxy1D->Image[level]); @@ -2868,8 +2890,14 @@ _mesa_CompressedTexImage2DARB(GLenum target, GLint level, } else if (target == GL_PROXY_TEXTURE_2D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - GL_NONE, GL_NONE, 1, width, 1, 1, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + GL_NONE, GL_NONE, 2, width, height, 1, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, GL_NONE, GL_NONE, + width, height, 1, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { clear_proxy_teximage(ctx->Texture.Proxy2D->Image[level]); @@ -2991,8 +3019,14 @@ _mesa_CompressedTexImage3DARB(GLenum target, GLint level, } else if (target == GL_PROXY_TEXTURE_3D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - GL_NONE, GL_NONE, 1, width, height, depth, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + GL_NONE, GL_NONE, 1, width, height, depth, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, GL_NONE, GL_NONE, + width, height, depth, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { clear_proxy_teximage(ctx->Texture.Proxy3D->Image[level]); -- cgit v1.2.3