hack: measure timings

This commit is contained in:
Simon Ser 2023-11-24 21:24:46 +01:00
parent fee8969955
commit 2c0fdb7e65
2 changed files with 34 additions and 0 deletions

View file

@ -317,6 +317,7 @@ struct wlr_vk_upload_task {
uint32_t src_stride, dst_size;
pixman_region32_t region;
const struct wlr_pixel_format_info *format_info;
int64_t start;
};
struct wlr_vk_pipeline *setup_get_or_create_pipeline(

View file

@ -16,6 +16,8 @@
#include "render/pixel_format.h"
#include "render/vulkan.h"
#include "util/time.h"
static const struct wlr_texture_impl texture_impl;
bool wlr_texture_is_vk(struct wlr_texture *wlr_texture) {
@ -110,9 +112,17 @@ static bool write_upload_task(const struct wlr_vk_upload_task *task, int fd) {
static void process_upload_task(struct wlr_vk_renderer *renderer,
struct wlr_vk_upload_task *task) {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
int64_t start = timespec_to_nsec(&ts);
copy_pixels(task->dst, task->src, task->buffer->width, task->src_stride,
task->dst_size, &task->region, task->format_info);
clock_gettime(CLOCK_MONOTONIC, &ts);
int64_t dur_ns = timespec_to_nsec(&ts) - start;
wlr_log(WLR_INFO, "UPLOAD: %f ms", (double)dur_ns / 1000 / 1000);
VkSemaphoreSignalInfoKHR signal_info = {
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR,
.semaphore = renderer->upload_timeline_semaphore,
@ -147,6 +157,11 @@ static void handle_upload_task_complete(struct wlr_vk_renderer *renderer,
wlr_buffer_end_data_ptr_access(task->buffer);
wlr_buffer_unlock(task->buffer);
pixman_region32_fini(&task->region);
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
int64_t dur_ns = timespec_to_nsec(&ts) - task->start;
wlr_log(WLR_INFO, "TOTAL: %f ms", (double)dur_ns / 1000 / 1000);
}
static int handle_upload_fd_event(int fd, uint32_t mask, void *data) {
@ -218,6 +233,10 @@ static bool start_upload(struct wlr_vk_texture *texture, struct wlr_buffer *buff
VkAccessFlags src_access) {
struct wlr_vk_renderer *renderer = texture->renderer;
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
int64_t start = timespec_to_nsec(&ts);
const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info(texture->format->drm);
assert(format_info);
@ -292,13 +311,22 @@ static bool start_upload(struct wlr_vk_texture *texture, struct wlr_buffer *buff
.src_stride = stride,
.dst_size = bsize,
.format_info = format_info,
.start = start,
};
pixman_region32_init(&task.region);
pixman_region32_copy(&task.region, region);
#if 1
if (!write_upload_task(&task, renderer->upload.control_fd)) {
free(copies);
return false;
}
#else
process_upload_task(renderer, &task);
handle_upload_task_complete(renderer, &task);
#endif
clock_gettime(CLOCK_MONOTONIC, &ts);
start = timespec_to_nsec(&ts);
// record staging cb
// will be executed before next frame
@ -308,6 +336,10 @@ static bool start_upload(struct wlr_vk_texture *texture, struct wlr_buffer *buff
return false;
}
clock_gettime(CLOCK_MONOTONIC, &ts);
int64_t dur_ns = timespec_to_nsec(&ts) - start;
wlr_log(WLR_INFO, "STARTUP: %f ms", (double)dur_ns / 1000 / 1000);
vulkan_change_layout(cb, texture->image,
old_layout, src_stage, src_access,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT,
@ -315,6 +347,7 @@ static bool start_upload(struct wlr_vk_texture *texture, struct wlr_buffer *buff
vkCmdCopyBufferToImage(cb, span.buffer->buffer, texture->image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (uint32_t)rects_len, copies);
vulkan_change_layout(cb, texture->image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT,