Rearrange the code related to GL_ARB_occlusion_object to generalize query
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 27 Aug 2005 13:56:08 +0000 (13:56 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 27 Aug 2005 13:56:08 +0000 (13:56 +0000)
objects for future types of queries.

src/mesa/drivers/common/driverfuncs.c
src/mesa/drivers/windows/gldirect/dx7/gld_vb_mesa_render_dx7.c
src/mesa/drivers/windows/gldirect/dx8/gld_vb_mesa_render_dx8.c
src/mesa/drivers/windows/gldirect/dx9/gld_vb_mesa_render_dx9.c
src/mesa/main/dd.h
src/mesa/main/mtypes.h
src/mesa/main/occlude.c
src/mesa/swrast/s_context.c
src/mesa/swrast/s_span.c
src/mesa/swrast/s_triangle.c

index 4a8ea31a48f885b555485eea1286d880cadbeac1..c027123736f0bf2d464419608b4171825948e0d8 100644 (file)
@@ -209,6 +209,10 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
    driver->FramebufferRenderbuffer = _mesa_framebuffer_renderbuffer;
 #endif
 
+   /* query objects */
+   driver->BeginQuery = NULL;
+   driver->EndQuery = NULL;
+
    /* T&L stuff */
    driver->NeedValidate = GL_FALSE;
    driver->ValidateTnlModule = NULL;
index 92226c5cc62534ee4692d535b3b8eaa0f4f689c4..ecc40e8f8b673b33c95fcdc9a0bbc5b5bacab993 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: gld_vb_mesa_render_dx7.c,v 1.5 2005/04/22 22:47:09 keithw Exp $ */
+/* $Id: gld_vb_mesa_render_dx7.c,v 1.6 2005/08/27 13:56:08 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -153,7 +153,6 @@ do {                                                        \
 #define TAG(x) clip_##x##_verts
 #define INIT(x) tnl->Driver.Render.PrimitiveNotify( ctx, x )
 #define RESET_STIPPLE if (stipple) tnl->Driver.Render.ResetLineStipple( ctx )
-#define RESET_OCCLUSION ctx->OcclusionResult = GL_TRUE
 #define PRESERVE_VB_DEFS
 #include "tnl/t_vb_rendertmp.h"
 
@@ -239,7 +238,6 @@ static void clip_elt_triangles( GLcontext *ctx,
    (void) elt;
 
 #define RESET_STIPPLE tnl->Driver.Render.ResetLineStipple( ctx )
-#define RESET_OCCLUSION ctx->OcclusionResult = GL_TRUE
 #define INIT(x) tnl->Driver.Render.PrimitiveNotify( ctx, x )
 #define RENDER_TAB_QUALIFIER
 #define PRESERVE_VB_DEFS
index 3c10f962812612fd5262f4b3f7e15cd0be70ceb0..414a2f64bf7e898ef6795001fb2593a61ace558c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: gld_vb_mesa_render_dx8.c,v 1.5 2005/04/22 22:47:10 keithw Exp $ */
+/* $Id: gld_vb_mesa_render_dx8.c,v 1.6 2005/08/27 13:56:08 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -153,7 +153,6 @@ do {                                                        \
 #define TAG(x) clip_##x##_verts
 #define INIT(x) tnl->Driver.Render.PrimitiveNotify( ctx, x )
 #define RESET_STIPPLE if (stipple) tnl->Driver.Render.ResetLineStipple( ctx )
-#define RESET_OCCLUSION ctx->OcclusionResult = GL_TRUE
 #define PRESERVE_VB_DEFS
 #include "tnl/t_vb_rendertmp.h"
 
@@ -239,7 +238,6 @@ static void clip_elt_triangles( GLcontext *ctx,
    (void) elt;
 
 #define RESET_STIPPLE tnl->Driver.Render.ResetLineStipple( ctx )
-#define RESET_OCCLUSION ctx->OcclusionResult = GL_TRUE
 #define INIT(x) tnl->Driver.Render.PrimitiveNotify( ctx, x )
 #define RENDER_TAB_QUALIFIER
 #define PRESERVE_VB_DEFS
index d1b1b8b65ee7bb01688e4cf51f78172334333896..c71fdefbae822be49ddae39e25df92a526909d83 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: gld_vb_mesa_render_dx9.c,v 1.5 2005/04/22 22:47:10 keithw Exp $ */
+/* $Id: gld_vb_mesa_render_dx9.c,v 1.6 2005/08/27 13:56:08 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -148,7 +148,6 @@ do {                                                        \
 #define TAG(x) clip_##x##_verts
 #define INIT(x) tnl->Driver.Render.PrimitiveNotify( ctx, x )
 #define RESET_STIPPLE if (stipple) tnl->Driver.Render.ResetLineStipple( ctx )
-#define RESET_OCCLUSION ctx->OcclusionResult = GL_TRUE
 #define PRESERVE_VB_DEFS
 #include "tnl/t_vb_rendertmp.h"
 
@@ -234,7 +233,6 @@ static void clip_elt_triangles( GLcontext *ctx,
    (void) elt;
 
 #define RESET_STIPPLE tnl->Driver.Render.ResetLineStipple( ctx )
-#define RESET_OCCLUSION ctx->OcclusionResult = GL_TRUE
 #define INIT(x) tnl->Driver.Render.PrimitiveNotify( ctx, x )
 #define RENDER_TAB_QUALIFIER
 #define PRESERVE_VB_DEFS
index e4c103c55e4b414edf342582e632d5dd6ccc3cee..311278000f251bb140d0db337f1e9bcc2883107f 100644 (file)
@@ -816,6 +816,14 @@ struct dd_function_table {
    /*@}*/
 #endif
 
+   /**
+    * \name Query objects
+    */
+   /*@{*/
+   void (*BeginQuery)(GLcontext *ctx, struct gl_query_object *q);
+   void (*EndQuery)(GLcontext *ctx, struct gl_query_object *q);
+   /*@}*/
+
 
    /**
     * \name Support for multiple T&L engines
index 2ec3868befb8831af9cfbc2e51490c39ccb4ffa8..17ef921738ce81ea43b8b57f75a59c3398689aba 100644 (file)
@@ -1853,7 +1853,7 @@ struct gl_vertex_program_state
 };
 
 
-/*
+/**
  * State for GL_ARB/NV_fragment_program
  */
 struct gl_fragment_program_state
@@ -1874,8 +1874,9 @@ struct gl_fragment_program_state
 #endif
 };
 
