If the fragment shader is null then pixel shader invocations have to be equal to zero. And if we're running a null ps then clipper invocations and primitives should be equal to zero but only if both stancil and depth testing are disabled.
Signed-off-by: Zack Rusin <za...@vmware.com> --- src/gallium/drivers/llvmpipe/lp_query.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_query.c b/src/gallium/drivers/llvmpipe/lp_query.c index cea2d07..fb24c36 100644 --- a/src/gallium/drivers/llvmpipe/lp_query.c +++ b/src/gallium/drivers/llvmpipe/lp_query.c @@ -32,6 +32,7 @@ #include "draw/draw_context.h" #include "pipe/p_defines.h" +#include "tgsi/tgsi_scan.h" #include "util/u_memory.h" #include "os/os_time.h" #include "lp_context.h" @@ -95,6 +96,7 @@ llvmpipe_get_query_result(struct pipe_context *pipe, union pipe_query_result *vresult) { struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen); + struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe); unsigned num_threads = MAX2(1, screen->num_threads); struct llvmpipe_query *pq = llvmpipe_query(q); uint64_t *result = (uint64_t *)vresult; @@ -166,11 +168,31 @@ llvmpipe_get_query_result(struct pipe_context *pipe, case PIPE_QUERY_PIPELINE_STATISTICS: { struct pipe_query_data_pipeline_statistics *stats = (struct pipe_query_data_pipeline_statistics *)vresult; - /* only ps_invocations come from binned query */ - for (i = 0; i < num_threads; i++) { - pq->stats.ps_invocations += pq->end[i]; + /* If we're running on what's considrered a null fragment + * shader, i.e. fragment shader consisting of a single + * END opcode or if the fragment shader is null then + * the number of ps_invocations should be zero */ + if (llvmpipe->fs && llvmpipe->fs->info.base.num_tokens > 1) { + /* only ps_invocations come from binned query */ + for (i = 0; i < num_threads; i++) { + pq->stats.ps_invocations += pq->end[i]; + } + pq->stats.ps_invocations *= + LP_RASTER_BLOCK_SIZE * LP_RASTER_BLOCK_SIZE; + } else { + /* + * Clipper primitives and invocations are equal to zero + * if we're running a null fragment shader but only + * if both stencil and depth testing are disabled. + */ + if (!llvmpipe->depth_stencil->depth.enabled && + !llvmpipe->depth_stencil->stencil[0].enabled && + !llvmpipe->depth_stencil->stencil[1].enabled) { + pq->stats.c_primitives = 0; + pq->stats.c_invocations = 0; + } + pq->stats.ps_invocations = 0; } - pq->stats.ps_invocations *= LP_RASTER_BLOCK_SIZE * LP_RASTER_BLOCK_SIZE; *stats = pq->stats; } break; -- 1.7.10.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev