On Fri, Jan 19, 2018 at 03:47:30PM -0800, Jason Ekstrand wrote:
> The current strategy we use for managing resolves has an issues where we
> track clear colors and the need for resolves per-LOD but we still allow
> resolves of only a subset of the slices in any given LOD and doing so
> sets the "needs resolve" flag for that LOD to false while leaving the
> remaining layers unresolved.  This patch is only the first step and does
> not, by itself fix anything.  However, it's fairly self-contained and
> splitting it out means any performance regressions should bisect to this
> nice obvious commit rather than to the giant "rework aux tracking"
> commit.
> 
> Nanley and I did some testing and none of the applications we tested
> even tried to fast-clear anything other than the first slice of an
> image.  The applications tested were:
> 

Thanks for documenting the tested apps! We could be a tad more precise
by noting that we didn't check if an app cleared a subset of its
layers.. though even if they did, we wouldn't try to optimize for it so
it doesn't really matter.

>  * All Sascha Willems demos
>  * Aztec Ruins
>  * Dota 2
>  * The Talos Principle
>  * Mad Max
> 

I'm also seeing the same behavior in the following apps:
 * Warhammer 40,000: Dawn of War III
 * Serious Sam Fusion 2017: BFE

Feel free to add them on.

> While not the full list of shipping applications, it's a pretty good
> spread and covers most of the engines we've seen running on our driver.
> If this is ever shown to be a performance problem in the future, we can
> reconsider our strategy.
> ---
>  src/intel/vulkan/genX_cmd_buffer.c | 34 +++++++++++++++++-----------------
>  1 file changed, 17 insertions(+), 17 deletions(-)
> 
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
> b/src/intel/vulkan/genX_cmd_buffer.c
> index ad7b9fc..0f56719 100644
> --- a/src/intel/vulkan/genX_cmd_buffer.c
> +++ b/src/intel/vulkan/genX_cmd_buffer.c
> @@ -309,23 +309,6 @@ color_attachment_compute_aux_usage(struct anv_device * 
> device,
>        if (GEN_GEN <= 8 && !att_state->clear_color_is_zero_one)
>           att_state->fast_clear = false;
>  
> -      /* We allow fast clears when all aux layers of the miplevel are 
> targeted.
> -       * See add_fast_clear_state_buffer() for more information. Also, 
> because
> -       * we only either do a fast clear or a normal clear and not both, this
> -       * complies with the gen7 restriction of not fast-clearing multiple
> -       * layers.
> -       */
> -      if (cmd_state->framebuffer->layers !=
> -          anv_image_aux_layers(iview->image, VK_IMAGE_ASPECT_COLOR_BIT,
> -                               iview->planes[0].isl.base_level)) {
> -         att_state->fast_clear = false;
> -         if (GEN_GEN == 7) {
> -            anv_perf_warn(device->instance, iview->image,
> -                          "Not fast-clearing the first layer in "
> -                          "a multi-layer fast clear.");
> -         }
> -      }
> -
>        /* We only allow fast clears in the GENERAL layout if the auxiliary
>         * buffer is always enabled and the fast-clear value is all 0's. See
>         * add_fast_clear_state_buffer() for more information.
> @@ -337,6 +320,23 @@ color_attachment_compute_aux_usage(struct anv_device * 
> device,
>           att_state->fast_clear = false;
>        }
>  
> +      /* We only allow fast clears to the first slice of an image (level 0,
> +       * layer 0) and only for the entire slice.  This guarantees us that, at
> +       * any given time, there is only one clear color on any given image at
> +       * any given time.  At the time of our testing (Jan 17, 2018), there
> +       * were known applications which would benefit from fast-clearing more
                ^
                no
> +       * than just the first slice.
> +       */
> +      if (att_state->fast_clear &&
> +          (iview->planes[0].isl.base_level > 0 ||
> +           iview->image->type == VK_IMAGE_TYPE_3D ||
> +           iview->image->array_size > 0)) {

These conditions seem too restrictive. Instead of restricting
fast-clears to the first slice of an image, we're restricting
fast-clears to images with only one layer. Also, the imageview could
point to the first slice even if the base image is 3D.

> +         anv_perf_warn(device->instance, iview->image,
> +                       "Rendering to a multi-LOD or multi-layer framebuffer "
> +                       "with LOAD_OP_CLEAR.  Not fast-clearing");
> +         att_state->fast_clear = false;
> +      }
> +
>        if (att_state->fast_clear) {
>           memcpy(fast_clear_color->u32, att_state->clear_value.color.uint32,
>                  sizeof(fast_clear_color->u32));
> -- 
> 2.5.0.400.gff86faf
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to