speed up metal rendering
This commit is contained in:
@@ -166,6 +166,9 @@ struct Renderer {
|
|||||||
CTFontRef measure_font;
|
CTFontRef measure_font;
|
||||||
F32 measure_font_size;
|
F32 measure_font_size;
|
||||||
|
|
||||||
|
// Current drawable (acquired in begin_frame)
|
||||||
|
id<CAMetalDrawable> current_drawable;
|
||||||
|
|
||||||
// Clear color
|
// Clear color
|
||||||
F32 clear_r, clear_g, clear_b;
|
F32 clear_r, clear_g, clear_b;
|
||||||
};
|
};
|
||||||
@@ -635,18 +638,23 @@ void renderer_destroy(Renderer *r) {
|
|||||||
|
|
||||||
bool renderer_begin_frame(Renderer *r) {
|
bool renderer_begin_frame(Renderer *r) {
|
||||||
if (r->width <= 0 || r->height <= 0) return false;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderer_end_frame(Renderer *r, Clay_RenderCommandArray render_commands) {
|
void renderer_end_frame(Renderer *r, Clay_RenderCommandArray render_commands) {
|
||||||
dispatch_semaphore_wait(r->frame_semaphore, DISPATCH_TIME_FOREVER);
|
|
||||||
|
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
id<CAMetalDrawable> drawable = [r->metal_layer nextDrawable];
|
id<CAMetalDrawable> drawable = r->current_drawable;
|
||||||
if (!drawable) {
|
r->current_drawable = nil;
|
||||||
dispatch_semaphore_signal(r->frame_semaphore);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t buf_idx = r->frame_index % NUM_BACK_BUFFERS;
|
uint32_t buf_idx = r->frame_index % NUM_BACK_BUFFERS;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user