From f268f031af238f26cc747136656a2f1582583891 Mon Sep 17 00:00:00 2001 From: Martin Fouilleul Date: Mon, 28 Aug 2023 18:28:14 +0200 Subject: [PATCH 1/2] Set user-created surfaces to non-blocking and use the debug overlay surface to block on vsync. --- src/runtime.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index cfaa115..aa8e896 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -187,6 +187,7 @@ i32 orca_surface_callback(void* user) { orca_surface_create_data* data = (orca_surface_create_data*)user; data->surface = oc_surface_create_for_window(data->window, data->api); + oc_surface_swap_interval(data->surface, 0); //NOTE: this will be called on main thread, so we need to deselect the surface here, // and reselect it on the orca thread @@ -673,6 +674,20 @@ i32 orca_runloop(void* user) } } + oc_surface_deselect(); + + if(exports[OC_EXPORT_FRAME_REFRESH]) + { + M3Result res = m3_Call(exports[OC_EXPORT_FRAME_REFRESH], 0, 0); + if(res) + { + ORCA_WASM3_ABORT(app->runtime.m3Runtime, res, "Runtime error"); + } + } + + oc_surface_select(app->debugOverlay.surface); + oc_canvas_set_current(app->debugOverlay.canvas); + if(app->debugOverlay.show) { oc_surface_bring_to_front(app->debugOverlay.surface); @@ -804,27 +819,15 @@ i32 orca_runloop(void* user) } } - oc_surface_select(app->debugOverlay.surface); - oc_canvas_set_current(app->debugOverlay.canvas); oc_ui_draw(); - - oc_render(app->debugOverlay.surface, app->debugOverlay.canvas); } - - if(exports[OC_EXPORT_FRAME_REFRESH]) + else { - M3Result res = m3_Call(exports[OC_EXPORT_FRAME_REFRESH], 0, 0); - if(res) - { - ORCA_WASM3_ABORT(app->runtime.m3Runtime, res, "Runtime error"); - } - } - - if(app->debugOverlay.show) - { - oc_surface_select(app->debugOverlay.surface); - oc_surface_present(app->debugOverlay.surface); + oc_set_color_rgba(0, 0, 0, 0); + oc_clear(); } + oc_render(app->debugOverlay.surface, app->debugOverlay.canvas); + oc_surface_present(app->debugOverlay.surface); oc_arena_clear(oc_scratch()); } @@ -862,7 +865,7 @@ int main(int argc, char** argv) app->debugOverlay.maxEntries = 200; oc_arena_init(&app->debugOverlay.logArena); - oc_surface_swap_interval(app->debugOverlay.surface, 0); + oc_surface_swap_interval(app->debugOverlay.surface, 1); oc_surface_set_hidden(app->debugOverlay.surface, true); -- 2.25.1 From 46ef9ee7e820fee846cd136b7bb476b4e52576c2 Mon Sep 17 00:00:00 2001 From: martinfouilleul Date: Mon, 28 Aug 2023 19:33:02 +0200 Subject: [PATCH 2/2] don't hide debug overlay, paint it transparent instead, brought to you by Windows stuttering and crashing on close if you call SwapBuffer on a hidden window :*) --- src/runtime.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index aa8e896..b851e90 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -251,7 +251,6 @@ void orca_surface_render_commands(oc_surface surface, void debug_overlay_toggle(oc_debug_overlay* overlay) { overlay->show = !overlay->show; - oc_surface_set_hidden(overlay->surface, !overlay->show); if(overlay->show) { @@ -826,6 +825,7 @@ i32 orca_runloop(void* user) oc_set_color_rgba(0, 0, 0, 0); oc_clear(); } + oc_render(app->debugOverlay.surface, app->debugOverlay.canvas); oc_surface_present(app->debugOverlay.surface); @@ -867,8 +867,6 @@ int main(int argc, char** argv) oc_surface_swap_interval(app->debugOverlay.surface, 1); - oc_surface_set_hidden(app->debugOverlay.surface, true); - oc_surface_deselect(); //WARN: this is a workaround to avoid stalling the first few times we acquire drawables from -- 2.25.1