anv: Implement a depth stall restriction on gen7
Fixes around 60 Vulkan CTS tests on Haswell Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> Cc: "13.0" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -42,6 +42,8 @@ void genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
|
|
||||||
void genX(cmd_buffer_apply_pipe_flushes)(struct anv_cmd_buffer *cmd_buffer);
|
void genX(cmd_buffer_apply_pipe_flushes)(struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
|
||||||
|
void genX(cmd_buffer_emit_gen7_depth_flush)(struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
|
||||||
void genX(flush_pipeline_select_3d)(struct anv_cmd_buffer *cmd_buffer);
|
void genX(flush_pipeline_select_3d)(struct anv_cmd_buffer *cmd_buffer);
|
||||||
void genX(flush_pipeline_select_gpgpu)(struct anv_cmd_buffer *cmd_buffer);
|
void genX(flush_pipeline_select_gpgpu)(struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
|
||||||
|
@@ -152,6 +152,8 @@ genX(blorp_exec)(struct blorp_batch *batch,
|
|||||||
|
|
||||||
genX(flush_pipeline_select_3d)(cmd_buffer);
|
genX(flush_pipeline_select_3d)(cmd_buffer);
|
||||||
|
|
||||||
|
genX(cmd_buffer_emit_gen7_depth_flush)(cmd_buffer);
|
||||||
|
|
||||||
blorp_exec(batch, params);
|
blorp_exec(batch, params);
|
||||||
|
|
||||||
cmd_buffer->state.vb_dirty = ~0;
|
cmd_buffer->state.vb_dirty = ~0;
|
||||||
|
@@ -1816,6 +1816,35 @@ genX(flush_pipeline_select_gpgpu)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
genX(cmd_buffer_emit_gen7_depth_flush)(struct anv_cmd_buffer *cmd_buffer)
|
||||||
|
{
|
||||||
|
if (GEN_GEN >= 8)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* From the Haswell PRM, documentation for 3DSTATE_DEPTH_BUFFER:
|
||||||
|
*
|
||||||
|
* "Restriction: Prior to changing Depth/Stencil Buffer state (i.e., any
|
||||||
|
* combination of 3DSTATE_DEPTH_BUFFER, 3DSTATE_CLEAR_PARAMS,
|
||||||
|
* 3DSTATE_STENCIL_BUFFER, 3DSTATE_HIER_DEPTH_BUFFER) SW must first
|
||||||
|
* issue a pipelined depth stall (PIPE_CONTROL with Depth Stall bit
|
||||||
|
* set), followed by a pipelined depth cache flush (PIPE_CONTROL with
|
||||||
|
* Depth Flush Bit set, followed by another pipelined depth stall
|
||||||
|
* (PIPE_CONTROL with Depth Stall Bit set), unless SW can otherwise
|
||||||
|
* guarantee that the pipeline from WM onwards is already flushed (e.g.,
|
||||||
|
* via a preceding MI_FLUSH)."
|
||||||
|
*/
|
||||||
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pipe) {
|
||||||
|
pipe.DepthStallEnable = true;
|
||||||
|
}
|
||||||
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pipe) {
|
||||||
|
pipe.DepthCacheFlushEnable = true;
|
||||||
|
}
|
||||||
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pipe) {
|
||||||
|
pipe.DepthStallEnable = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
|
cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
|
||||||
{
|
{
|
||||||
@@ -1832,6 +1861,8 @@ cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
/* FIXME: Implement the PMA stall W/A */
|
/* FIXME: Implement the PMA stall W/A */
|
||||||
/* FIXME: Width and Height are wrong */
|
/* FIXME: Width and Height are wrong */
|
||||||
|
|
||||||
|
genX(cmd_buffer_emit_gen7_depth_flush)(cmd_buffer);
|
||||||
|
|
||||||
/* Emit 3DSTATE_DEPTH_BUFFER */
|
/* Emit 3DSTATE_DEPTH_BUFFER */
|
||||||
if (has_depth) {
|
if (has_depth) {
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER), db) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER), db) {
|
||||||
|
Reference in New Issue
Block a user