mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 00:30:13 +01:00
anv/gen10: Ignore push constant packets during context restore.
Similar to the GL driver, ignore 3DSTATE_CONSTANT_* packets when doing a context restore. Signed-off-by: Rafael Antognolli <rafael.antognolli@intel.com> Cc: Jason Ekstrand <jason@jlekstrand.net> Cc: "18.0" <mesa-stable@lists.freedesktop.org> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
ca19ee33d7
commit
78c125af39
2 changed files with 48 additions and 0 deletions
|
|
@ -1477,6 +1477,7 @@ enum anv_pipe_bits {
|
||||||
ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT = (1 << 3),
|
ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT = (1 << 3),
|
||||||
ANV_PIPE_VF_CACHE_INVALIDATE_BIT = (1 << 4),
|
ANV_PIPE_VF_CACHE_INVALIDATE_BIT = (1 << 4),
|
||||||
ANV_PIPE_DATA_CACHE_FLUSH_BIT = (1 << 5),
|
ANV_PIPE_DATA_CACHE_FLUSH_BIT = (1 << 5),
|
||||||
|
ANV_PIPE_ISP_DISABLE_BIT = (1 << 9),
|
||||||
ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT = (1 << 10),
|
ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT = (1 << 10),
|
||||||
ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT = (1 << 11),
|
ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT = (1 << 11),
|
||||||
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT = (1 << 12),
|
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT = (1 << 12),
|
||||||
|
|
|
||||||
|
|
@ -1008,6 +1008,50 @@ genX(BeginCommandBuffer)(
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From the PRM, Volume 2a:
|
||||||
|
*
|
||||||
|
* "Indirect State Pointers Disable
|
||||||
|
*
|
||||||
|
* At the completion of the post-sync operation associated with this pipe
|
||||||
|
* control packet, the indirect state pointers in the hardware are
|
||||||
|
* considered invalid; the indirect pointers are not saved in the context.
|
||||||
|
* If any new indirect state commands are executed in the command stream
|
||||||
|
* while the pipe control is pending, the new indirect state commands are
|
||||||
|
* preserved.
|
||||||
|
*
|
||||||
|
* [DevIVB+]: Using Invalidate State Pointer (ISP) only inhibits context
|
||||||
|
* restoring of Push Constant (3DSTATE_CONSTANT_*) commands. Push Constant
|
||||||
|
* commands are only considered as Indirect State Pointers. Once ISP is
|
||||||
|
* issued in a context, SW must initialize by programming push constant
|
||||||
|
* commands for all the shaders (at least to zero length) before attempting
|
||||||
|
* any rendering operation for the same context."
|
||||||
|
*
|
||||||
|
* 3DSTATE_CONSTANT_* packets are restored during a context restore,
|
||||||
|
* even though they point to a BO that has been already unreferenced at
|
||||||
|
* the end of the previous batch buffer. This has been fine so far since
|
||||||
|
* we are protected by these scratch page (every address not covered by
|
||||||
|
* a BO should be pointing to the scratch page). But on CNL, it is
|
||||||
|
* causing a GPU hang during context restore at the 3DSTATE_CONSTANT_*
|
||||||
|
* instruction.
|
||||||
|
*
|
||||||
|
* The flag "Indirect State Pointers Disable" in PIPE_CONTROL tells the
|
||||||
|
* hardware to ignore previous 3DSTATE_CONSTANT_* packets during a
|
||||||
|
* context restore, so the mentioned hang doesn't happen. However,
|
||||||
|
* software must program push constant commands for all stages prior to
|
||||||
|
* rendering anything, so we flag them as dirty.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
emit_isp_disable(struct anv_cmd_buffer *cmd_buffer)
|
||||||
|
{
|
||||||
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||||
|
pc.IndirectStatePointersDisable = true;
|
||||||
|
pc.PostSyncOperation = WriteImmediateData;
|
||||||
|
pc.Address =
|
||||||
|
(struct anv_address) { &cmd_buffer->device->workaround_bo, 0 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VkResult
|
VkResult
|
||||||
genX(EndCommandBuffer)(
|
genX(EndCommandBuffer)(
|
||||||
VkCommandBuffer commandBuffer)
|
VkCommandBuffer commandBuffer)
|
||||||
|
|
@ -1024,6 +1068,9 @@ genX(EndCommandBuffer)(
|
||||||
|
|
||||||
genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer);
|
genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer);
|
||||||
|
|
||||||
|
if (GEN_GEN == 10)
|
||||||
|
emit_isp_disable(cmd_buffer);
|
||||||
|
|
||||||
anv_cmd_buffer_end_batch_buffer(cmd_buffer);
|
anv_cmd_buffer_end_batch_buffer(cmd_buffer);
|
||||||
|
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue