initial implementation of GL_HP_occlusion_test extension
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 11 Mar 2000 23:23:26 +0000 (23:23 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 11 Mar 2000 23:23:26 +0000 (23:23 +0000)
src/mesa/main/context.c
src/mesa/main/enable.c
src/mesa/main/extensions.c
src/mesa/main/get.c
src/mesa/main/state.c

index b1d922f6515e4a860ee4240ca8dd18f961a5d0fb..64d236ee5181e87b98d4956174c30ec2090b2ce6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.c,v 1.45 2000/03/06 17:03:03 brianp Exp $ */
+/* $Id: context.c,v 1.46 2000/03/11 23:23:26 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -864,6 +864,7 @@ static void init_attrib_groups( GLcontext *ctx )
    ctx->Depth.Clear = 1.0;
    ctx->Depth.Func = GL_LESS;
    ctx->Depth.Mask = GL_TRUE;
+   ctx->Depth.OcclusionTest = GL_FALSE;
 
    /* Evaluators group */
    ctx->Eval.Map1Color4 = GL_FALSE;
@@ -1227,6 +1228,7 @@ static void init_attrib_groups( GLcontext *ctx )
    ctx->ErrorValue = (GLenum) GL_NO_ERROR;
 
    ctx->CatchSignals = GL_TRUE;
+   ctx->OcclusionResult = GL_FALSE;
 
    /* For debug/development only */
    ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
index 94defaad74a4ca4d5eb8e8acf8619e120f6f3919..0e1a5781bddfed3a8e3a8ac71455a89769d5f62a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: enable.c,v 1.11 2000/03/07 18:24:49 brianp Exp $ */
+/* $Id: enable.c,v 1.12 2000/03/11 23:23:26 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -451,6 +451,18 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )
          ctx->Array.EdgeFlag.Enabled = state;
          break;
 
+      /* GL_HP_occlusion_test */
+      case GL_OCCLUSION_TEST_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            ctx->Depth.OcclusionTest = state;
+            ctx->NewState |= NEW_RASTER_OPS;
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, state ? "glEnable": "glDisable" );
+            return;
+         }
+         break;
+
       default:
         if (state) {
            gl_error( ctx, GL_INVALID_ENUM, "glEnable" );
@@ -644,6 +656,17 @@ _mesa_IsEnabled( GLenum cap )
          return ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled;
       case GL_EDGE_FLAG_ARRAY:
          return ctx->Array.EdgeFlag.Enabled;
+
+      /* GL_HP_occlusion_test */
+      case GL_OCCLUSION_TEST_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            return ctx->Depth.OcclusionTest;
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" );
+            return GL_FALSE;
+         }
+
       default:
         gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" );
         return GL_FALSE;
index b6ff6d129381403d7d7ebf59fea82d96177f38e2..f60ae01de9d0d3971ef1e5b3eb411cb7945fe540 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: extensions.c,v 1.19 2000/03/07 17:54:58 brianp Exp $ */
+/* $Id: extensions.c,v 1.20 2000/03/11 23:23:26 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -77,7 +77,8 @@ static struct { int enabled; const char *name; } default_extensions[] = {
    { ALWAYS_ENABLED, "GL_ARB_tranpose_matrix" },
    { DEFAULT_OFF,    "GL_EXT_vertex_array_set" },
    { DEFAULT_OFF,    "GL_EXT_texture_env" },
-   { DEFAULT_ON,     "GL_EXT_texture_lod_bias" }
+   { DEFAULT_ON,     "GL_EXT_texture_lod_bias" },
+   { DEFAULT_OFF,    "GL_HP_occlusion_test" }
 };
 
 
@@ -90,6 +91,7 @@ update_extension_flags( GLcontext *ctx )
    /* Update flags */
    ctx->Extensions.HaveTextureEnvAdd = gl_extension_is_enabled(ctx, "GL_EXT_texture_env_add");
    ctx->Extensions.HaveTextureLodBias = gl_extension_is_enabled(ctx, "GL_EXT_texture_lod_bias");
+   ctx->Extensions.HaveHpOcclusionTest = gl_extension_is_enabled(ctx, "GL_HP_occlusion_test");
 }
 
 
