<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Oct 26, 2016 at 3:47 PM, Nanley Chery <span dir="ltr"><<a href="mailto:nanleychery@gmail.com" target="_blank">nanleychery@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Thu, Oct 06, 2016 at 03:21:54PM -0700, Nanley Chery wrote:<br>
> Provides an FPS increase of ~30% on the Sascha triangle and multisampling<br>
> demos.<br>
<br>
</span>After attempting to enable fast depth clears in more areas, I noticed<br>
something possibly worth sharing. Most of the performance gain from this<br>
patch isn't due to the delta in fast depth clear's performance compared<br>
to that of a regular depth clear with HiZ enabled. Most of the gain<br>
is from the avoidance of from meta's suboptimal interaction with the<br>
HiZ buffer, which if I understand correctly was as follows:<br>
        1. HiZ Resolve<br>
        2. Depth clear With HiZ enabled<br>
        3. Depth Resolve<br>
<br>
A similar increase in performance arose for slow depth clears once the<br>
meta path was replaced with blorp at commit<br>
d823f92970447859c4891728da4e48<wbr>f0c9bc0044 . It seems like the actual<br>
fast vs slow depth clear delta is only roughly 1%. I obtained that<br>
figure by simply looking at the FPS counter across several runs.<span class="HOEnZb"><font color="#888888"><br></font></span></blockquote><div><br></div><div>Cool!  Thanks for digging into this!  I'm glad that our theory (about non-HiZ clears being fast when HiZ is enabled) wasn't crazy.  If we can avoid using HiZ clears, that should make some of the tracking issues easier and we should be able to enable texture-with-hiz fairly easily.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888">
- Nanley<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
><br>
> Signed-off-by: Nanley Chery <<a href="mailto:nanley.g.chery@intel.com">nanley.g.chery@intel.com</a>><br>
> Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> (v2)<br>
><br>
> ---<br>
> v3. Emit required clear_params packet (Chad)<br>
>     Share clear_params code path IVB+ (Jason)<br>
><br>
>  src/intel/vulkan/anv_pass.c        | 13 +++++++++++++<br>
>  src/intel/vulkan/genX_cmd_<wbr>buffer.c | 24 ++++++++++++++++++++++--<br>
>  2 files changed, 35 insertions(+), 2 deletions(-)<br>
><br>
> diff --git a/src/intel/vulkan/anv_pass.c b/src/intel/vulkan/anv_pass.c<br>
> index 69c3c7e..595c2ea 100644<br>
> --- a/src/intel/vulkan/anv_pass.c<br>
> +++ b/src/intel/vulkan/anv_pass.c<br>
> @@ -155,5 +155,18 @@ void anv_GetRenderAreaGranularity(<br>
>      VkRenderPass                                renderPass,<br>
>      VkExtent2D*                                 pGranularity)<br>
>  {<br>
> +   ANV_FROM_HANDLE(anv_render_<wbr>pass, pass, renderPass);<br>
> +<br>
> +   /* This granularity satisfies HiZ fast clear alignment requirements<br>
> +    * for all sample counts.<br>
> +    */<br>
> +   for (unsigned i = 0; i < pass->subpass_count; ++i) {<br>
> +      if (pass->subpasses[i].depth_<wbr>stencil_attachment !=<br>
> +          VK_ATTACHMENT_UNUSED) {<br>
> +         *pGranularity = (VkExtent2D) { .width = 8, .height = 4 };<br>
> +         return;<br>
> +      }<br>
> +   }<br>
> +<br>
>     *pGranularity = (VkExtent2D) { 1, 1 };<br>
>  }<br>
> diff --git a/src/intel/vulkan/genX_cmd_<wbr>buffer.c b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> index ed6a109..4089fc7 100644<br>
> --- a/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> +++ b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> @@ -1318,8 +1318,27 @@ cmd_buffer_emit_depth_stencil(<wbr>struct anv_cmd_buffer *cmd_buffer)<br>
>        anv_batch_emit(&cmd_buffer-><wbr>batch, GENX(3DSTATE_STENCIL_BUFFER), sb);<br>
>     }<br>
><br>
> -   /* Clear the clear params. */<br>
> -   anv_batch_emit(&cmd_buffer-><wbr>batch, GENX(3DSTATE_CLEAR_PARAMS), cp);<br>
> +   /* From the IVB PRM Vol2P1, 11.5.5.4 3DSTATE_CLEAR_PARAMS:<br>
> +    *<br>
> +    *    3DSTATE_CLEAR_PARAMS must always be programmed in the along with<br>
> +    *    the other Depth/Stencil state commands(i.e. 3DSTATE_DEPTH_BUFFER,<br>
> +    *    3DSTATE_STENCIL_BUFFER, or 3DSTATE_HIER_DEPTH_BUFFER)<br>
> +    *<br>
> +    * Testing also shows that some variant of this restriction may exist HSW+.<br>
> +    * On BDW+, it is not possible to emit 2 of these packets consecutively when<br>
> +    * both have DepthClearValueValid set. An analysis of such state programming<br>
> +    * on SKL showed that the GPU doesn't register the latter packet's clear<br>
> +    * value.<br>
> +    */<br>
> +   anv_batch_emit(&cmd_buffer-><wbr>batch, GENX(3DSTATE_CLEAR_PARAMS), cp) {<br>
> +      if (has_hiz) {<br>
> +         cp.DepthClearValueValid = true;<br>
> +         const uint32_t ds =<br>
> +            cmd_buffer->state.subpass-><wbr>depth_stencil_attachment;<br>
> +         cp.DepthClearValue =<br>
> +            cmd_buffer->state.attachments[<wbr>ds].clear_value.depthStencil.<wbr>depth;<br>
> +      }<br>
> +   }<br>
>  }<br>
><br>
>  static void<br>
> @@ -1332,6 +1351,7 @@ genX(cmd_buffer_set_subpass)(<wbr>struct anv_cmd_buffer *cmd_buffer,<br>
><br>
>     cmd_buffer_emit_depth_stencil(<wbr>cmd_buffer);<br>
>     genX(cmd_buffer_emit_hz_op)(<wbr>cmd_buffer, BLORP_HIZ_OP_HIZ_RESOLVE);<br>
> +   genX(cmd_buffer_emit_hz_op)(<wbr>cmd_buffer, BLORP_HIZ_OP_DEPTH_CLEAR);<br>
><br>
>     anv_cmd_buffer_clear_subpass(<wbr>cmd_buffer);<br>
>  }<br>
> --<br>
> 2.10.0<br>
><br>
</div></div></blockquote></div><br></div></div>