tu: Add perfetto memory tracing

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28058>
This commit is contained in:
Rob Clark 2024-03-07 10:50:37 -08:00 committed by Marge Bot
parent 9936e91808
commit 5154a0831e
4 changed files with 138 additions and 4 deletions

View file

@ -2961,6 +2961,9 @@ tu_BindBufferMemory2(VkDevice device,
(VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT |
VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT))
tu_bo_allow_dump(dev, mem->bo);
#ifdef HAVE_PERFETTO
tu_perfetto_log_bind_buffer(dev, buffer);
#endif
} else {
buffer->bo = NULL;
}
@ -2996,6 +2999,9 @@ tu_BindImageMemory2(VkDevice _device,
} else {
image->map = NULL;
}
#ifdef HAVE_PERFETTO
tu_perfetto_log_bind_image(device, image);
#endif
} else {
image->bo = NULL;
image->map = NULL;
@ -3118,6 +3124,10 @@ tu_CreateBuffer(VkDevice _device,
TU_RMV(buffer_create, device, buffer);
#ifdef HAVE_PERFETTO
tu_perfetto_log_create_buffer(device, buffer);
#endif
*pBuffer = tu_buffer_to_handle(buffer);
return VK_SUCCESS;
@ -3136,6 +3146,10 @@ tu_DestroyBuffer(VkDevice _device,
TU_RMV(buffer_destroy, device, buffer);
#ifdef HAVE_PERFETTO
tu_perfetto_log_destroy_buffer(device, buffer);
#endif
vk_buffer_destroy(&device->vk, pAllocator, &buffer->vk);
}

View file

@ -735,6 +735,10 @@ tu_CreateImage(VkDevice _device,
TU_RMV(image_create, device, image);
#ifdef HAVE_PERFETTO
tu_perfetto_log_create_image(device, image);
#endif
*pImage = tu_image_to_handle(image);
#if DETECT_OS_ANDROID
@ -758,6 +762,10 @@ tu_DestroyImage(VkDevice _device,
TU_RMV(image_destroy, device, image);
#ifdef HAVE_PERFETTO
tu_perfetto_log_destroy_image(device, image);
#endif
#if DETECT_OS_ANDROID
if (image->owned_memory != VK_NULL_HANDLE)
tu_FreeMemory(_device, image->owned_memory, pAllocator);

View file

@ -7,6 +7,7 @@
#include "tu_perfetto.h"
#include "tu_device.h"
#include "tu_image.h"
#include "util/hash_table.h"
#include "util/perf/u_perfetto.h"
@ -301,6 +302,27 @@ stage_end(struct tu_device *dev, uint64_t ts_ns, enum tu_stage_id stage_id,
});
}
class TuMemoryDataSource : public perfetto::DataSource<TuMemoryDataSource> {
public:
void OnSetup(const SetupArgs &) override
{
}
void OnStart(const StartArgs &) override
{
PERFETTO_LOG("Memory tracing started");
}
void OnStop(const StopArgs &) override
{
PERFETTO_LOG("Memory tracing stopped");
}
};
PERFETTO_DECLARE_DATA_SOURCE_STATIC_MEMBERS(TuMemoryDataSource);
PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS(TuMemoryDataSource);
#ifdef __cplusplus
extern "C" {
#endif
@ -310,14 +332,22 @@ tu_perfetto_init(void)
{
util_perfetto_init();
{
perfetto::DataSourceDescriptor dsd;
#if DETECT_OS_ANDROID
/* AGI requires this name */
dsd.set_name("gpu.renderstages");
/* AGI requires this name */
dsd.set_name("gpu.renderstages");
#else
dsd.set_name("gpu.renderstages.msm");
dsd.set_name("gpu.renderstages.msm");
#endif
TuRenderpassDataSource::Register(dsd);
TuRenderpassDataSource::Register(dsd);
}
{
perfetto::DataSourceDescriptor dsd;
dsd.set_name("gpu.memory.msm");
TuMemoryDataSource::Register(dsd);
}
}
static void
@ -529,6 +559,80 @@ tu_perfetto_end_cmd_buffer_annotation_rp(
flush_data, payload, NULL);
}
static void
log_mem(struct tu_device *dev, struct tu_buffer *buffer, struct tu_image *image,
perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::Operation op)
{
TuMemoryDataSource::Trace([=](TuMemoryDataSource::TraceContext tctx) {
auto packet = tctx.NewTracePacket();
packet->set_timestamp(perfetto::base::GetBootTimeNs().count());
auto event = packet->set_vulkan_memory_event();
event->set_timestamp(perfetto::base::GetBootTimeNs().count());
event->set_operation(op);
event->set_pid(getpid());
if (buffer) {
event->set_source(perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::SOURCE_BUFFER);
event->set_memory_size(buffer->vk.size);
if (buffer->bo)
event->set_memory_address(buffer->iova);
} else {
assert(image);
event->set_source(perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::SOURCE_IMAGE);
event->set_memory_size(image->layout[0].size);
if (image->bo)
event->set_memory_address(image->iova);
}
});
}
void
tu_perfetto_log_create_buffer(struct tu_device *dev, struct tu_buffer *buffer)
{
log_mem(dev, buffer, NULL, perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::OP_CREATE);
}
void
tu_perfetto_log_bind_buffer(struct tu_device *dev, struct tu_buffer *buffer)
{
log_mem(dev, buffer, NULL, perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::OP_BIND);
}
void
tu_perfetto_log_destroy_buffer(struct tu_device *dev, struct tu_buffer *buffer)
{
log_mem(dev, buffer, NULL, buffer->bo ?
perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::OP_DESTROY_BOUND :
perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::OP_DESTROY);
}
void
tu_perfetto_log_create_image(struct tu_device *dev, struct tu_image *image)
{
log_mem(dev, NULL, image, perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::OP_CREATE);
}
void
tu_perfetto_log_bind_image(struct tu_device *dev, struct tu_image *image)
{
log_mem(dev, NULL, image, perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::OP_BIND);
}
void
tu_perfetto_log_destroy_image(struct tu_device *dev, struct tu_image *image)
{
log_mem(dev, NULL, image, image->bo ?
perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::OP_DESTROY_BOUND :
perfetto::protos::pbzero::perfetto_pbzero_enum_VulkanMemoryEvent::OP_DESTROY);
}
#ifdef __cplusplus
}
#endif

View file

@ -51,6 +51,14 @@ tu_perfetto_submit(struct tu_device *dev,
uint32_t submission_id,
struct tu_perfetto_clocks *clocks);
void tu_perfetto_log_create_buffer(struct tu_device *dev, struct tu_buffer *buffer);
void tu_perfetto_log_bind_buffer(struct tu_device *dev, struct tu_buffer *buffer);
void tu_perfetto_log_destroy_buffer(struct tu_device *dev, struct tu_buffer *buffer);
void tu_perfetto_log_create_image(struct tu_device *dev, struct tu_image *image);
void tu_perfetto_log_bind_image(struct tu_device *dev, struct tu_image *image);
void tu_perfetto_log_destroy_image(struct tu_device *dev, struct tu_image *image);
#ifdef __cplusplus
}
#endif