index 8a352aa7993c9632e626efd3a7a25147568e0a52..4fd83dbd38f227db41705aae8f8f267103c95aa2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: get.c,v 1.14 2000/02/24 22:04:03 brianp Exp $ */
+/* $Id: get.c,v 1.15 2000/03/11 23:23:26 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1012,8 +1012,26 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          }
          break;
 
+      /* GL_HP_occlusion_test */
+      case GL_OCCLUSION_TEST_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            *params = ctx->Depth.OcclusionTest;
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, "glGetBooleanv" );
+         }
+         return;
+      case GL_OCCLUSION_TEST_RESULT_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            *params = ctx->OcclusionResult;
+            ctx->OcclusionResult = GL_FALSE; /* reset now */
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, "glGetBooleanv" );
+         }
+         return;
+
       default:
-        printf("invalid enum: %x\n", pname);
          gl_error( ctx, GL_INVALID_ENUM, "glGetBooleanv" );
    }
 }
@@ -1975,8 +1993,26 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
          }
          break;
 
+      /* GL_HP_occlusion_test */
+      case GL_OCCLUSION_TEST_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            *params = (GLdouble) ctx->Depth.OcclusionTest;
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, "glGetDoublev" );
+         }
+         return;
+      case GL_OCCLUSION_TEST_RESULT_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            *params = (GLdouble) ctx->OcclusionResult;
+            ctx->OcclusionResult = GL_FALSE; /* reset now */
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, "glGetDoublev" );
+         }
+         return;
+
       default:
-        printf("invalid enum: %x\n", pname);
          gl_error( ctx, GL_INVALID_ENUM, "glGetDoublev" );
    }
 }
@@ -2915,8 +2951,26 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          gl_matrix_transposef(params, ctx->TextureMatrix[texTransformUnit].m);
          break;
 
+      /* GL_HP_occlusion_test */
+      case GL_OCCLUSION_TEST_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            *params = (GLfloat) ctx->Depth.OcclusionTest;
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, "glGetFloatv" );
+         }
+         return;
+      case GL_OCCLUSION_TEST_RESULT_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            *params = (GLfloat) ctx->OcclusionResult;
+            ctx->OcclusionResult = GL_FALSE; /* reset now */
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, "glGetFloatv" );
+         }
+         return;
+
       default:
-        printf("invalid enum: %x\n", pname);
          gl_error( ctx, GL_INVALID_ENUM, "glGetFloatv" );
    }
 }
@@ -3878,8 +3932,26 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          }
          break;
 
+      /* GL_HP_occlusion_test */
+      case GL_OCCLUSION_TEST_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            *params = (GLint) ctx->Depth.OcclusionTest;
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, "glGetIntegerv" );
+         }
+         return;
+      case GL_OCCLUSION_TEST_RESULT_HP:
+         if (ctx->Extensions.HaveHpOcclusionTest) {
+            *params = (GLint) ctx->OcclusionResult;
+            ctx->OcclusionResult = GL_FALSE; /* reset now */
+         }
+         else {
+            gl_error( ctx, GL_INVALID_ENUM, "glGetIntegerv" );
+         }
+         return;
+
       default:
-        printf("invalid enum: %x\n", pname);
          gl_error( ctx, GL_INVALID_ENUM, "glGetIntegerv" );
    }
 }
index 667953a65caebb812fa088a43235e6b74465f80d..d82ffa574486828532c3d72da618450d92f68014 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: state.c,v 1.4 2000/02/24 22:04:03 brianp Exp $ */
+/* $Id: state.c,v 1.5 2000/03/11 23:23:26 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -791,11 +791,21 @@ static void update_rasterflags( GLcontext *ctx )
       ctx->RasterMask |= WINCLIP_BIT;
    }
 
+   if (ctx->Depth.OcclusionTest) {
+      if (ctx->Color.ColorMask[0] == 0 && 
+          ctx->Color.ColorMask[1] == 0 && 
+          ctx->Color.ColorMask[2] == 0 &&
+          ctx->Color.ColorMask[3] == 0 && 
+          ctx->Depth.Mask == GL_FALSE &&
+          !ctx->Stencil.Enabled) {
+         ctx->RasterMask |= OCCLUSION_BIT;
+      }
+   }
+
    /* If we're not drawing to exactly one color buffer set the
     * MULTI_DRAW_BIT flag.  Also set it if we're drawing to no
     * buffers or the RGBA or CI mask disables all writes.
     */
-
    ctx->TriangleCaps &= ~DD_MULTIDRAW;
 
    if (ctx->Color.MultiDrawBuffer) {