mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-25 17:50:39 +02:00
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:
parent
9936e91808
commit
5154a0831e
4 changed files with 138 additions and 4 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue