anv/blorp: Do more flushing around HiZ clears
We make the flush after a HiZ clear unconditional and add a flush/stall before the clear as well. Cc: mesa-stable@lists.freedesktop.org Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107760 Reviewed-by: Chad Versace <chadversary@chromium.org> Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
This commit is contained in:
@@ -1604,6 +1604,24 @@ anv_image_hiz_clear(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
ISL_AUX_USAGE_NONE, &stencil);
|
ISL_AUX_USAGE_NONE, &stencil);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* From the Sky Lake PRM Volume 7, "Depth Buffer Clear":
|
||||||
|
*
|
||||||
|
* "The following is required when performing a depth buffer clear with
|
||||||
|
* using the WM_STATE or 3DSTATE_WM:
|
||||||
|
*
|
||||||
|
* * If other rendering operations have preceded this clear, a
|
||||||
|
* PIPE_CONTROL with depth cache flush enabled, Depth Stall bit
|
||||||
|
* enabled must be issued before the rectangle primitive used for
|
||||||
|
* the depth buffer clear operation.
|
||||||
|
* * [...]"
|
||||||
|
*
|
||||||
|
* Even though the PRM only says that this is required if using 3DSTATE_WM
|
||||||
|
* and a 3DPRIMITIVE, it appears to also sometimes hang when doing a clear
|
||||||
|
* with WM_HZ_OP.
|
||||||
|
*/
|
||||||
|
cmd_buffer->state.pending_pipe_bits |=
|
||||||
|
ANV_PIPE_DEPTH_CACHE_FLUSH_BIT | ANV_PIPE_DEPTH_STALL_BIT;
|
||||||
|
|
||||||
blorp_hiz_clear_depth_stencil(&batch, &depth, &stencil,
|
blorp_hiz_clear_depth_stencil(&batch, &depth, &stencil,
|
||||||
level, base_layer, layer_count,
|
level, base_layer, layer_count,
|
||||||
area.offset.x, area.offset.y,
|
area.offset.x, area.offset.y,
|
||||||
@@ -1618,18 +1636,22 @@ anv_image_hiz_clear(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
|
|
||||||
/* From the SKL PRM, Depth Buffer Clear:
|
/* From the SKL PRM, Depth Buffer Clear:
|
||||||
*
|
*
|
||||||
* Depth Buffer Clear Workaround
|
* "Depth Buffer Clear Workaround
|
||||||
* Depth buffer clear pass using any of the methods (WM_STATE, 3DSTATE_WM
|
*
|
||||||
* or 3DSTATE_WM_HZ_OP) must be followed by a PIPE_CONTROL command with
|
* Depth buffer clear pass using any of the methods (WM_STATE,
|
||||||
* DEPTH_STALL bit and Depth FLUSH bits “set” before starting to render.
|
* 3DSTATE_WM or 3DSTATE_WM_HZ_OP) must be followed by a PIPE_CONTROL
|
||||||
* DepthStall and DepthFlush are not needed between consecutive depth clear
|
* command with DEPTH_STALL bit and Depth FLUSH bits “set” before
|
||||||
* passes nor is it required if the depth-clear pass was done with
|
* starting to render. DepthStall and DepthFlush are not needed between
|
||||||
* “full_surf_clear” bit set in the 3DSTATE_WM_HZ_OP.
|
* consecutive depth clear passes nor is it required if the depth-clear
|
||||||
|
* pass was done with “full_surf_clear” bit set in the
|
||||||
|
* 3DSTATE_WM_HZ_OP."
|
||||||
|
*
|
||||||
|
* Even though the PRM provides a bunch of conditions under which this is
|
||||||
|
* supposedly unnecessary, we choose to perform the flush unconditionally
|
||||||
|
* just to be safe.
|
||||||
*/
|
*/
|
||||||
if (aspects & VK_IMAGE_ASPECT_DEPTH_BIT) {
|
cmd_buffer->state.pending_pipe_bits |=
|
||||||
cmd_buffer->state.pending_pipe_bits |=
|
ANV_PIPE_DEPTH_CACHE_FLUSH_BIT | ANV_PIPE_DEPTH_STALL_BIT;
|
||||||
ANV_PIPE_DEPTH_CACHE_FLUSH_BIT | ANV_PIPE_DEPTH_STALL_BIT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Reference in New Issue
Block a user