From 5c4a60aee745d939863341d9efe413985ec848d0 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 12 Aug 2025 16:55:39 +0200 Subject: [PATCH] :sparkles: Make mem write helpers receive offset as first arg --- frontend/src/app/render_wasm/api.cljs | 83 ++++++++++++++------------- frontend/src/app/render_wasm/mem.cljs | 65 +++++++++++++++------ 2 files changed, 93 insertions(+), 55 deletions(-) diff --git a/frontend/src/app/render_wasm/api.cljs b/frontend/src/app/render_wasm/api.cljs index 4410ad5492..5ad7ee81af 100644 --- a/frontend/src/app/render_wasm/api.cljs +++ b/frontend/src/app/render_wasm/api.cljs @@ -469,9 +469,11 @@ ;; alligned writes, so for heteregeneus writes we use ;; the buffer abstraction (DataView) for perform ;; surgical writes. - (mem/write-u8 dview (+ offset 0) (sr/translate-grid-track-type type)) - (mem/write-f32 dview (+ offset 1) value) - (+ offset GRID-LAYOUT-ROW-U8-SIZE)) + (-> offset + (mem/write-u8 dview (sr/translate-grid-track-type type)) + (mem/write-f32 dview value) + (mem/assert-written offset GRID-LAYOUT-ROW-U8-SIZE))) + offset entries) @@ -489,9 +491,12 @@ ;; alligned writes, so for heteregeneus writes we use ;; the buffer abstraction (DataView) for perform ;; surgical writes. - (mem/write-u8 dview (+ offset 0) (sr/translate-grid-track-type type)) - (mem/write-f32 dview (+ offset 1) value) - (+ offset GRID-LAYOUT-COLUMN-U8-SIZE)) + (-> offset + (mem/write-u8 dview (sr/translate-grid-track-type type)) + (mem/write-f32 dview value) + (mem/assert-written offset GRID-LAYOUT-COLUMN-U8-SIZE))) + + offset entries) @@ -504,42 +509,42 @@ dview (mem/get-data-view)] (reduce-kv (fn [offset _ cell] - ;; row: [u8; 4], - (mem/write-i32 dview (+ offset 0) (get cell :row)) - - ;; row_span: [u8; 4], - (mem/write-i32 dview (+ offset 4) (get cell :row-span)) - - ;; column: [u8; 4], - (mem/write-i32 dview (+ offset 8) (get cell :column)) - - ;; column_span: [u8; 4], - (mem/write-i32 dview (+ offset 12) (get cell :column-span)) - - ;; has_align_self: u8, - (mem/write-bool dview (+ offset 16) (some? (get cell :align-self))) - - ;; align_self: u8, - (mem/write-u8 dview (+ offset 17) (get cell :align-self)) - - ;; has_justify_self: u8, - (mem/write-bool dview (+ offset 18) (get cell :justify-self)) - - ;; justify_self: u8, - (mem/write-u8 dview (+ offset 19) (sr/translate-justify-self (get cell :justify-self))) - (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)) + (-> offset + ;; row: [u8; 4], + (mem/write-i32 dview (get cell :row)) - ;; 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))) + ;; row_span: [u8; 4], + (mem/write-i32 dview (get cell :row-span)) - (+ offset GRID-LAYOUT-CELL-U8-SIZE)) + ;; column: [u8; 4], + (mem/write-i32 dview (get cell :column)) + + ;; column_span: [u8; 4], + (mem/write-i32 dview (get cell :column-span)) + + ;; has_align_self: u8, + (mem/write-bool dview (some? (get cell :align-self))) + + ;; align_self: u8, + (mem/write-u8 dview (get cell :align-self)) + + ;; has_justify_self: u8, + (mem/write-bool dview (get cell :justify-self)) + + ;; justify_self: u8, + (mem/write-u8 dview (sr/translate-justify-self (get cell :justify-self))) + + ;; has_shape_id: u8, + ;; (.set heap (sr/bool->u8 (d/not-empty? (:shapes cell))) (+ current-offset 20)) + (mem/write-u8 dview (some? shape-id)) + + ;; shape_id_a: [u8; 4], + ;; shape_id_b: [u8; 4], + ;; shape_id_c: [u8; 4], + ;; shape_id_d: [u8; 4], + (mem/write-uuid dview (d/nilv shape-id uuid/zero)) + (mem/assert-written offset GRID-LAYOUT-CELL-U8-SIZE)))) offset cells) diff --git a/frontend/src/app/render_wasm/mem.cljs b/frontend/src/app/render_wasm/mem.cljs index 99a728f9ce..affccbc16c 100644 --- a/frontend/src/app/render_wasm/mem.cljs +++ b/frontend/src/app/render_wasm/mem.cljs @@ -67,12 +67,6 @@ [heap offset size] (.slice ^js heap offset (+ offset size))) -(defn view - "Returns a new typed array on the same ArrayBuffer store and with the - same element types as for this typed array." - [heap offset size] - (.subarray ^js heap offset (+ offset size))) - (defn get-data-view "Returns a heap wrapped in a DataView for surgical write operations" [] @@ -80,25 +74,64 @@ (defn write-u8 "Write unsigned int8. Expects a DataView instance" - [target offset value] - (buf/write-u8 target offset value)) + [offset target value] + (buf/write-u8 target offset value) + (+ offset 1)) (defn write-f32 "Write float32. Expects a DataView instance" - [target offset value] - (buf/write-f32 target offset value)) + [offset target value] + (buf/write-f32 target offset value) + (+ offset 4)) (defn write-i32 "Write int32. Expects a DataView instance" - [target offset value] - (buf/write-i32 target offset value)) + [offset target value] + (buf/write-i32 target offset value) + (+ offset 4)) + +(defn write-u32 + "Write int32. Expects a DataView instance" + [offset target value] + (buf/write-i32 target offset value) + (+ offset 4)) (defn write-bool "Write int32. Expects a DataView instance" - [target offset value] - (buf/write-bool target offset value)) + [offset target value] + (buf/write-bool target offset value) + (+ offset 1)) (defn write-uuid "Write uuid. Expects a DataView instance" - [target offset value] - (buf/write-uuid target offset value)) + [offset target value] + (buf/write-uuid target offset value) + (+ offset 16)) + +(defn write-buffer + [offset target value] + (assert (instance? js/Uint8Array target) "target should be u8 addressable heap") + + (let [value (cond + (instance? js/ArrayBuffer value) + (new js/Uint8Array. value) + + (instance? js/Uint8Array value) + value + + :else + (throw (js/Error. "unexpected type")))] + (.set ^js target value offset) + (+ offset (.-byteLength value)))) + +(defn assert-written + [final-offset prev-offset expected] + (assert (= expected (- final-offset prev-offset)) + (str "expected to be written " expected " but finally writted " (- final-offset prev-offset))) + final-offset) + +(defn size + "Get buffer size" + [o] + (.-byteLength ^js o)) +