diff options
-rw-r--r-- | src/mesa/drivers/common/meta.c | 28 | ||||
-rw-r--r-- | src/mesa/drivers/common/meta.h | 1 |
2 files changed, 28 insertions, 1 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index d211fda9de4..12a4d98c223 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -54,6 +54,7 @@ #include "main/pixel.h" #include "main/pbo.h" #include "main/polygon.h" +#include "main/queryobj.h" #include "main/readpix.h" #include "main/scissor.h" #include "main/shaderapi.h" @@ -89,6 +90,9 @@ struct save_state { GLbitfield SavedState; /**< bitmask of MESA_META_* flags */ + /** MESA_META_CLEAR (and others?) */ + struct gl_query_object *CurrentOcclusionObject; + /** MESA_META_ALPHA_TEST */ GLboolean AlphaEnabled; GLenum AlphaFunc; @@ -478,6 +482,15 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state) if (save->TransformFeedbackNeedsResume) _mesa_PauseTransformFeedback(); + /* After saving the current occlusion object, call EndQuery so that no + * occlusion querying will be active during the meta-operation. + */ + if (state & MESA_META_OCCLUSION_QUERY) { + save->CurrentOcclusionObject = ctx->Query.CurrentOcclusionObject; + if (save->CurrentOcclusionObject) + _mesa_EndQuery(save->CurrentOcclusionObject->Target); + } + if (state & MESA_META_ALPHA_TEST) { save->AlphaEnabled = ctx->Color.AlphaEnabled; save->AlphaFunc = ctx->Color.AlphaFunc; @@ -806,6 +819,18 @@ _mesa_meta_end(struct gl_context *ctx) struct save_state *save = &ctx->Meta->Save[ctx->Meta->SaveStackDepth - 1]; const GLbitfield state = save->SavedState; + /* After starting a new occlusion query, initialize the results to the + * values saved previously. The driver will then continue to increment + * these values. + */ + if (state & MESA_META_OCCLUSION_QUERY) { + if (save->CurrentOcclusionObject) { + _mesa_BeginQuery(save->CurrentOcclusionObject->Target, + save->CurrentOcclusionObject->Id); + ctx->Query.CurrentOcclusionObject->Result = save->CurrentOcclusionObject->Result; + } + } + if (state & MESA_META_ALPHA_TEST) { if (ctx->Color.AlphaEnabled != save->AlphaEnabled) _mesa_set_enable(ctx, GL_ALPHA_TEST, save->AlphaEnabled); @@ -1987,7 +2012,8 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers) MESA_META_VIEWPORT | MESA_META_CLIP | MESA_META_CLAMP_FRAGMENT_COLOR | - MESA_META_MULTISAMPLE); + MESA_META_MULTISAMPLE | + MESA_META_OCCLUSION_QUERY); if (!(buffers & BUFFER_BITS_COLOR)) { /* We'll use colormask to disable color writes. Otherwise, diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h index 6ffc5b56a1f..a6bdd39473f 100644 --- a/src/mesa/drivers/common/meta.h +++ b/src/mesa/drivers/common/meta.h @@ -57,6 +57,7 @@ #define MESA_META_SELECT_FEEDBACK 0x80000 #define MESA_META_MULTISAMPLE 0x100000 #define MESA_META_FRAMEBUFFER_SRGB 0x200000 +#define MESA_META_OCCLUSION_QUERY 0x400000 /**\}*/ extern void |