speed up metal rendering

This commit is contained in:
2026-03-03 12:30:13 -05:00
parent 3173fabfc1
commit 19bf78d635

View File

@@ -166,6 +166,9 @@ struct Renderer {
CTFontRef measure_font;
F32 measure_font_size;
// Current drawable (acquired in begin_frame)
id<CAMetalDrawable> current_drawable;
// Clear color
F32 clear_r, clear_g, clear_b;
};
@@ -635,18 +638,23 @@ void renderer_destroy(Renderer *r) {
bool renderer_begin_frame(Renderer *r) {
if (r->width <= 0 || r->height <= 0) return false;
// Wait for an in-flight frame to finish, then acquire a drawable.
// Doing this BEFORE input sampling ensures the freshest mouse position
// is used for rendering, reducing perceived drag latency.
dispatch_semaphore_wait(r->frame_semaphore, DISPATCH_TIME_FOREVER);
r->current_drawable = [r->metal_layer nextDrawable];
if (!r->current_drawable) {
dispatch_semaphore_signal(r->frame_semaphore);
return false;
}
return true;
}
void renderer_end_frame(Renderer *r, Clay_RenderCommandArray render_commands) {
dispatch_semaphore_wait(r->frame_semaphore, DISPATCH_TIME_FOREVER);
@autoreleasepool {
id<CAMetalDrawable> drawable = [r->metal_layer nextDrawable];
if (!drawable) {
dispatch_semaphore_signal(r->frame_semaphore);
return;
}
id<CAMetalDrawable> drawable = r->current_drawable;
r->current_drawable = nil;
uint32_t buf_idx = r->frame_index % NUM_BACK_BUFFERS;