From 33d6f543a1aafee84e02b1bf854057db5f8b3c40 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 12 Aug 2025 11:57:15 +0200 Subject: [PATCH] :zap: Remove several not necessary allocations from set-grid-layout-cells --- common/src/app/common/buffer.cljc | 20 ++++++++- frontend/src/app/render_wasm/api.cljs | 63 +++++++++++++-------------- frontend/src/app/render_wasm/mem.cljs | 19 +++++++- 3 files changed, 67 insertions(+), 35 deletions(-) diff --git a/common/src/app/common/buffer.cljc b/common/src/app/common/buffer.cljc index 55ec4f83c8..e72ea35abb 100644 --- a/common/src/app/common/buffer.cljc +++ b/common/src/app/common/buffer.cljc @@ -5,7 +5,8 @@ ;; Copyright (c) KALEIDOS INC (ns app.common.buffer - "A collection of helpers and macros for work with byte buffers" + "A collection of helpers and macros for work with byte + buffer (ByteBuffer on JVM and DataView on JS)." (:refer-clojure :exclude [clone]) (:require [app.common.uuid :as uuid]) @@ -81,6 +82,13 @@ (let [target (with-meta target {:tag 'java.nio.ByteBuffer})] `(.put ~target ~offset (unchecked-byte ~value))))) +(defmacro write-u8 + [target offset value] + (if (:ns &env) + `(.setUint8 ~target ~offset ~value true) + (let [target (with-meta target {:tag 'java.nio.ByteBuffer})] + `(.put ~target ~offset (unchecked-byte ~value))))) + (defmacro write-bool [target offset value] (if (:ns &env) @@ -102,6 +110,11 @@ (let [target (with-meta target {:tag 'java.nio.ByteBuffer})] `(.putInt ~target ~offset (unchecked-int ~value))))) +(defmacro write-i32 + "Idiomatic alias for `write-int`" + [target offset value] + `(write-int ~target ~offset ~value)) + (defmacro write-float [target offset value] (if (:ns &env) @@ -109,6 +122,11 @@ (let [target (with-meta target {:tag 'java.nio.ByteBuffer})] `(.putFloat ~target ~offset (unchecked-float ~value))))) +(defmacro write-f32 + "Idiomatic alias for `write-float`." + [target offset value] + `(write-float ~target ~offset ~value)) + (defmacro write-uuid [target offset value] (if (:ns &env) diff --git a/frontend/src/app/render_wasm/api.cljs b/frontend/src/app/render_wasm/api.cljs index 93b3feb9e5..db1f2b76d8 100644 --- a/frontend/src/app/render_wasm/api.cljs +++ b/frontend/src/app/render_wasm/api.cljs @@ -496,51 +496,50 @@ (defn set-grid-layout-cells [cells] - (let [entries (vals cells) - size (mem/get-alloc-size cells GRID-LAYOUT-CELL-U8-SIZE) + (let [size (mem/get-alloc-size cells GRID-LAYOUT-CELL-U8-SIZE) offset (mem/alloc size) - heap (-> (mem/get-heap-u8) - (mem/view offset size))] + dview (mem/get-data-view)] - (loop [entries (seq entries) - current-offset 0] - (when-not (empty? entries) - (let [cell (first entries)] + (reduce-kv (fn [offset _ cell] + ;; row: [u8; 4], + (mem/write-i32 dview (+ offset 0) (get cell :row)) - ;; row: [u8; 4], - (.set heap (sr/i32->u8 (:row cell)) (+ current-offset 0)) + ;; row_span: [u8; 4], + (mem/write-i32 dview (+ offset 4) (get cell :row-span)) - ;; row_span: [u8; 4], - (.set heap (sr/i32->u8 (:row-span cell)) (+ current-offset 4)) + ;; column: [u8; 4], + (mem/write-i32 dview (+ offset 8) (get cell :column)) - ;; column: [u8; 4], - (.set heap (sr/i32->u8 (:column cell)) (+ current-offset 8)) + ;; column_span: [u8; 4], + (mem/write-i32 dview (+ offset 12) (get cell :column-span)) - ;; column_span: [u8; 4], - (.set heap (sr/i32->u8 (:column-span cell)) (+ current-offset 12)) + ;; has_align_self: u8, + (mem/write-bool dview (+ offset 16) (some? (get cell :align-self))) - ;; has_align_self: u8, - (.set heap (sr/bool->u8 (some? (:align-self cell))) (+ current-offset 16)) + ;; align_self: u8, + (mem/write-u8 dview (+ offset 17) (get cell :align-self)) - ;; align_self: u8, - (.set heap (sr/u8 (sr/translate-align-self (:align-self cell))) (+ current-offset 17)) + ;; has_justify_self: u8, + (mem/write-bool dview (+ offset 18) (get cell :justify-self)) - ;; has_justify_self: u8, - (.set heap (sr/bool->u8 (some? (:justify-self cell))) (+ current-offset 18)) + ;; justify_self: u8, + (mem/write-u8 dview (+ offset 19) (sr/translate-justify-self (get cell :justify-self))) - ;; justify_self: u8, - (.set heap (sr/u8 (sr/translate-justify-self (:justify-self cell))) (+ current-offset 19)) + (let [shape-id (-> (get cell :shapes) first)] + ;; has_shape_id: u8, + ;; (.set heap (sr/bool->u8 (d/not-empty? (:shapes cell))) (+ current-offset 20)) + (mem/write-u8 dview (+ offset 20) (some? shape-id)) - ;; has_shape_id: u8, - (.set heap (sr/bool->u8 (d/not-empty? (:shapes cell))) (+ current-offset 20)) + ;; shape_id_a: [u8; 4], + ;; shape_id_b: [u8; 4], + ;; shape_id_c: [u8; 4], + ;; shape_id_d: [u8; 4], + (mem/write-uuid dview (+ offset 21) (d/nilv shape-id uuid/zero))) - ;; shape_id_a: [u8; 4], - ;; shape_id_b: [u8; 4], - ;; shape_id_c: [u8; 4], - ;; shape_id_d: [u8; 4], - (.set heap (sr/uuid->u8 (or (-> cell :shapes first) uuid/zero)) (+ current-offset 21)) + (+ offset GRID-LAYOUT-CELL-U8-SIZE)) - (recur (rest entries) (+ current-offset GRID-LAYOUT-CELL-U8-SIZE))))) + offset + cells) (h/call wasm/internal-module "_set_grid_cells"))) diff --git a/frontend/src/app/render_wasm/mem.cljs b/frontend/src/app/render_wasm/mem.cljs index 59562329c8..99a728f9ce 100644 --- a/frontend/src/app/render_wasm/mem.cljs +++ b/frontend/src/app/render_wasm/mem.cljs @@ -81,9 +81,24 @@ (defn write-u8 "Write unsigned int8. Expects a DataView instance" [target offset value] - (buf/write-byte target offset value)) + (buf/write-u8 target offset value)) (defn write-f32 "Write float32. Expects a DataView instance" [target offset value] - (buf/write-float target offset value)) + (buf/write-f32 target offset value)) + +(defn write-i32 + "Write int32. Expects a DataView instance" + [target offset value] + (buf/write-i32 target offset value)) + +(defn write-bool + "Write int32. Expects a DataView instance" + [target offset value] + (buf/write-bool target offset value)) + +(defn write-uuid + "Write uuid. Expects a DataView instance" + [target offset value] + (buf/write-uuid target offset value))