radv/rgp: Use common trace trigger
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20573>
This commit is contained in:

committed by
Marge Bot

parent
3e11640127
commit
e0641ed59f
@@ -521,20 +521,19 @@ radv_describe_pipeline_bind(struct radv_cmd_buffer *cmd_buffer, VkPipelineBindPo
|
|||||||
radv_emit_sqtt_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
|
radv_emit_sqtt_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Improve the way to trigger capture (overlay, etc). */
|
|
||||||
static void
|
static void
|
||||||
radv_handle_sqtt(VkQueue _queue)
|
radv_handle_sqtt(VkQueue _queue)
|
||||||
{
|
{
|
||||||
RADV_FROM_HANDLE(radv_queue, queue, _queue);
|
RADV_FROM_HANDLE(radv_queue, queue, _queue);
|
||||||
static bool sqtt_enabled = false;
|
|
||||||
static uint64_t num_frames = 0;
|
|
||||||
bool resize_trigger = false;
|
|
||||||
|
|
||||||
if (sqtt_enabled) {
|
bool trigger = queue->device->sqtt_triggered;
|
||||||
|
queue->device->sqtt_triggered = false;
|
||||||
|
|
||||||
|
if (queue->device->sqtt_enabled) {
|
||||||
struct ac_sqtt_trace sqtt_trace = {0};
|
struct ac_sqtt_trace sqtt_trace = {0};
|
||||||
|
|
||||||
radv_end_sqtt(queue);
|
radv_end_sqtt(queue);
|
||||||
sqtt_enabled = false;
|
queue->device->sqtt_enabled = false;
|
||||||
|
|
||||||
/* TODO: Do something better than this whole sync. */
|
/* TODO: Do something better than this whole sync. */
|
||||||
queue->device->vk.dispatch_table.QueueWaitIdle(_queue);
|
queue->device->vk.dispatch_table.QueueWaitIdle(_queue);
|
||||||
@@ -551,48 +550,26 @@ radv_handle_sqtt(VkQueue _queue)
|
|||||||
/* Trigger a new capture if the driver failed to get
|
/* Trigger a new capture if the driver failed to get
|
||||||
* the trace because the buffer was too small.
|
* the trace because the buffer was too small.
|
||||||
*/
|
*/
|
||||||
resize_trigger = true;
|
trigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear resources used for this capture. */
|
/* Clear resources used for this capture. */
|
||||||
radv_reset_sqtt_trace(queue->device);
|
radv_reset_sqtt_trace(queue->device);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sqtt_enabled) {
|
if (trigger) {
|
||||||
bool frame_trigger = num_frames == queue->device->sqtt.start_frame;
|
if (ac_check_profile_state(&queue->device->physical_device->rad_info)) {
|
||||||
bool file_trigger = false;
|
fprintf(stderr, "radv: Canceling RGP trace request as a hang condition has been "
|
||||||
#ifndef _WIN32
|
"detected. Force the GPU into a profiling mode with e.g. "
|
||||||
if (queue->device->sqtt.trigger_file && access(queue->device->sqtt.trigger_file, W_OK) == 0) {
|
"\"echo profile_peak > "
|
||||||
if (unlink(queue->device->sqtt.trigger_file) == 0) {
|
"/sys/class/drm/card0/device/power_dpm_force_performance_level\"\n");
|
||||||
file_trigger = true;
|
return;
|
||||||
} else {
|
|
||||||
/* Do not enable tracing if we cannot remove the file,
|
|
||||||
* because by then we'll trace every frame ... */
|
|
||||||
fprintf(stderr, "RADV: could not remove thread trace trigger file, ignoring\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (frame_trigger || file_trigger || resize_trigger) {
|
radv_begin_sqtt(queue);
|
||||||
if (ac_check_profile_state(&queue->device->physical_device->rad_info)) {
|
assert(!queue->device->sqtt_enabled);
|
||||||
fprintf(stderr, "radv: Canceling RGP trace request as a hang condition has been "
|
queue->device->sqtt_enabled = true;
|
||||||
"detected. Force the GPU into a profiling mode with e.g. "
|
|
||||||
"\"echo profile_peak > "
|
|
||||||
"/sys/class/drm/card0/device/power_dpm_force_performance_level\"\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sample CPU/GPU clocks before starting the trace. */
|
|
||||||
if (!radv_sqtt_sample_clocks(queue->device)) {
|
|
||||||
fprintf(stderr, "radv: Failed to sample clocks\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
radv_begin_sqtt(queue);
|
|
||||||
assert(!sqtt_enabled);
|
|
||||||
sqtt_enabled = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
num_frames++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VKAPI_ATTR VkResult VKAPI_CALL
|
VKAPI_ATTR VkResult VKAPI_CALL
|
||||||
|
@@ -83,9 +83,10 @@ typedef void *drmDevicePtr;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
radv_spm_trace_enabled()
|
radv_spm_trace_enabled(struct radv_instance *instance)
|
||||||
{
|
{
|
||||||
return radv_sqtt_enabled() && debug_get_bool_option("RADV_THREAD_TRACE_CACHE_COUNTERS", true);
|
return (instance->vk.trace_mode == RADV_TRACE_MODE_RGP) &&
|
||||||
|
debug_get_bool_option("RADV_THREAD_TRACE_CACHE_COUNTERS", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
VKAPI_ATTR VkResult VKAPI_CALL
|
VKAPI_ATTR VkResult VKAPI_CALL
|
||||||
@@ -553,7 +554,7 @@ init_dispatch_tables(struct radv_device *device, struct radv_physical_device *ph
|
|||||||
add_entrypoints(&b, &rage2_device_entrypoints, RADV_APP_DISPATCH_TABLE);
|
add_entrypoints(&b, &rage2_device_entrypoints, RADV_APP_DISPATCH_TABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (radv_sqtt_enabled())
|
if (physical_device->instance->vk.trace_mode & RADV_TRACE_MODE_RGP)
|
||||||
add_entrypoints(&b, &sqtt_device_entrypoints, RADV_RGP_DISPATCH_TABLE);
|
add_entrypoints(&b, &sqtt_device_entrypoints, RADV_RGP_DISPATCH_TABLE);
|
||||||
|
|
||||||
if ((physical_device->instance->vk.trace_mode & RADV_TRACE_MODE_RRA) && radv_enable_rt(physical_device, false))
|
if ((physical_device->instance->vk.trace_mode & RADV_TRACE_MODE_RRA) && radv_enable_rt(physical_device, false))
|
||||||
@@ -625,6 +626,9 @@ capture_trace(VkQueue _queue)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (queue->device->instance->vk.trace_mode & RADV_TRACE_MODE_RGP)
|
||||||
|
queue->device->sqtt_triggered = true;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -925,7 +929,7 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr
|
|||||||
radv_dump_enabled_options(device, stderr);
|
radv_dump_enabled_options(device, stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (radv_sqtt_enabled()) {
|
if (device->instance->vk.trace_mode & RADV_TRACE_MODE_RGP) {
|
||||||
if (device->physical_device->rad_info.gfx_level < GFX8 || device->physical_device->rad_info.gfx_level > GFX11) {
|
if (device->physical_device->rad_info.gfx_level < GFX8 || device->physical_device->rad_info.gfx_level > GFX11) {
|
||||||
fprintf(stderr, "GPU hardware not supported: refer to "
|
fprintf(stderr, "GPU hardware not supported: refer to "
|
||||||
"the RGP documentation for the list of "
|
"the RGP documentation for the list of "
|
||||||
@@ -942,9 +946,9 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr
|
|||||||
"radv: Thread trace support is enabled (initial buffer size: %u MiB, "
|
"radv: Thread trace support is enabled (initial buffer size: %u MiB, "
|
||||||
"instruction timing: %s, cache counters: %s).\n",
|
"instruction timing: %s, cache counters: %s).\n",
|
||||||
device->sqtt.buffer_size / (1024 * 1024), radv_is_instruction_timing_enabled() ? "enabled" : "disabled",
|
device->sqtt.buffer_size / (1024 * 1024), radv_is_instruction_timing_enabled() ? "enabled" : "disabled",
|
||||||
radv_spm_trace_enabled() ? "enabled" : "disabled");
|
radv_spm_trace_enabled(device->instance) ? "enabled" : "disabled");
|
||||||
|
|
||||||
if (radv_spm_trace_enabled()) {
|
if (radv_spm_trace_enabled(device->instance)) {
|
||||||
/* TODO: add SPM counters for GFX11. */
|
/* TODO: add SPM counters for GFX11. */
|
||||||
if (device->physical_device->rad_info.gfx_level == GFX10 ||
|
if (device->physical_device->rad_info.gfx_level == GFX10 ||
|
||||||
device->physical_device->rad_info.gfx_level == GFX10_3) {
|
device->physical_device->rad_info.gfx_level == GFX10_3) {
|
||||||
|
@@ -247,6 +247,17 @@ static const struct vk_instance_extension_table radv_instance_extensions_support
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
radv_handle_legacy_sqtt_trigger(struct vk_instance *instance)
|
||||||
|
{
|
||||||
|
char *trigger_file = getenv("RADV_THREAD_TRACE_TRIGGER");
|
||||||
|
if (trigger_file) {
|
||||||
|
instance->trace_trigger_file = trigger_file;
|
||||||
|
instance->trace_mode |= RADV_TRACE_MODE_RGP;
|
||||||
|
fprintf(stderr, "WARNING: RADV_THREAD_TRACE_TRIGGER is deprecated, please use MESA_VK_TRACE_TRIGGER instead.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VKAPI_ATTR VkResult VKAPI_CALL
|
VKAPI_ATTR VkResult VKAPI_CALL
|
||||||
radv_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
|
radv_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
|
||||||
VkInstance *pInstance)
|
VkInstance *pInstance)
|
||||||
@@ -273,6 +284,7 @@ radv_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationC
|
|||||||
}
|
}
|
||||||
|
|
||||||
vk_instance_add_driver_trace_modes(&instance->vk, trace_options);
|
vk_instance_add_driver_trace_modes(&instance->vk, trace_options);
|
||||||
|
radv_handle_legacy_sqtt_trigger(&instance->vk);
|
||||||
|
|
||||||
instance->debug_flags = parse_debug_string(getenv("RADV_DEBUG"), radv_debug_options);
|
instance->debug_flags = parse_debug_string(getenv("RADV_DEBUG"), radv_debug_options);
|
||||||
instance->perftest_flags = parse_debug_string(getenv("RADV_PERFTEST"), radv_perftest_options);
|
instance->perftest_flags = parse_debug_string(getenv("RADV_PERFTEST"), radv_perftest_options);
|
||||||
|
@@ -53,18 +53,12 @@ typedef void *drmDevicePtr;
|
|||||||
#include "ac_llvm_util.h"
|
#include "ac_llvm_util.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool
|
|
||||||
radv_sqtt_enabled(void)
|
|
||||||
{
|
|
||||||
return debug_get_num_option("RADV_THREAD_TRACE", -1) >= 0 || getenv("RADV_THREAD_TRACE_TRIGGER");
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
radv_perf_query_supported(const struct radv_physical_device *pdev)
|
radv_perf_query_supported(const struct radv_physical_device *pdev)
|
||||||
{
|
{
|
||||||
/* SQTT / SPM interfere with the register states for perf counters, and
|
/* SQTT / SPM interfere with the register states for perf counters, and
|
||||||
* the code has only been tested on GFX10.3 */
|
* the code has only been tested on GFX10.3 */
|
||||||
return pdev->rad_info.gfx_level == GFX10_3 && !radv_sqtt_enabled();
|
return pdev->rad_info.gfx_level == GFX10_3 && !(pdev->instance->vk.trace_mode & RADV_TRACE_MODE_RGP);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@@ -477,7 +471,7 @@ radv_physical_device_get_supported_extensions(const struct radv_physical_device
|
|||||||
.EXT_conditional_rendering = true,
|
.EXT_conditional_rendering = true,
|
||||||
.EXT_conservative_rasterization = device->rad_info.gfx_level >= GFX9,
|
.EXT_conservative_rasterization = device->rad_info.gfx_level >= GFX9,
|
||||||
.EXT_custom_border_color = true,
|
.EXT_custom_border_color = true,
|
||||||
.EXT_debug_marker = radv_sqtt_enabled(),
|
.EXT_debug_marker = device->instance->vk.trace_mode & RADV_TRACE_MODE_RGP,
|
||||||
.EXT_depth_bias_control = true,
|
.EXT_depth_bias_control = true,
|
||||||
.EXT_depth_clip_control = true,
|
.EXT_depth_clip_control = true,
|
||||||
.EXT_depth_clip_enable = true,
|
.EXT_depth_clip_enable = true,
|
||||||
@@ -1894,7 +1888,7 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm
|
|||||||
device->ws = radv_null_winsys_create();
|
device->ws = radv_null_winsys_create();
|
||||||
#else
|
#else
|
||||||
if (drm_device) {
|
if (drm_device) {
|
||||||
bool reserve_vmid = radv_sqtt_enabled();
|
bool reserve_vmid = instance->vk.trace_mode & RADV_TRACE_MODE_RGP;
|
||||||
|
|
||||||
device->ws = radv_amdgpu_winsys_create(fd, instance->debug_flags, instance->perftest_flags, reserve_vmid);
|
device->ws = radv_amdgpu_winsys_create(fd, instance->debug_flags, instance->perftest_flags, reserve_vmid);
|
||||||
} else {
|
} else {
|
||||||
@@ -2491,7 +2485,7 @@ radv_GetPhysicalDeviceToolProperties(VkPhysicalDevice physicalDevice, uint32_t *
|
|||||||
uint32_t tool_count = 0;
|
uint32_t tool_count = 0;
|
||||||
|
|
||||||
/* RGP */
|
/* RGP */
|
||||||
rgp_enabled = radv_sqtt_enabled();
|
rgp_enabled = pdevice->instance->vk.trace_mode & RADV_TRACE_MODE_RGP;
|
||||||
if (rgp_enabled)
|
if (rgp_enabled)
|
||||||
tool_count++;
|
tool_count++;
|
||||||
|
|
||||||
|
@@ -388,8 +388,6 @@ VkResult create_drm_physical_device(struct vk_instance *vk_instance, struct _drm
|
|||||||
|
|
||||||
void radv_physical_device_destroy(struct vk_physical_device *vk_device);
|
void radv_physical_device_destroy(struct vk_physical_device *vk_device);
|
||||||
|
|
||||||
bool radv_sqtt_enabled(void);
|
|
||||||
|
|
||||||
enum radv_trace_mode {
|
enum radv_trace_mode {
|
||||||
/** Radeon GPU Profiler */
|
/** Radeon GPU Profiler */
|
||||||
RADV_TRACE_MODE_RGP = 1 << VK_TRACE_MODE_COUNT,
|
RADV_TRACE_MODE_RGP = 1 << VK_TRACE_MODE_COUNT,
|
||||||
@@ -1043,6 +1041,8 @@ struct radv_device {
|
|||||||
|
|
||||||
/* Thread trace. */
|
/* Thread trace. */
|
||||||
struct ac_sqtt sqtt;
|
struct ac_sqtt sqtt;
|
||||||
|
bool sqtt_enabled;
|
||||||
|
bool sqtt_triggered;
|
||||||
|
|
||||||
/* Memory trace. */
|
/* Memory trace. */
|
||||||
struct radv_memory_trace_data memory_trace;
|
struct radv_memory_trace_data memory_trace;
|
||||||
|
@@ -574,11 +574,6 @@ radv_sqtt_init(struct radv_device *device)
|
|||||||
|
|
||||||
/* Default buffer size set to 32MB per SE. */
|
/* Default buffer size set to 32MB per SE. */
|
||||||
device->sqtt.buffer_size = (uint32_t)debug_get_num_option("RADV_THREAD_TRACE_BUFFER_SIZE", 32 * 1024 * 1024);
|
device->sqtt.buffer_size = (uint32_t)debug_get_num_option("RADV_THREAD_TRACE_BUFFER_SIZE", 32 * 1024 * 1024);
|
||||||
device->sqtt.start_frame = (int)debug_get_num_option("RADV_THREAD_TRACE", -1);
|
|
||||||
|
|
||||||
const char *trigger_file = getenv("RADV_THREAD_TRACE_TRIGGER");
|
|
||||||
if (trigger_file)
|
|
||||||
device->sqtt.trigger_file = strdup(trigger_file);
|
|
||||||
|
|
||||||
if (!radv_sqtt_init_bo(device))
|
if (!radv_sqtt_init_bo(device))
|
||||||
return false;
|
return false;
|
||||||
@@ -599,8 +594,6 @@ radv_sqtt_finish(struct radv_device *device)
|
|||||||
struct ac_sqtt *sqtt = &device->sqtt;
|
struct ac_sqtt *sqtt = &device->sqtt;
|
||||||
struct radeon_winsys *ws = device->ws;
|
struct radeon_winsys *ws = device->ws;
|
||||||
|
|
||||||
free(device->sqtt.trigger_file);
|
|
||||||
|
|
||||||
radv_sqtt_finish_bo(device);
|
radv_sqtt_finish_bo(device);
|
||||||
|
|
||||||
for (unsigned i = 0; i < 2; i++) {
|
for (unsigned i = 0; i < 2; i++) {
|
||||||
|
Reference in New Issue
Block a user