-/*
- * State for GL_fragment_shader
+
+/**
+ * State for GL_ATI_fragment_shader
  */
 struct gl_ati_fragment_shader_state
 {
@@ -1886,17 +1887,24 @@ struct gl_ati_fragment_shader_state
    struct ati_fragment_shader *Current;
 };
 
-/*
- * State for GL_ARB_occlusion_query
- */
-struct gl_occlusion_state
+
+struct gl_query_object
+{
+   GLenum Target;
+   GLuint Id;
+   GLuint Result;      /* the counter */
+   GLboolean Active;   /* inside Begin/EndQuery */
+   GLboolean Ready;    /* result is ready */
+};
+
+
+struct gl_query_state
 {
-   GLboolean Active;
-   GLuint CurrentQueryObject;
-   GLuint PassedCounter;
    struct _mesa_HashTable *QueryObjects;
+   struct gl_query_object *CurrentOcclusionObject; /* GL_ARB_occlusion_query */
 };
 
+
 /**
  * gl2 unique interface identifier.
  * Each gl2 interface has its own interface id used for object queries.
@@ -2802,7 +2810,7 @@ struct __GLcontextRec
    GLboolean _MaintainTexEnvProgram;
    GLboolean _MaintainTnlProgram;
 
-   struct gl_occlusion_state Occlusion;  /**< GL_ARB_occlusion_query */
+   struct gl_query_state Query;  /**< GL_ARB_occlusion_query */
 
    struct gl_shader_objects_state ShaderObjects;       /* GL_ARB_shader_objects */
    /*@}*/
index 3583e50703f60e69b86d7f5f2404ab31c47467fe..2f57a3cfe2eb3d7b54614efabff2680e2d1a6f1d 100644 (file)
 #include "mtypes.h"
 
 
