Remove several not necessary allocations from set-grid-layout-cells

This commit is contained in:
Andrey Antukh 2025-08-12 11:57:15 +02:00
parent 4237ef572e
commit 33d6f543a1
3 changed files with 67 additions and 35 deletions

View File

@ -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)

View File

@ -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")))

View File

@ -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))