[Mesa-dev] [PATCH 16/22] anv/hiz: Perform HiZ resolves for all partial renders

Nanley Chery nanleychery at gmail.com
Mon Oct 10 21:23:18 UTC 2016


On Fri, Oct 07, 2016 at 09:41:14PM -0700, Jason Ekstrand wrote:
> If we don't, we can end up with corruption in the portion of the depth
> buffer that lies outside the render area when we do a HiZ resolve at the
> end.  The only reason we weren't seeing this before was that all of the
> meta-based clears such as VkCmdClearDepthStencilImage were internally using
> HiZ so the HiZ buffer never truly got out-of-sync.  If the CTS ever tested
> a depth upload (which doesn't care about HiZ) and then a partial render we
> would have seen problems.  Soon, we will be using blorp to do depth clears
> and it won't bother with HiZ so we would get CTS regressions without this.
> 

I understand the problem, but I think this solution unnecessarily
penalizes the user's renderpass.

Since depth buffer updates via vkCopy*ToImage and
vkCmdClearDepthStencilImage cause the HiZ buffer to become stale,
calling

genX(cmd_buffer_emit_hz_op)(cmd_buffer, BLORP_HIZ_OP_HIZ_RESOLVE);

at the bottom of those commands should fix the issue without the extra
penalty. I'd imagine that as a prequisite, blorp would have to learn to
emit enough depth stencil state for this command.

-Nanley

> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> ---
>  src/intel/vulkan/gen8_cmd_buffer.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/src/intel/vulkan/gen8_cmd_buffer.c b/src/intel/vulkan/gen8_cmd_buffer.c
> index e6a3c3d..44ffcbf 100644
> --- a/src/intel/vulkan/gen8_cmd_buffer.c
> +++ b/src/intel/vulkan/gen8_cmd_buffer.c
> @@ -513,7 +513,17 @@ genX(cmd_buffer_emit_hz_op)(struct anv_cmd_buffer *cmd_buffer,
>           return;
>        break;
>     case BLORP_HIZ_OP_HIZ_RESOLVE:
> -      if (cmd_buffer->state.pass->attachments[ds].load_op !=
> +      /* If the render area covers the entire surface *and* load_op is either
> +       * CLEAR or DONT_CARE then the previous contents of the depth buffer
> +       * will be entirely discarded.  In this case, we can skip the HiZ
> +       * resolve.
> +       *
> +       * If the render area is not the full surface, we need to do
> +       * the resolve because otherwise data outside the render area may get
> +       * garbled by the resolve at the end of the render pass.
> +       */
> +      if (full_surface_op &&
> +          cmd_buffer->state.pass->attachments[ds].load_op !=
>            VK_ATTACHMENT_LOAD_OP_LOAD)
>           return;
>        break;
> -- 
> 2.5.0.400.gff86faf
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list