anv: implement gen9 post sync pipe control workaround
We've been missing this workaround for a while and since it's required for Gen12, let's implement it for Gen9 first. v2: Update comment for Gen9. v3: Fix clearing of bits... (Lionel) Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Cc: <mesa-stable@lists.freedesktop.org> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3405>
This commit is contained in:

committed by
Marge Bot

parent
19e7bcee17
commit
8949d27bb8
@@ -2272,6 +2272,12 @@ enum anv_pipe_bits {
|
|||||||
* done by writing the AUX-TT register.
|
* done by writing the AUX-TT register.
|
||||||
*/
|
*/
|
||||||
ANV_PIPE_AUX_TABLE_INVALIDATE_BIT = (1 << 23),
|
ANV_PIPE_AUX_TABLE_INVALIDATE_BIT = (1 << 23),
|
||||||
|
|
||||||
|
/* This bit does not exist directly in PIPE_CONTROL. It means that a
|
||||||
|
* PIPE_CONTROL with a post-sync operation will follow. This is used to
|
||||||
|
* implement a workaround for Gen9.
|
||||||
|
*/
|
||||||
|
ANV_PIPE_POST_SYNC_BIT = (1 << 24),
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ANV_PIPE_FLUSH_BITS ( \
|
#define ANV_PIPE_FLUSH_BITS ( \
|
||||||
|
@@ -2050,6 +2050,21 @@ genX(cmd_buffer_apply_pipe_flushes)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
sizeof(cmd_buffer->state.gfx.ib_dirty_range));
|
sizeof(cmd_buffer->state.gfx.ib_dirty_range));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Project: SKL / Argument: LRI Post Sync Operation [23]
|
||||||
|
*
|
||||||
|
* "PIPECONTROL command with “Command Streamer Stall Enable” must be
|
||||||
|
* programmed prior to programming a PIPECONTROL command with "LRI
|
||||||
|
* Post Sync Operation" in GPGPU mode of operation (i.e when
|
||||||
|
* PIPELINE_SELECT command is set to GPGPU mode of operation)."
|
||||||
|
*
|
||||||
|
* The same text exists a few rows below for Post Sync Op.
|
||||||
|
*/
|
||||||
|
if (bits & ANV_PIPE_POST_SYNC_BIT) {
|
||||||
|
if (GEN_GEN == 9 && cmd_buffer->state.current_pipeline == GPGPU)
|
||||||
|
bits |= ANV_PIPE_CS_STALL_BIT;
|
||||||
|
bits &= ~ANV_PIPE_POST_SYNC_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
if (bits & (ANV_PIPE_FLUSH_BITS | ANV_PIPE_CS_STALL_BIT)) {
|
if (bits & (ANV_PIPE_FLUSH_BITS | ANV_PIPE_CS_STALL_BIT)) {
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pipe) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pipe) {
|
||||||
#if GEN_GEN >= 12
|
#if GEN_GEN >= 12
|
||||||
@@ -4619,6 +4634,9 @@ cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
isl_emit_depth_stencil_hiz_s(&device->isl_dev, dw, &info);
|
isl_emit_depth_stencil_hiz_s(&device->isl_dev, dw, &info);
|
||||||
|
|
||||||
if (GEN_GEN >= 12) {
|
if (GEN_GEN >= 12) {
|
||||||
|
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_POST_SYNC_BIT;
|
||||||
|
genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer);
|
||||||
|
|
||||||
/* GEN:BUG:1408224581
|
/* GEN:BUG:1408224581
|
||||||
*
|
*
|
||||||
* Workaround: Gen12LP Astep only An additional pipe control with
|
* Workaround: Gen12LP Astep only An additional pipe control with
|
||||||
@@ -5570,6 +5588,9 @@ void genX(CmdSetEvent)(
|
|||||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||||
ANV_FROM_HANDLE(anv_event, event, _event);
|
ANV_FROM_HANDLE(anv_event, event, _event);
|
||||||
|
|
||||||
|
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_POST_SYNC_BIT;
|
||||||
|
genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer);
|
||||||
|
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||||
if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {
|
if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {
|
||||||
pc.StallAtPixelScoreboard = true;
|
pc.StallAtPixelScoreboard = true;
|
||||||
@@ -5594,6 +5615,9 @@ void genX(CmdResetEvent)(
|
|||||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||||
ANV_FROM_HANDLE(anv_event, event, _event);
|
ANV_FROM_HANDLE(anv_event, event, _event);
|
||||||
|
|
||||||
|
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_POST_SYNC_BIT;
|
||||||
|
genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer);
|
||||||
|
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||||
if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {
|
if (stageMask & ANV_PIPELINE_STAGE_PIPELINED_BITS) {
|
||||||
pc.StallAtPixelScoreboard = true;
|
pc.StallAtPixelScoreboard = true;
|
||||||
|
@@ -424,6 +424,9 @@ static void
|
|||||||
emit_ps_depth_count(struct anv_cmd_buffer *cmd_buffer,
|
emit_ps_depth_count(struct anv_cmd_buffer *cmd_buffer,
|
||||||
struct anv_address addr)
|
struct anv_address addr)
|
||||||
{
|
{
|
||||||
|
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_POST_SYNC_BIT;
|
||||||
|
genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer);
|
||||||
|
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||||
pc.DestinationAddressType = DAT_PPGTT;
|
pc.DestinationAddressType = DAT_PPGTT;
|
||||||
pc.PostSyncOperation = WritePSDepthCount;
|
pc.PostSyncOperation = WritePSDepthCount;
|
||||||
@@ -448,6 +451,9 @@ emit_query_pc_availability(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
struct anv_address addr,
|
struct anv_address addr,
|
||||||
bool available)
|
bool available)
|
||||||
{
|
{
|
||||||
|
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_POST_SYNC_BIT;
|
||||||
|
genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer);
|
||||||
|
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||||
pc.DestinationAddressType = DAT_PPGTT;
|
pc.DestinationAddressType = DAT_PPGTT;
|
||||||
pc.PostSyncOperation = WriteImmediateData;
|
pc.PostSyncOperation = WriteImmediateData;
|
||||||
@@ -832,6 +838,9 @@ void genX(CmdWriteTimestamp)(
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
/* Everything else is bottom-of-pipe */
|
/* Everything else is bottom-of-pipe */
|
||||||
|
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_POST_SYNC_BIT;
|
||||||
|
genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer);
|
||||||
|
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
|
||||||
pc.DestinationAddressType = DAT_PPGTT;
|
pc.DestinationAddressType = DAT_PPGTT;
|
||||||
pc.PostSyncOperation = WriteTimestamp;
|
pc.PostSyncOperation = WriteTimestamp;
|
||||||
|
Reference in New Issue
Block a user