-struct occlusion_query
-{
-   GLenum Target;
-   GLuint Id;
-   GLuint PassedCounter;
-   GLboolean Active;
-};
-
-
 /**
  * Allocate a new occlusion query object.
  * \param target - must be GL_SAMPLES_PASSED_ARB at this time
  * \param id - the object's ID
- * \return pointer to new occlusion_query object or NULL if out of memory.
+ * \return pointer to new query_object object or NULL if out of memory.
  */
-static struct occlusion_query *
+static struct gl_query_object *
 new_query_object(GLenum target, GLuint id)
 {
-   struct occlusion_query *q = MALLOC_STRUCT(occlusion_query);
+   struct gl_query_object *q = MALLOC_STRUCT(gl_query_object);
    if (q) {
       q->Target = target;
       q->Id = id;
-      q->PassedCounter = 0;
+      q->Result = 0;
       q->Active = GL_FALSE;
    }
    return q;
@@ -67,14 +58,24 @@ new_query_object(GLenum target, GLuint id)
 
 /**
  * Delete an occlusion query object.
+ * Not removed from hash table here.
  */
 static void
-delete_query_object(struct occlusion_query *q)
+delete_query_object(struct gl_query_object *q)
 {
    FREE(q);
 }
 
 
+struct gl_query_object *
+lookup_query_object(GLcontext *ctx, GLuint id)
+{
+   return (struct gl_query_object *)
+      _mesa_HashLookup(ctx->Query.QueryObjects, id);
+}
+
+
+
 void GLAPIENTRY
 _mesa_GenQueriesARB(GLsizei n, GLuint *ids)
 {
@@ -87,23 +88,24 @@ _mesa_GenQueriesARB(GLsizei n, GLuint *ids)
       return;
    }
 
-   if (ctx->Occlusion.Active) {
+   /* No query objects can be active at this time! */
+   if (ctx->Query.CurrentOcclusionObject) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glGenQueriesARB");
       return;
    }
 
-   first = _mesa_HashFindFreeKeyBlock(ctx->Occlusion.QueryObjects, n);
+   first = _mesa_HashFindFreeKeyBlock(ctx->Query.QueryObjects, n);
    if (first) {
       GLsizei i;
       for (i = 0; i < n; i++) {
-         struct occlusion_query *q = new_query_object(GL_SAMPLES_PASSED_ARB,
+         struct gl_query_object *q = new_query_object(GL_SAMPLES_PASSED_ARB,
                                                       first + i);
          if (!q) {
             _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenQueriesARB");
             return;
          }
          ids[i] = first + i;
-         _mesa_HashInsert(ctx->Occlusion.QueryObjects, first + i, q);
+         _mesa_HashInsert(ctx->Query.QueryObjects, first + i, q);
       }
    }
 }
@@ -121,17 +123,18 @@ _mesa_DeleteQueriesARB(GLsizei n, const GLuint *ids)
       return;
    }
 
