[Mesa-dev] [PATCH 2/2] llvmpipe: turn depth clears into full depth/stencil clears for d24x8 formats

Jose Fonseca jfonseca at vmware.com
Mon Jan 18 14:55:35 PST 2016


On 18/01/16 03:33, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> If we have a d24x8 format, there is no stencil. Therefore, we can always
> clear these bits too, which means this will be some kind of memset rather
> than read-modify-write.
> This is good for some 7% increase or so in gears with huge window size -
> seems to have a bigger effect if things aren't in caches. Of course, any
> real app won't spend nearly as much time comparatively in clearing
> depth buffer in the first place, so the speedup will be much lower.
> ---
>   src/gallium/drivers/llvmpipe/lp_setup.c | 25 ++++++++++++++-----------
>   1 file changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
> index e8c3e7c..34d3c81 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup.c
> @@ -476,27 +476,30 @@ lp_setup_try_clear_zs(struct lp_setup_context *setup,
>      uint64_t zsvalue = 0;
>      uint32_t zmask32;
>      uint8_t smask8;
> +   enum pipe_format format = setup->fb.zsbuf->format;
>
>      LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
>
>      zmask32 = (flags & PIPE_CLEAR_DEPTH) ? ~0 : 0;
>      smask8 = (flags & PIPE_CLEAR_STENCIL) ? ~0 : 0;
>
> -   zsvalue = util_pack64_z_stencil(setup->fb.zsbuf->format,
> -                                   depth,
> -                                   stencil);
> +   zsvalue = util_pack64_z_stencil(format, depth, stencil);
>
> -   /*
> -    * XXX: should make a full mask here for things like D24X8,
> -    * otherwise we'll do a read-modify-write clear later which
> -    * should be unnecessary.
> -    */
> -   zsmask = util_pack64_mask_z_stencil(setup->fb.zsbuf->format,
> -                                       zmask32,
> -                                       smask8);
> +   zsmask = util_pack64_mask_z_stencil(format, zmask32, smask8);
>
>      zsvalue &= zsmask;
>
> +   if (format == PIPE_FORMAT_Z24X8_UNORM ||
> +       format == PIPE_FORMAT_X8Z24_UNORM) {
> +      /*
> +       * Make full mask if there's "X" bits so we can do full
> +       * clear (without rmw).
> +       */
> +      uint32_t zsmask_full = 0;
> +      zsmask_full = util_pack_mask_z_stencil(format, ~0, ~0);
> +      zsmask |= ~zsmask_full;
> +   }
> +
>      if (setup->state == SETUP_ACTIVE) {
>         struct lp_scene *scene = setup->scene;
>
>

Series is

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>


More information about the mesa-dev mailing list