#define _POSIX_C_SOURCE 199309L #include #include #include #include #include #include #include #include #include #include struct wlr_allocator *wlr_gbm_allocator_create(int drm_fd); const struct wlr_drm_format_set *wlr_renderer_get_render_formats( struct wlr_renderer *renderer); #define BENCH_NUM 100000 static void render_rect(struct wlr_render_pass *pass, void *_data) { struct wlr_render_rect_options *data = _data; wlr_render_pass_add_rect(pass, data); } static void run_bench(struct wlr_renderer *renderer, struct wlr_buffer *buffer, void (*bench)(struct wlr_render_pass *, void *), void *data) { struct timespec start, end; clock_gettime(CLOCK_MONOTONIC_RAW, &start); struct wlr_render_pass *pass = wlr_renderer_begin_buffer_pass(renderer, buffer); for (int i = 0; i < BENCH_NUM; i++) { bench(pass, data); } wlr_render_pass_submit(pass); clock_gettime(CLOCK_MONOTONIC_RAW, &end); uint64_t delta_us = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_nsec - start.tv_nsec) / 1000; printf("%lu\n", delta_us); } int main(int argc, char *argv[]) { int fd = open("/dev/dri/card1", O_RDWR); struct wlr_allocator *alloc = wlr_gbm_allocator_create(fd); struct wlr_renderer *renderer = wlr_gles2_renderer_create_with_drm_fd(fd); const struct wlr_drm_format_set *set = wlr_renderer_get_render_formats(renderer); struct wlr_buffer *buffer = wlr_allocator_create_buffer(alloc, 1920, 1080, wlr_drm_format_set_get(set, DRM_FORMAT_ARGB8888)); for (int i = 0; i < 10; i++) { pixman_region32_t clip; pixman_region32_init(&clip); for (int ii = 0; ii < i * 10; ii++) { pixman_region32_union_rect(&clip, &clip, 0, ii, ii, 1); } struct wlr_render_rect_options data = { .box = { .x = 0, .y = 0, .width = i * 10, .height = i * 10, }, .clip = &clip, .color = { .r = 1, .g = 0.5, .b = 0.1, .a = 0.5 }, }; run_bench(renderer, buffer, &render_rect, &data); pixman_region32_fini(&clip); } return 0; }