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 <ja...@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@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