From ef9e7cb3f52ef141314a90c609344f4eae02885b Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 7 Apr 2025 12:40:24 +0200 Subject: [PATCH] radv: add before/after draw functions for DGC Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_dgc.c | 67 +++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/src/amd/vulkan/radv_dgc.c b/src/amd/vulkan/radv_dgc.c index 48dc7fe8bb1..35e68e72b2d 100644 --- a/src/amd/vulkan/radv_dgc.c +++ b/src/amd/vulkan/radv_dgc.c @@ -1157,6 +1157,22 @@ dgc_gfx12_emit_hiz_his_wa(struct dgc_cmdbuf *cs) } } +static void +dgc_emit_before_draw(struct dgc_cmdbuf *cs, nir_def *sequence_id, enum rgp_sqtt_marker_general_api_type api_type, + enum rgp_sqtt_marker_event_type event) +{ + dgc_emit_sqtt_begin_api_marker(cs, api_type); + dgc_emit_sqtt_marker_event(cs, sequence_id, event); +} + +static void +dgc_emit_after_draw(struct dgc_cmdbuf *cs, enum rgp_sqtt_marker_general_api_type api_type) +{ + dgc_gfx12_emit_hiz_his_wa(cs); + dgc_emit_sqtt_thread_trace_marker(cs); + dgc_emit_sqtt_end_api_marker(cs, api_type); +} + static void dgc_emit_userdata_vertex(struct dgc_cmdbuf *cs, nir_def *first_vertex, nir_def *first_instance, nir_def *drawid) { @@ -1293,15 +1309,13 @@ dgc_emit_draw_indirect(struct dgc_cmdbuf *cs, nir_def *stream_addr, nir_def *seq nir_def *va = nir_iadd_imm(b, stream_addr, layout->vk.draw_src_offset_B); - dgc_emit_sqtt_begin_api_marker(cs, indexed ? ApiCmdDrawIndexedIndirect : ApiCmdDrawIndirect); - dgc_emit_sqtt_marker_event(cs, sequence_id, indexed ? EventCmdDrawIndexedIndirect : EventCmdDrawIndirect); + dgc_emit_before_draw(cs, sequence_id, indexed ? ApiCmdDrawIndexedIndirect : ApiCmdDrawIndirect, + indexed ? EventCmdDrawIndexedIndirect : EventCmdDrawIndirect); dgc_emit_pkt3_set_base(cs, va); dgc_emit_pkt3_draw_indirect(cs, indexed); - dgc_gfx12_emit_hiz_his_wa(cs); - dgc_emit_sqtt_thread_trace_marker(cs); - dgc_emit_sqtt_end_api_marker(cs, indexed ? ApiCmdDrawIndexedIndirect : ApiCmdDrawIndirect); + dgc_emit_after_draw(cs, indexed ? ApiCmdDrawIndexedIndirect : ApiCmdDrawIndirect); } static void @@ -1319,16 +1333,13 @@ dgc_emit_draw(struct dgc_cmdbuf *cs, nir_def *stream_addr, nir_def *sequence_id) nir_push_if(b, nir_iand(b, nir_ine_imm(b, vertex_count, 0), nir_ine_imm(b, instance_count, 0))); { - dgc_emit_sqtt_begin_api_marker(cs, ApiCmdDraw); - dgc_emit_sqtt_marker_event(cs, sequence_id, EventCmdDraw); + dgc_emit_before_draw(cs, sequence_id, ApiCmdDraw, EventCmdDraw); dgc_emit_userdata_vertex(cs, vertex_offset, first_instance, nir_imm_int(b, 0)); dgc_emit_instance_count(cs, instance_count); dgc_emit_draw_index_auto(cs, vertex_count); - dgc_gfx12_emit_hiz_his_wa(cs); - dgc_emit_sqtt_thread_trace_marker(cs); - dgc_emit_sqtt_end_api_marker(cs, ApiCmdDraw); + dgc_emit_after_draw(cs, ApiCmdDraw); } nir_pop_if(b, 0); } @@ -1352,16 +1363,13 @@ dgc_emit_draw_indexed(struct dgc_cmdbuf *cs, nir_def *stream_addr, nir_def *sequ nir_push_if(b, nir_iand(b, nir_ine_imm(b, index_count, 0), nir_ine_imm(b, instance_count, 0))); { - dgc_emit_sqtt_begin_api_marker(cs, ApiCmdDrawIndexed); - dgc_emit_sqtt_marker_event(cs, sequence_id, EventCmdDrawIndexed); + dgc_emit_before_draw(cs, sequence_id, ApiCmdDrawIndexed, EventCmdDrawIndexed); dgc_emit_userdata_vertex(cs, vertex_offset, first_instance, nir_imm_int(b, 0)); dgc_emit_instance_count(cs, instance_count); dgc_emit_draw_index_offset_2(cs, first_index, index_count, max_index_count); - dgc_gfx12_emit_hiz_his_wa(cs); - dgc_emit_sqtt_thread_trace_marker(cs); - dgc_emit_sqtt_end_api_marker(cs, ApiCmdDrawIndexed); + dgc_emit_after_draw(cs, ApiCmdDrawIndexed); } nir_pop_if(b, 0); } @@ -1394,8 +1402,8 @@ dgc_emit_draw_with_count(struct dgc_cmdbuf *cs, nir_def *stream_addr, nir_def *s nir_def *di_src_sel = nir_imm_int(b, indexed ? V_0287F0_DI_SRC_SEL_DMA : V_0287F0_DI_SRC_SEL_AUTO_INDEX); - dgc_emit_sqtt_begin_api_marker(cs, indexed ? ApiCmdDrawIndexedIndirectCount : ApiCmdDrawIndirectCount); - dgc_emit_sqtt_marker_event(cs, sequence_id, indexed ? EventCmdDrawIndexedIndirectCount : EventCmdDrawIndirectCount); + dgc_emit_before_draw(cs, sequence_id, indexed ? ApiCmdDrawIndexedIndirectCount : ApiCmdDrawIndirectCount, + indexed ? EventCmdDrawIndexedIndirectCount : EventCmdDrawIndirectCount); dgc_cs_begin(cs); dgc_cs_emit_imm(PKT3(indexed ? PKT3_DRAW_INDEX_INDIRECT_MULTI : PKT3_DRAW_INDIRECT_MULTI, 8, false)); @@ -1410,9 +1418,7 @@ dgc_emit_draw_with_count(struct dgc_cmdbuf *cs, nir_def *stream_addr, nir_def *s dgc_cs_emit(di_src_sel); dgc_cs_end(); - dgc_gfx12_emit_hiz_his_wa(cs); - dgc_emit_sqtt_thread_trace_marker(cs); - dgc_emit_sqtt_end_api_marker(cs, indexed ? ApiCmdDrawIndexedIndirectCount : ApiCmdDrawIndirectCount); + dgc_emit_after_draw(cs, indexed ? ApiCmdDrawIndexedIndirectCount : ApiCmdDrawIndirectCount); } /** @@ -2097,8 +2103,7 @@ dgc_emit_dispatch_taskmesh_gfx(struct dgc_cmdbuf *cs, nir_def *sequence_id) nir_bcsel(b, has_linear_dispatch_en, nir_imm_int(b, S_4D1_LINEAR_DISPATCH_ENABLE(1)), nir_imm_int(b, 0)); nir_def *sqtt_enable = nir_imm_int(b, device->sqtt.bo ? S_4D1_THREAD_TRACE_MARKER_ENABLE(1) : 0); - dgc_emit_sqtt_begin_api_marker(cs, ApiCmdDrawMeshTasksEXT); - dgc_emit_sqtt_marker_event(cs, sequence_id, EventCmdDrawMeshTasksEXT); + dgc_emit_before_draw(cs, sequence_id, ApiCmdDrawMeshTasksEXT, EventCmdDrawMeshTasksEXT); dgc_cs_begin(cs); dgc_cs_emit_imm(PKT3(PKT3_DISPATCH_TASKMESH_GFX, 2, 0) | PKT3_RESET_FILTER_CAM_S(1)); @@ -2112,9 +2117,7 @@ dgc_emit_dispatch_taskmesh_gfx(struct dgc_cmdbuf *cs, nir_def *sequence_id) dgc_cs_emit_imm(V_0287F0_DI_SRC_SEL_AUTO_INDEX); dgc_cs_end(); - dgc_gfx12_emit_hiz_his_wa(cs); - dgc_emit_sqtt_thread_trace_marker(cs); - dgc_emit_sqtt_end_api_marker(cs, ApiCmdDrawMeshTasksEXT); + dgc_emit_after_draw(cs, ApiCmdDrawMeshTasksEXT); } static void @@ -2139,8 +2142,7 @@ dgc_emit_draw_mesh_tasks_gfx(struct dgc_cmdbuf *cs, nir_def *stream_addr, nir_de } nir_push_else(b, NULL); { - dgc_emit_sqtt_begin_api_marker(cs, ApiCmdDrawMeshTasksEXT); - dgc_emit_sqtt_marker_event(cs, sequence_id, EventCmdDrawMeshTasksEXT); + dgc_emit_before_draw(cs, sequence_id, ApiCmdDrawMeshTasksEXT, EventCmdDrawMeshTasksEXT); dgc_emit_userdata_mesh(cs, x, y, z, sequence_id); dgc_emit_instance_count(cs, nir_imm_int(b, 1)); @@ -2152,9 +2154,7 @@ dgc_emit_draw_mesh_tasks_gfx(struct dgc_cmdbuf *cs, nir_def *stream_addr, nir_de dgc_emit_draw_index_auto(cs, vertex_count); } - dgc_gfx12_emit_hiz_his_wa(cs); - dgc_emit_sqtt_thread_trace_marker(cs); - dgc_emit_sqtt_end_api_marker(cs, ApiCmdDrawMeshTasksEXT); + dgc_emit_after_draw(cs, ApiCmdDrawMeshTasksEXT); } nir_pop_if(b, NULL); } @@ -2203,8 +2203,7 @@ dgc_emit_draw_mesh_tasks_with_count_gfx(struct dgc_cmdbuf *cs, nir_def *stream_a nir_bcsel(b, has_drawid, nir_imm_int(b, S_4C2_DRAW_INDEX_ENABLE(1)), nir_imm_int(b, 0)); nir_def *xyz_dim_enable = nir_bcsel(b, has_grid_size, nir_imm_int(b, S_4C2_XYZ_DIM_ENABLE(1)), nir_imm_int(b, 0)); - dgc_emit_sqtt_begin_api_marker(cs, ApiCmdDrawMeshTasksIndirectCountEXT); - dgc_emit_sqtt_marker_event(cs, sequence_id, EventCmdDrawMeshTasksIndirectCountEXT); + dgc_emit_before_draw(cs, sequence_id, ApiCmdDrawMeshTasksIndirectCountEXT, EventCmdDrawMeshTasksIndirectCountEXT); dgc_cs_begin(cs); dgc_cs_emit(nir_imm_int(b, PKT3(PKT3_DISPATCH_MESH_INDIRECT_MULTI, 7, false) | PKT3_RESET_FILTER_CAM_S(1))); @@ -2225,9 +2224,7 @@ dgc_emit_draw_mesh_tasks_with_count_gfx(struct dgc_cmdbuf *cs, nir_def *stream_a dgc_cs_emit_imm(V_0287F0_DI_SRC_SEL_AUTO_INDEX); dgc_cs_end(); - dgc_gfx12_emit_hiz_his_wa(cs); - dgc_emit_sqtt_thread_trace_marker(cs); - dgc_emit_sqtt_end_api_marker(cs, ApiCmdDrawMeshTasksIndirectCountEXT); + dgc_emit_after_draw(cs, ApiCmdDrawMeshTasksIndirectCountEXT); } nir_pop_if(b, NULL); }