-   if (ctx->Occlusion.Active) {
+   /* No query objects can be active at this time! */
+   if (ctx->Query.CurrentOcclusionObject) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glDeleteQueriesARB");
       return;
    }
 
    for (i = 0; i < n; i++) {
       if (ids[i] > 0) {
-         struct occlusion_query *q = (struct occlusion_query *)
-            _mesa_HashLookup(ctx->Occlusion.QueryObjects, ids[i]);
+         struct gl_query_object *q = lookup_query_object(ctx, ids[i]);
          if (q) {
-            _mesa_HashRemove(ctx->Occlusion.QueryObjects, ids[i]);
+            ASSERT(!q->Active); /* should be caught earlier */
+            _mesa_HashRemove(ctx->Query.QueryObjects, ids[i]);
             delete_query_object(q);
          }
       }
@@ -145,7 +148,7 @@ _mesa_IsQueryARB(GLuint id)
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
-   if (id && _mesa_HashLookup(ctx->Occlusion.QueryObjects, id))
+   if (id && lookup_query_object(ctx, id))
       return GL_TRUE;
    else
       return GL_FALSE;
@@ -156,7 +159,7 @@ void GLAPIENTRY
 _mesa_BeginQueryARB(GLenum target, GLuint id)
 {
    GET_CURRENT_CONTEXT(ctx);
-   struct occlusion_query *q;
+   struct gl_query_object *q;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    FLUSH_VERTICES(ctx, _NEW_DEPTH);
@@ -171,31 +174,43 @@ _mesa_BeginQueryARB(GLenum target, GLuint id)
       return;
    }
 
-   if (ctx->Occlusion.CurrentQueryObject) {
+   if (ctx->Query.CurrentOcclusionObject) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginQueryARB(target)");
       return;
    }
 
-   q = (struct occlusion_query *)
-      _mesa_HashLookup(ctx->Occlusion.QueryObjects, id);
-   if (q && q->Active) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginQueryARB");
-      return;
-   }
-   else if (!q) {
+   q = lookup_query_object(ctx, id);
+   if (!q) {
+      /* create new object */
       q = new_query_object(target, id);
       if (!q) {
          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBeginQueryARB");
          return;
       }
-      _mesa_HashInsert(ctx->Occlusion.QueryObjects, id, q);
+      _mesa_HashInsert(ctx->Query.QueryObjects, id, q);
+   }
+   else {
+      /* pre-existing object */
+      if (q->Target != target) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "glBeginQueryARB(target mismatch)");
+         return;
+      }
+      if (q->Active) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "glBeginQueryARB(query already active)");
+         return;
+      }
    }
 
    q->Active = GL_TRUE;
-   q->PassedCounter = 0;
-   ctx->Occlusion.Active = GL_TRUE;
-   ctx->Occlusion.CurrentQueryObject = id;
-   ctx->Occlusion.PassedCounter = 0;
+   q->Result = 0;
+   q->Ready = GL_FALSE;
+   ctx->Query.CurrentOcclusionObject = q;
+
+   if (ctx->Driver.BeginQuery) {
+      ctx->Driver.BeginQuery(ctx, q);
+   }
 }
 
 
@@ -203,29 +218,34 @@ void GLAPIENTRY
 _mesa_EndQueryARB(GLenum target)
 {
    GET_CURRENT_CONTEXT(ctx);
-   struct occlusion_query *q = NULL;
+   struct gl_query_object *q;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    FLUSH_VERTICES(ctx, _NEW_DEPTH);
 
-   if (target != GL_SAMPLES_PASSED_ARB) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glEndQueryARB(target)");
-      return;
+   switch (target) {
+      case GL_SAMPLES_PASSED_ARB:
+         q = ctx->Query.CurrentOcclusionObject;
+         ctx->Query.CurrentOcclusionObject = NULL;
+         break;
+      default:
+         _mesa_error(ctx, GL_INVALID_ENUM, "glEndQueryARB(target)");
+         return;
    }
 
-   if (ctx->Occlusion.CurrentQueryObject)
-      q = (struct occlusion_query *)
-         _mesa_HashLookup(ctx->Occlusion.QueryObjects,
-                          ctx->Occlusion.CurrentQueryObject);
    if (!q || !q->Active) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glEndQuery with no glBeginQuery");
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glEndQueryARB(no matching glBeginQueryARB)");
       return;
    }
 
-   q->PassedCounter = ctx->Occlusion.PassedCounter;
    q->Active = GL_FALSE;
-   ctx->Occlusion.Active = GL_FALSE;
-   ctx->Occlusion.CurrentQueryObject = 0;
+   if (ctx->Driver.EndQuery) {
+      ctx->Driver.EndQuery(ctx, q);
+   }
+   else {
+      q->Ready = GL_TRUE;
+   }
 }
 
 
