Mesa (main): radv: Add pstate locking for perfcounters.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sat Jul 9 12:59:55 UTC 2022
Module: Mesa
Branch: main
Commit: f7d8e64f51121b366a1f5c026bebbdab37fb0863
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f7d8e64f51121b366a1f5c026bebbdab37fb0863
Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date: Sun May 8 15:50:22 2022 +0200
radv: Add pstate locking for perfcounters.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16879>
---
src/amd/vulkan/radv_device.c | 65 +++++++++++++++++++++++++++++++++++++++++++
src/amd/vulkan/radv_private.h | 6 ++++
src/amd/vulkan/radv_sqtt.c | 22 +--------------
3 files changed, 72 insertions(+), 21 deletions(-)
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 745bccb7986..0758dd099b3 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -3297,6 +3297,7 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr
device->instance = physical_device->instance;
device->physical_device = physical_device;
simple_mtx_init(&device->trace_mtx, mtx_plain);
+ simple_mtx_init(&device->pstate_mtx, mtx_plain);
device->ws = physical_device->ws;
vk_device_set_drm_fd(&device->vk, device->ws->get_fd(device->ws));
@@ -3564,6 +3565,7 @@ fail:
device->ws->ctx_destroy(device->hw_ctx[i]);
}
+ simple_mtx_destroy(&device->pstate_mtx);
simple_mtx_destroy(&device->trace_mtx);
mtx_destroy(&device->overallocation_mutex);
@@ -3605,6 +3607,7 @@ radv_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator)
}
mtx_destroy(&device->overallocation_mutex);
+ simple_mtx_destroy(&device->pstate_mtx);
simple_mtx_destroy(&device->trace_mtx);
radv_device_finish_meta(device);
@@ -6884,3 +6887,65 @@ radv_GetPhysicalDeviceFragmentShadingRatesKHR(
return vk_outarray_status(&out);
}
+
+static bool
+radv_thread_trace_set_pstate(struct radv_device *device, bool enable)
+{
+ struct radeon_winsys *ws = device->ws;
+ enum radeon_ctx_pstate pstate = enable ? RADEON_CTX_PSTATE_PEAK : RADEON_CTX_PSTATE_NONE;
+
+ if (device->physical_device->rad_info.has_stable_pstate) {
+ for (unsigned i = 0; i < RADV_MAX_QUEUE_FAMILIES; i++) {
+ for (unsigned q = 0; q < device->queue_count[i]; q++) {
+ struct radv_queue *queue = &device->queues[i][q];
+
+ if (ws->ctx_set_pstate(queue->hw_ctx, pstate) < 0)
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+bool
+radv_device_acquire_performance_counters(struct radv_device *device)
+{
+ bool result = true;
+ simple_mtx_lock(&device->pstate_mtx);
+
+ if (device->pstate_cnt == 0) {
+ result = radv_thread_trace_set_pstate(device, true);
+ if (result)
+ ++device->pstate_cnt;
+ }
+
+ simple_mtx_unlock(&device->pstate_mtx);
+ return result;
+}
+
+void
+radv_device_release_performance_counters(struct radv_device *device)
+{
+ simple_mtx_lock(&device->pstate_mtx);
+
+ if (--device->pstate_cnt == 0)
+ radv_thread_trace_set_pstate(device, false);
+
+ simple_mtx_unlock(&device->pstate_mtx);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+radv_AcquireProfilingLockKHR(VkDevice _device, const VkAcquireProfilingLockInfoKHR *pInfo)
+{
+ RADV_FROM_HANDLE(radv_device, device, _device);
+ bool result = radv_device_acquire_performance_counters(device);
+ return result ? VK_SUCCESS : VK_ERROR_UNKNOWN;
+}
+
+VKAPI_ATTR void VKAPI_CALL
+radv_ReleaseProfilingLockKHR(VkDevice _device)
+{
+ RADV_FROM_HANDLE(radv_device, device, _device);
+ radv_device_release_performance_counters(device);
+}
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 9ef009e89f5..1c3a51e7d8c 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -908,8 +908,14 @@ struct radv_device {
/* Whether shaders created through application entrypoints are considered internal. */
bool app_shaders_internal;
+
+ simple_mtx_t pstate_mtx;
+ unsigned pstate_cnt;
};
+bool radv_device_acquire_performance_counters(struct radv_device *device);
+void radv_device_release_performance_counters(struct radv_device *device);
+
struct radv_device_memory {
struct vk_object_base base;
struct radeon_winsys_bo *bo;
diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c
index ecd5b36af67..f2bc8d27fed 100644
--- a/src/amd/vulkan/radv_sqtt.c
+++ b/src/amd/vulkan/radv_sqtt.c
@@ -448,26 +448,6 @@ radv_thread_trace_finish_bo(struct radv_device *device)
}
}
-static int
-radv_thread_trace_init_pstate(struct radv_device *device)
-{
- struct radeon_winsys *ws = device->ws;
-
- if (device->physical_device->rad_info.has_stable_pstate) {
- for (unsigned i = 0; i < RADV_MAX_QUEUE_FAMILIES; i++) {
- for (unsigned q = 0; q < device->queue_count[i]; q++) {
- struct radv_queue *queue = &device->queues[i][q];
-
- /* Set the current pstate to peak which is required for profiling. */
- if (ws->ctx_set_pstate(queue->hw_ctx, RADEON_CTX_PSTATE_PEAK) < 0)
- return false;
- }
- }
- }
-
- return true;
-}
-
bool
radv_thread_trace_init(struct radv_device *device)
{
@@ -485,7 +465,7 @@ radv_thread_trace_init(struct radv_device *device)
if (!radv_thread_trace_init_bo(device))
return false;
- if (!radv_thread_trace_init_pstate(device))
+ if (!radv_device_acquire_performance_counters(device))
return false;
list_inithead(&thread_trace_data->rgp_pso_correlation.record);
More information about the mesa-commit
mailing list