added device driver function for texture proxy testing
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 7 Sep 2000 15:38:49 +0000 (15:38 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 7 Sep 2000 15:38:49 +0000 (15:38 +0000)
src/mesa/main/dd.h
src/mesa/main/teximage.c

index fce30099d3585b5115a58e261e2ad0be84cbc184..d37eac3d1f86ce03948627a60d609958907599b6 100644 (file)
@@ -1,8 +1,8 @@
-/* $Id: dd.h,v 1.28 2000/08/29 23:31:23 brianp Exp $ */
+/* $Id: dd.h,v 1.29 2000/09/07 15:38:49 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.4
+ * Version:  3.5
  * 
  * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
  * 
@@ -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,
index b24344d85cd30d088661da0a7a9c7d974b93a81a..6f14c1974bf331e14bc6f908a52b1ceb69d47de8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: teximage.c,v 1.49 2000/09/06 15:15:43 brianp Exp $ */
+/* $Id: teximage.c,v 1.50 2000/09/07 15:38:49 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1701,10 +1701,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, postConvWidth, 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 && level<ctx->Const.MaxTextureLevels) {
             clear_proxy_teximage(ctx->Texture.Proxy1D->Image[level]);
@@ -1840,10 +1846,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, postConvWidth, 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 && level<ctx->Const.MaxTextureLevels) {
             clear_proxy_teximage(ctx->Texture.Proxy2D->Image[level]);
@@ -1863,7 +1875,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.
@@ -1966,10 +1977,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 && level<ctx->Const.MaxTextureLevels) {
             clear_proxy_teximage(ctx->Texture.Proxy3D->Image[level]);
@@ -2904,8 +2921,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 && level<ctx->Const.MaxTextureLevels) {
             clear_proxy_teximage(ctx->Texture.Proxy1D->Image[level]);
@@ -3033,8 +3056,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 && level<ctx->Const.MaxTextureLevels) {
             clear_proxy_teximage(ctx->Texture.Proxy2D->Image[level]);
@@ -3156,8 +3185,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 && level<ctx->Const.MaxTextureLevels) {
             clear_proxy_teximage(ctx->Texture.Proxy3D->Image[level]);