From 0f0b23e38b7b26fe34d7b586b2112ead97053dc2 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 3 Oct 2024 11:45:29 +0200 Subject: [PATCH] WIP: improve flush --- frontend/render_v2/rs/src/main.rs | 5 +++++ frontend/src/app/render_v2/rs.cljs | 20 +++++++++++--------- frontend/src/app/render_v2/rs.js | 3 ++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/frontend/render_v2/rs/src/main.rs b/frontend/render_v2/rs/src/main.rs index 03c0c3ce4..780de2d77 100644 --- a/frontend/render_v2/rs/src/main.rs +++ b/frontend/render_v2/rs/src/main.rs @@ -125,6 +125,11 @@ pub unsafe extern "C" fn draw_rect( let color = Color::from_rgb(r, g, b); render_rect(&mut state.surface, rect, color); +} + +#[no_mangle] +pub unsafe extern "C" fn flush(state: *mut State) { + let state = unsafe { state.as_mut() }.expect("got an invalid state pointer"); state .gpu_state .context diff --git a/frontend/src/app/render_v2/rs.cljs b/frontend/src/app/render_v2/rs.cljs index bfa20d6dd..372b26297 100644 --- a/frontend/src/app/render_v2/rs.cljs +++ b/frontend/src/app/render_v2/rs.cljs @@ -22,17 +22,19 @@ translate (gobj/get ^js internal-module "_translate") reset-canvas (gobj/get ^js internal-module "_reset_canvas") scale (gobj/get ^js internal-module "_scale") + flush (gobj/get ^js internal-module "_flush") supported-shapes (filter (fn [shape] (not= (:type shape) :frame)) (vals objects))] - (js/requestAnimationFrame (fn []) - (reset-canvas gpu-state) - (scale gpu-state zoom zoom) - (translate gpu-state (- (:x vbox)) (- (:y vbox))) - (doseq [shape supported-shapes] - (let [sr (:selrect shape) - [r g b] (cc/hex->rgb (-> shape :fills first :fill-color))] - ;; (js/console.log (clj->js shape)) - (draw-rect gpu-state (:x1 sr) (:y1 sr) (:x2 sr) (:y2 sr) r g b)))))) + (js/requestAnimationFrame (fn [] + (reset-canvas gpu-state) + (scale gpu-state zoom zoom) + (translate gpu-state (- (:x vbox)) (- (:y vbox))) + (doseq [shape supported-shapes] + (let [sr (:selrect shape) + [r g b] (cc/hex->rgb (-> shape :fills first :fill-color))] + ;; (js/console.log (clj->js shape)) + (draw-rect gpu-state (:x1 sr) (:y1 sr) (:x2 sr) (:y2 sr) r g b))) + (flush gpu-state))))) (defn set-canvas [canvas vbox zoom objects] diff --git a/frontend/src/app/render_v2/rs.js b/frontend/src/app/render_v2/rs.js index 019d22e53..83ebc638e 100644 --- a/frontend/src/app/render_v2/rs.js +++ b/frontend/src/app/render_v2/rs.js @@ -28,7 +28,7 @@ var readyPromise = new Promise((resolve, reject) => { readyPromiseResolve = resolve; readyPromiseReject = reject; }); -["_draw_rect","_init","_main","_reset_canvas","_resize_surface","_scale","_translate","getExceptionMessage","incrementExceptionRefcount","decrementExceptionRefcount","_memory","___indirect_function_table","onRuntimeInitialized"].forEach((prop) => { +["_draw_rect","_flush","_init","_main","_reset_canvas","_resize_surface","_scale","_translate","getExceptionMessage","incrementExceptionRefcount","decrementExceptionRefcount","_memory","___indirect_function_table","onRuntimeInitialized"].forEach((prop) => { if (!Object.getOwnPropertyDescriptor(readyPromise, prop)) { Object.defineProperty(readyPromise, prop, { get: () => abort('You are getting ' + prop + ' on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js'), @@ -8564,6 +8564,7 @@ var ___wasm_call_ctors = createExportWrapper('__wasm_call_ctors', 0); var _init = Module['_init'] = createExportWrapper('init', 2); var _resize_surface = Module['_resize_surface'] = createExportWrapper('resize_surface', 3); var _draw_rect = Module['_draw_rect'] = createExportWrapper('draw_rect', 8); +var _flush = Module['_flush'] = createExportWrapper('flush', 1); var _translate = Module['_translate'] = createExportWrapper('translate', 3); var _scale = Module['_scale'] = createExportWrapper('scale', 3); var _reset_canvas = Module['_reset_canvas'] = createExportWrapper('reset_canvas', 1);