[Mesa-dev] [PATCH] llvmpipe: fix pipeline statistics with a null ps

Roland Scheidegger sroland at vmware.com
Wed Aug 14 05:25:27 PDT 2013


Am 14.08.2013 07:40, schrieb Zack Rusin:
> 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 <zackr at vmware.com>
> ---
>  src/gallium/drivers/llvmpipe/lp_rast.c        |    3 ++-
>  src/gallium/drivers/llvmpipe/lp_rast_priv.h   |    3 ++-
>  src/gallium/drivers/llvmpipe/lp_setup_line.c  |    3 ++-
>  src/gallium/drivers/llvmpipe/lp_setup_point.c |    3 ++-
>  src/gallium/drivers/llvmpipe/lp_setup_tri.c   |    3 ++-
>  src/gallium/drivers/llvmpipe/lp_setup_vbuf.c  |    9 +++++++--
>  src/gallium/drivers/llvmpipe/lp_state_fs.c    |   24 +++++++++++++++++++++++-
>  src/gallium/drivers/llvmpipe/lp_state_fs.h    |    4 ++++
>  8 files changed, 44 insertions(+), 8 deletions(-)
> 
> diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c
> index 49cdbfe..af661e9 100644
> --- a/src/gallium/drivers/llvmpipe/lp_rast.c
> +++ b/src/gallium/drivers/llvmpipe/lp_rast.c
> @@ -35,6 +35,7 @@
>  #include "os/os_time.h"
>  
>  #include "lp_scene_queue.h"
> +#include "lp_context.h"
>  #include "lp_debug.h"
>  #include "lp_fence.h"
>  #include "lp_perf.h"
> @@ -459,7 +460,7 @@ lp_rast_shade_quads_mask(struct lp_rasterizer_task *task,
>     if ((x % TILE_SIZE) < task->width && (y % TILE_SIZE) < task->height) {
>        /* not very accurate would need a popcount on the mask */
>        /* always count this not worth bothering? */
> -      task->ps_invocations++;
> +      task->ps_invocations += 1 * variant->ps_inv_multiplier;
>  
>        /* run shader on 4x4 block */
>        BEGIN_JIT_CALL(state, task);
> diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
> index b8bc99c..41fe097 100644
> --- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h
> +++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
> @@ -100,6 +100,7 @@ struct lp_rasterizer_task
>     /* occlude counter for visible pixels */
>     struct lp_jit_thread_data thread_data;
>     uint64_t ps_invocations;
> +   uint8_t ps_inv_multiplier;
>  
>     pipe_semaphore work_ready;
>     pipe_semaphore work_done;
> @@ -308,7 +309,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
>     if ((x % TILE_SIZE) < task->width && (y % TILE_SIZE) < task->height) {
>        /* not very accurate would need a popcount on the mask */
>        /* always count this not worth bothering? */
> -      task->ps_invocations++;
> +      task->ps_invocations += 1 * variant->ps_inv_multiplier;
>  
>        /* run shader on 4x4 block */
>        BEGIN_JIT_CALL(state, task);
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup_line.c b/src/gallium/drivers/llvmpipe/lp_setup_line.c
> index a25a6b0..e1686ea 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup_line.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup_line.c
> @@ -600,7 +600,8 @@ try_setup_line( struct lp_setup_context *setup,
>  
>     LP_COUNT(nr_tris);
>  
> -   if (lp_context->active_statistics_queries) {
> +   if (lp_context->active_statistics_queries &&
> +       !llvmpipe_rasterization_disabled(lp_context)) {
>        lp_context->pipeline_statistics.c_primitives++;
>     }
>  
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup_point.c b/src/gallium/drivers/llvmpipe/lp_setup_point.c
> index cbcc8d4..45068ec 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup_point.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup_point.c
> @@ -384,7 +384,8 @@ try_setup_point( struct lp_setup_context *setup,
>  
>     LP_COUNT(nr_tris);
>  
> -   if (lp_context->active_statistics_queries) {
> +   if (lp_context->active_statistics_queries &&
> +       !llvmpipe_rasterization_disabled(lp_context)) {
>        lp_context->pipeline_statistics.c_primitives++;
>     }
>  
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
> index 579f351..23bc6e2 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
> @@ -340,7 +340,8 @@ do_triangle_ccw(struct lp_setup_context *setup,
>  
>     LP_COUNT(nr_tris);
>  
> -   if (lp_context->active_statistics_queries) {
> +   if (lp_context->active_statistics_queries &&
> +       !llvmpipe_rasterization_disabled(lp_context)) {
>        lp_context->pipeline_statistics.c_primitives++;
>     }
>  
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup_vbuf.c b/src/gallium/drivers/llvmpipe/lp_setup_vbuf.c
> index 8173994..bf9f7e7 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup_vbuf.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup_vbuf.c
> @@ -565,8 +565,13 @@ lp_setup_pipeline_statistics(
>        stats->gs_invocations;
>     llvmpipe->pipeline_statistics.gs_primitives +=
>        stats->gs_primitives;
> -   llvmpipe->pipeline_statistics.c_invocations +=
> -      stats->c_invocations;
> +   if (!llvmpipe_rasterization_disabled(llvmpipe)) {
> +      llvmpipe->pipeline_statistics.c_invocations +=
> +         stats->c_invocations;
> +   } else {
> +      llvmpipe->pipeline_statistics.c_invocations = 0;
> +   }
> +   
>  }
>  
>  /**
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> index 3739941..07e6685 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> @@ -2361,7 +2361,14 @@ generate_variant(struct llvmpipe_context *lp,
>           !key->alpha.enabled &&
>           !key->depth.enabled &&
>           !shader->info.base.uses_kill
> -         ? TRUE : FALSE;
> +      ? TRUE : FALSE;
> +
> +   if ((!shader || shader->info.base.num_tokens <= 1) &&
> +       !key->depth.enabled && !key->stencil[0].enabled) {
> +      variant->ps_inv_multiplier = 0;
> +   } else {
> +      variant->ps_inv_multiplier = 1;
> +   }
>  
>     if ((LP_DEBUG & DEBUG_FS) || (gallivm_debug & GALLIVM_DEBUG_IR)) {
>        lp_debug_fs_variant(variant);
> @@ -2940,3 +2947,18 @@ llvmpipe_init_fs_funcs(struct llvmpipe_context *llvmpipe)
>  
>     llvmpipe->pipe.set_constant_buffer = llvmpipe_set_constant_buffer;
>  }
> +
> +/*
> + * Rasterization is disabled if there is no pixel shader and
> + * both depth and stencil testing are disabled:
> + * http://msdn.microsoft.com/en-us/library/windows/desktop/bb205125
> + */
> +boolean
> +llvmpipe_rasterization_disabled(struct llvmpipe_context *lp)
> +{
> +   boolean null_fs = !lp->fs || lp->fs->info.base.num_tokens <= 1;
> +
> +   return (null_fs &&
> +           !lp->depth_stencil->depth.enabled &&
> +           !lp->depth_stencil->stencil[0].enabled);
> +}
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.h b/src/gallium/drivers/llvmpipe/lp_state_fs.h
> index 3314090..aac4526 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_fs.h
> +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.h
> @@ -97,6 +97,7 @@ struct lp_fragment_shader_variant
>     struct lp_fragment_shader_variant_key key;
>  
>     boolean opaque;
> +   uint8_t ps_inv_multiplier;
>  
>     struct gallivm_state *gallivm;
>  
> @@ -148,5 +149,8 @@ void
>  llvmpipe_remove_shader_variant(struct llvmpipe_context *lp,
>                                 struct lp_fragment_shader_variant *variant);
>  
> +boolean
> +llvmpipe_rasterization_disabled(struct llvmpipe_context *lp);
> +
>  
>  #endif /* LP_STATE_FS_H_ */
> 

Looks good.

Roland


More information about the mesa-dev mailing list