@@ -233,19 +253,24 @@ void GLAPIENTRY
 _mesa_GetQueryivARB(GLenum target, GLenum pname, GLint *params)
 {
    GET_CURRENT_CONTEXT(ctx);
+   struct gl_query_object *q;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   if (target != GL_SAMPLES_PASSED_ARB) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetQueryivARB(target)");
-      return;
+   switch (target) {
+      case GL_SAMPLES_PASSED_ARB:
+         q = ctx->Query.CurrentOcclusionObject;
+         break;
+      default:
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetQueryivARB(target)");
+         return;
    }
 
    switch (pname) {
       case GL_QUERY_COUNTER_BITS_ARB:
-         *params = 8 * sizeof(GLuint);
+         *params = 8 * sizeof(q->Result);
          break;
       case GL_CURRENT_QUERY_ARB:
-         *params = ctx->Occlusion.CurrentQueryObject;
+         *params = q ? q->Id : 0;
          break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetQueryivARB(pname)");
@@ -258,25 +283,25 @@ void GLAPIENTRY
 _mesa_GetQueryObjectivARB(GLuint id, GLenum pname, GLint *params)
 {
    GET_CURRENT_CONTEXT(ctx);
-   struct occlusion_query *q = NULL;
+   struct gl_query_object *q = NULL;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (id)
-      q = (struct occlusion_query *)
-         _mesa_HashLookup(ctx->Occlusion.QueryObjects, id);
+      q = lookup_query_object(ctx, id);
 
    if (!q || q->Active) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetQueryObjectivARB(id=%d)", id);
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glGetQueryObjectivARB(id=%d is active)", id);
       return;
    }
 
    switch (pname) {
       case GL_QUERY_RESULT_ARB:
-         *params = q->PassedCounter;
+         *params = q->Result;
          break;
       case GL_QUERY_RESULT_AVAILABLE_ARB:
          /* XXX revisit when we have a hardware implementation! */
-         *params = GL_TRUE;
+         *params = q->Ready;
          break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetQueryObjectivARB(pname)");
@@ -289,24 +314,25 @@ void GLAPIENTRY
 _mesa_GetQueryObjectuivARB(GLuint id, GLenum pname, GLuint *params)
 {
    GET_CURRENT_CONTEXT(ctx);
-   struct occlusion_query *q = NULL;
+   struct gl_query_object *q = NULL;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (id)
-      q = (struct occlusion_query *)
-         _mesa_HashLookup(ctx->Occlusion.QueryObjects, id);
+      q = lookup_query_object(ctx, id);
+
    if (!q || q->Active) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetQueryObjectuivARB(id=%d", id);
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glGetQueryObjectuivARB(id=%d is active)", id);
       return;
    }
 
    switch (pname) {
       case GL_QUERY_RESULT_ARB:
-         *params = q->PassedCounter;
+         *params = q->Result;
          break;
       case GL_QUERY_RESULT_AVAILABLE_ARB:
          /* XXX revisit when we have a hardware implementation! */
-         *params = GL_TRUE;
+         *params = q->Ready;
          break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetQueryObjectuivARB(pname)");
@@ -323,7 +349,8 @@ void
 _mesa_init_occlude(GLcontext *ctx)
 {
 #if FEATURE_ARB_occlusion_query
-   ctx->Occlusion.QueryObjects = _mesa_NewHashTable();
+   ctx->Query.QueryObjects = _mesa_NewHashTable();
+   ctx->Query.CurrentOcclusionObject = NULL;
 #endif
 }
 
@@ -335,17 +362,16 @@ void
 _mesa_free_occlude_data(GLcontext *ctx)
 {
    while (1) {
-      GLuint query = _mesa_HashFirstEntry(ctx->Occlusion.QueryObjects);
-      if (query) {
-         struct occlusion_query *q = (struct occlusion_query *)
-            _mesa_HashLookup(ctx->Occlusion.QueryObjects, query);
+      GLuint id = _mesa_HashFirstEntry(ctx->Query.QueryObjects);
+      if (id) {
+         struct gl_query_object *q = lookup_query_object(ctx, id);
          ASSERT(q);
          delete_query_object(q);
-         _mesa_HashRemove(ctx->Occlusion.QueryObjects, query);
+         _mesa_HashRemove(ctx->Query.QueryObjects, id);
       }
       else {
          break;
       }
    }
-   _mesa_DeleteHashTable(ctx->Occlusion.QueryObjects);
+   _mesa_DeleteHashTable(ctx->Query.QueryObjects);
 }
index 5ca3f382e5967f43d66fdc21a01d3676b30ad5ff..93f0c7596994adc150a1b92a1ab38f9c73714160 100644 (file)
@@ -80,7 +80,7 @@ _swrast_update_rasterflags( GLcontext *ctx )
       rasterMask |= CLIP_BIT;
    }
 
-   if (ctx->Occlusion.Active)
+   if (ctx->Query.CurrentOcclusionObject)
       rasterMask |= OCCLUSION_BIT;
 
 
index d2cafeb7ac0e60a6d0b036a46bf4ffe181a75ce6..f99fa4cbaf7d31b08b81928781b668b57674ecc7 100644 (file)
@@ -850,11 +850,12 @@ _swrast_write_index_span( GLcontext *ctx, struct sw_span *span)
    }
 
 #if FEATURE_ARB_occlusion_query
-   if (ctx->Occlusion.Active) {
+   if (ctx->Query.CurrentOcclusionObject) {
       /* update count of 'passed' fragments */
+      struct gl_query_object *q = ctx->Query.CurrentOcclusionObject;
       GLuint i;
       for (i = 0; i < span->end; i++)
-         ctx->Occlusion.PassedCounter += span->array->mask[i];
+         q->Result += span->array->mask[i];
    }
 #endif
 
@@ -1215,11 +1216,12 @@ _swrast_write_rgba_span( GLcontext *ctx, struct sw_span *span)
    }
 
 #if FEATURE_ARB_occlusion_query
-   if (ctx->Occlusion.Active) {
+   if (ctx->Query.CurrentOcclusionObject) {
       /* update count of 'passed' fragments */
+      struct gl_query_object *q = ctx->Query.CurrentOcclusionObject;
       GLuint i;
       for (i = 0; i < span->end; i++)
-         ctx->Occlusion.PassedCounter += span->array->mask[i];
+         q->Result += span->array->mask[i];
    }
 #endif
 
index 6649d1a51f0dad6156c8e91d801bda20663269e4..29134d02e905f7fc82b5f12a3333841e397cd3a7 100644 (file)
@@ -904,14 +904,15 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span,
  */
 #define NAME occlusion_zless_triangle
 #define INTERP_Z 1
-#define SETUP_CODE                                             \
-   struct gl_renderbuffer *rb                                  \
-      = ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer;        \
-   ASSERT(ctx->Depth.Test);                                    \
-   ASSERT(!ctx->Depth.Mask);                                   \
-   ASSERT(ctx->Depth.Func == GL_LESS);                         \
-   if (!ctx->Occlusion.Active) {                               \
-      return;                                                  \
+#define SETUP_CODE                                                     \
+   struct gl_renderbuffer *rb                                          \
+      = ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer;                \
+   struct gl_query_object *q = ctx->Query.CurrentOcclusionObject;      \
+   ASSERT(ctx->Depth.Test);                                            \
+   ASSERT(!ctx->Depth.Mask);                                           \
+   ASSERT(ctx->Depth.Func == GL_LESS);                                 \
+   if (!q) {                                                           \
+      return;                                                          \
    }
 #define RENDER_SPAN( span )                                            \
    if (ctx->Visual.depthBits <= 16) {                                  \
@@ -921,7 +922,7 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span,
       for (i = 0; i < span.end; i++) {                                 \
          GLdepth z = FixedToDepth(span.z);                             \
          if (z < zRow[i]) {                                            \
-            ctx->Occlusion.PassedCounter++;                            \
+            q->Result++;                                               \
          }                                                             \
          span.z += span.zStep;                                         \
       }                                                                        \
@@ -932,7 +933,7 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span,
          rb->GetPointer(ctx, rb, span.x, span.y);                      \
       for (i = 0; i < span.end; i++) {                                 \
          if ((GLuint)span.z < zRow[i]) {                               \
-            ctx->Occlusion.PassedCounter++;                            \
+            q->Result++;                                               \
          }                                                             \
          span.z += span.zStep;                                         \
       }                                                                        \
@@ -1055,7 +1056,7 @@ _swrast_choose_triangle( GLcontext *ctx )
       }
 
       /* special case for occlusion testing */
-      if (ctx->Occlusion.Active &&
+      if (ctx->Query.CurrentOcclusionObject &&
           ctx->Depth.Test &&
           ctx->Depth.Mask == GL_FALSE &&
           ctx->Depth.Func == GL_LESS &&