From c3658f5a5d31e3512c0c1dcf2e1c9d0c21438de8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tapani=20P=C3=A4lli?= Date: Wed, 7 Jun 2023 10:52:53 +0300 Subject: [PATCH] anv: wrap pipe control emission to a set of helper functions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This makes it possible to have HW specific rules and WA's implemented in a central place. Also all pipe controls will get anv_debug_dump_pc. Signed-off-by: Tapani Pälli Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/anv_genX.h | 13 ++++++ src/intel/vulkan/genX_cmd_buffer.c | 82 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h index 61617de..2b271d0 100644 --- a/src/intel/vulkan/anv_genX.h +++ b/src/intel/vulkan/anv_genX.h @@ -222,3 +222,16 @@ genX(batch_set_preemption)(struct anv_batch *batch, bool value); void genX(cmd_buffer_set_preemption)(struct anv_cmd_buffer *cmd_buffer, bool value); + +void +genX(batch_emit_pipe_control)(struct anv_batch *batch, + const struct intel_device_info *devinfo, + enum anv_pipe_bits bits); + +void +genX(batch_emit_pipe_control_write)(struct anv_batch *batch, + const struct intel_device_info *devinfo, + uint32_t post_sync_op, + struct anv_address address, + uint32_t imm_data, + enum anv_pipe_bits bits); diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 5c4a4c0..a4b6800 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -3149,6 +3149,88 @@ cmd_buffer_emit_scissor(struct anv_cmd_buffer *cmd_buffer) } } +ALWAYS_INLINE void +genX(batch_emit_pipe_control)(struct anv_batch *batch, + const struct intel_device_info *devinfo, + enum anv_pipe_bits bits) +{ + genX(batch_emit_pipe_control_write)(batch, + devinfo, + NoWrite, + ANV_NULL_ADDRESS, + 0, + bits); +} + +ALWAYS_INLINE void +genX(batch_emit_pipe_control_write)(struct anv_batch *batch, + const struct intel_device_info *devinfo, + uint32_t post_sync_op, + struct anv_address address, + uint32_t imm_data, + enum anv_pipe_bits bits) +{ + /* XXX - insert all workarounds and GFX specific things below. */ + +#if INTEL_NEEDS_WA_1409600907 + /* Wa_1409600907: "PIPE_CONTROL with Depth Stall Enable bit must + * be set with any PIPE_CONTROL with Depth Flush Enable bit set. + */ + if (bits & ANV_PIPE_DEPTH_CACHE_FLUSH_BIT) + bits |= ANV_PIPE_DEPTH_STALL_BIT; +#endif + + anv_batch_emit(batch, GENX(PIPE_CONTROL), pipe) { +#if GFX_VERx10 >= 125 + pipe.UntypedDataPortCacheFlushEnable = + bits & ANV_PIPE_UNTYPED_DATAPORT_CACHE_FLUSH_BIT; +#endif +#if GFX_VER >= 12 + pipe.TileCacheFlushEnable = bits & ANV_PIPE_TILE_CACHE_FLUSH_BIT; +#endif +#if GFX_VER >= 11 + pipe.HDCPipelineFlushEnable = bits & ANV_PIPE_HDC_PIPELINE_FLUSH_BIT; +#endif + pipe.DepthCacheFlushEnable = bits & ANV_PIPE_DEPTH_CACHE_FLUSH_BIT; + pipe.DCFlushEnable = bits & ANV_PIPE_DATA_CACHE_FLUSH_BIT; + pipe.RenderTargetCacheFlushEnable = + bits & ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; + + pipe.DepthStallEnable = bits & ANV_PIPE_DEPTH_STALL_BIT; + +#if GFX_VERx10 >= 125 + pipe.PSSStallSyncEnable = bits & ANV_PIPE_PSS_STALL_SYNC_BIT; +#endif + pipe.CommandStreamerStallEnable = bits & ANV_PIPE_CS_STALL_BIT; + pipe.StallAtPixelScoreboard = bits & ANV_PIPE_STALL_AT_SCOREBOARD_BIT; + + pipe.StateCacheInvalidationEnable = + bits & ANV_PIPE_STATE_CACHE_INVALIDATE_BIT; + pipe.ConstantCacheInvalidationEnable = + bits & ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT; +#if GFX_VER >= 12 + /* Invalidates the L3 cache part in which index & vertex data is loaded + * when VERTEX_BUFFER_STATE::L3BypassDisable is set. + */ + pipe.L3ReadOnlyCacheInvalidationEnable = + bits & ANV_PIPE_VF_CACHE_INVALIDATE_BIT; +#endif + pipe.VFCacheInvalidationEnable = + bits & ANV_PIPE_VF_CACHE_INVALIDATE_BIT; + pipe.TextureCacheInvalidationEnable = + bits & ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT; + pipe.InstructionCacheInvalidateEnable = + bits & ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT; + + pipe.PostSyncOperation = post_sync_op; + pipe.Address = address; + pipe.DestinationAddressType = DAT_PPGTT; + pipe.ImmediateData = imm_data; + + anv_debug_dump_pc(pipe); + } +} + /* Set preemption on/off. */ void genX(batch_set_preemption)(struct anv_batch *batch, bool value) -- 2.7.4