From 335c8b68d209e4270a508fcb3e95a02931a31451 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 11 Feb 2021 19:27:24 +0100 Subject: [PATCH] radv: emit pipeline bind markers for SQTT I suspect this marker to be useful for correlating pipeline shaders. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/common/ac_sqtt.h | 26 +++++++++++++++++++++++++ src/amd/vulkan/layers/radv_sqtt_layer.c | 21 ++++++++++++++++++++ src/amd/vulkan/radv_cmd_buffer.c | 2 ++ src/amd/vulkan/radv_private.h | 3 +++ 4 files changed, 52 insertions(+) diff --git a/src/amd/common/ac_sqtt.h b/src/amd/common/ac_sqtt.h index 779bea89239..cefe5f98b13 100644 --- a/src/amd/common/ac_sqtt.h +++ b/src/amd/common/ac_sqtt.h @@ -449,4 +449,30 @@ enum rgp_sqtt_marker_user_event_type UserEventObjectName, }; +/** + * "Pipeline bind" RGP SQTT instrumentation marker (Table 12) + */ +struct rgp_sqtt_marker_pipeline_bind { + union { + struct { + uint32_t identifier : 4; + uint32_t ext_dwords : 3; + uint32_t bind_point : 1; + uint32_t cb_id : 20; + uint32_t reserved : 4; + }; + uint32_t dword01; + }; + union { + uint32_t api_pso_hash[2]; + struct { + uint32_t dword02; + uint32_t dword03; + }; + }; +}; + +static_assert(sizeof(struct rgp_sqtt_marker_pipeline_bind) == 12, + "rgp_sqtt_marker_pipeline_bind doesn't match RGP spec"); + #endif diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c b/src/amd/vulkan/layers/radv_sqtt_layer.c index e921e5b23dc..e9d4af40c06 100644 --- a/src/amd/vulkan/layers/radv_sqtt_layer.c +++ b/src/amd/vulkan/layers/radv_sqtt_layer.c @@ -290,6 +290,27 @@ radv_describe_layout_transition(struct radv_cmd_buffer *cmd_buffer, cmd_buffer->state.num_layout_transitions++; } +void +radv_describe_pipeline_bind(struct radv_cmd_buffer *cmd_buffer, + VkPipelineBindPoint pipelineBindPoint, + struct radv_pipeline *pipeline) +{ + struct rgp_sqtt_marker_pipeline_bind marker = {0}; + struct radeon_cmdbuf *cs = cmd_buffer->cs; + uint64_t pipeline_idx = (uintptr_t)pipeline; + + if (likely(!cmd_buffer->device->thread_trace.bo)) + return; + + marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_BIND_PIPELINE; + marker.cb_id = 0; + marker.bind_point = pipelineBindPoint; + marker.api_pso_hash[0] = pipeline_idx; + marker.api_pso_hash[1] = pipeline_idx >> 32; + + radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); +} + /* TODO: Improve the way to trigger capture (overlay, etc). */ static void radv_handle_thread_trace(VkQueue _queue) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index c378b6393ff..018bcccbb15 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -4478,6 +4478,8 @@ void radv_CmdBindPipeline( assert(!"invalid bind point"); break; } + + radv_describe_pipeline_bind(cmd_buffer, pipelineBindPoint, pipeline); } void radv_CmdSetViewport( diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 5c94e179107..41445cb61f1 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -2598,6 +2598,9 @@ void radv_describe_barrier_end(struct radv_cmd_buffer *cmd_buffer); void radv_describe_barrier_end_delayed(struct radv_cmd_buffer *cmd_buffer); void radv_describe_layout_transition(struct radv_cmd_buffer *cmd_buffer, const struct radv_barrier_data *barrier); +void radv_describe_pipeline_bind(struct radv_cmd_buffer *cmd_buffer, + VkPipelineBindPoint pipelineBindPoint, + struct radv_pipeline *pipeline); struct radeon_winsys_sem;