[Mesa-dev] [PATCH 1/4] meta: Pause/resume an active occlusion query over any meta operation
Ian Romanick
idr at freedesktop.org
Mon Dec 17 16:01:08 PST 2012
On 12/17/2012 02:24 PM, Carl Worth wrote:
> This avoids the occlusion query erroneously accumulating results during the
> meta operation.
>
> This fixes the following es3conform tests:
>
> occlusion_query_draw_occluded.test
> occlusion_query_clear
> occlusion_query_custom_framebuffer
> occlusion_query_stencil_test
> occlusion_query_discarded_fragments
> ---
> src/mesa/drivers/common/meta.c | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index f95d207..e66476c 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;
> @@ -479,6 +483,13 @@ _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.
> + */
> + save->CurrentOcclusionObject = ctx->Query.CurrentOcclusionObject;
> + if (save->CurrentOcclusionObject)
> + _mesa_EndQuery(save->CurrentOcclusionObject->Target);
> +
I think we need a flag to select this behavior. There are some meta ops
that *do* generate fragments (e.g., _mesa_meta_DrawPixels), and this
will prevent them from being counted.
> if (state & MESA_META_ALPHA_TEST) {
> save->AlphaEnabled = ctx->Color.AlphaEnabled;
> save->AlphaFunc = ctx->Color.AlphaFunc;
> @@ -807,6 +818,16 @@ _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 (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);
>
More information about the mesa-dev
mailing list