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 ;; Copyright (c) KALEIDOS INC
(ns app.common.buffer (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]) (:refer-clojure :exclude [clone])
(:require (:require
[app.common.uuid :as uuid]) [app.common.uuid :as uuid])
@ -81,6 +82,13 @@
(let [target (with-meta target {:tag 'java.nio.ByteBuffer})] (let [target (with-meta target {:tag 'java.nio.ByteBuffer})]
`(.put ~target ~offset (unchecked-byte ~value))))) `(.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 (defmacro write-bool
[target offset value] [target offset value]
(if (:ns &env) (if (:ns &env)
@ -102,6 +110,11 @@
(let [target (with-meta target {:tag 'java.nio.ByteBuffer})] (let [target (with-meta target {:tag 'java.nio.ByteBuffer})]
`(.putInt ~target ~offset (unchecked-int ~value))))) `(.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 (defmacro write-float
[target offset value] [target offset value]
(if (:ns &env) (if (:ns &env)
@ -109,6 +122,11 @@
(let [target (with-meta target {:tag 'java.nio.ByteBuffer})] (let [target (with-meta target {:tag 'java.nio.ByteBuffer})]
`(.putFloat ~target ~offset (unchecked-float ~value))))) `(.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 (defmacro write-uuid
[target offset value] [target offset value]
(if (:ns &env) (if (:ns &env)

View File

@ -496,51 +496,50 @@
(defn set-grid-layout-cells (defn set-grid-layout-cells
[cells] [cells]
(let [entries (vals cells) (let [size (mem/get-alloc-size cells GRID-LAYOUT-CELL-U8-SIZE)
size (mem/get-alloc-size cells GRID-LAYOUT-CELL-U8-SIZE)
offset (mem/alloc size) offset (mem/alloc size)
heap (-> (mem/get-heap-u8) dview (mem/get-data-view)]
(mem/view offset size))]
(loop [entries (seq entries) (reduce-kv (fn [offset _ cell]
current-offset 0] ;; row: [u8; 4],
(when-not (empty? entries) (mem/write-i32 dview (+ offset 0) (get cell :row))
(let [cell (first entries)]
;; row: [u8; 4], ;; row_span: [u8; 4],
(.set heap (sr/i32->u8 (:row cell)) (+ current-offset 0)) (mem/write-i32 dview (+ offset 4) (get cell :row-span))
;; row_span: [u8; 4], ;; column: [u8; 4],
(.set heap (sr/i32->u8 (:row-span cell)) (+ current-offset 4)) (mem/write-i32 dview (+ offset 8) (get cell :column))
;; column: [u8; 4], ;; column_span: [u8; 4],
(.set heap (sr/i32->u8 (:column cell)) (+ current-offset 8)) (mem/write-i32 dview (+ offset 12) (get cell :column-span))
;; column_span: [u8; 4], ;; has_align_self: u8,
(.set heap (sr/i32->u8 (:column-span cell)) (+ current-offset 12)) (mem/write-bool dview (+ offset 16) (some? (get cell :align-self)))
;; has_align_self: u8, ;; align_self: u8,
(.set heap (sr/bool->u8 (some? (:align-self cell))) (+ current-offset 16)) (mem/write-u8 dview (+ offset 17) (get cell :align-self))
;; align_self: u8, ;; has_justify_self: u8,
(.set heap (sr/u8 (sr/translate-align-self (:align-self cell))) (+ current-offset 17)) (mem/write-bool dview (+ offset 18) (get cell :justify-self))
;; has_justify_self: u8, ;; justify_self: u8,
(.set heap (sr/bool->u8 (some? (:justify-self cell))) (+ current-offset 18)) (mem/write-u8 dview (+ offset 19) (sr/translate-justify-self (get cell :justify-self)))
;; justify_self: u8, (let [shape-id (-> (get cell :shapes) first)]
(.set heap (sr/u8 (sr/translate-justify-self (:justify-self cell))) (+ current-offset 19)) ;; 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, ;; shape_id_a: [u8; 4],
(.set heap (sr/bool->u8 (d/not-empty? (:shapes cell))) (+ current-offset 20)) ;; 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], (+ offset GRID-LAYOUT-CELL-U8-SIZE))
;; 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))
(recur (rest entries) (+ current-offset GRID-LAYOUT-CELL-U8-SIZE))))) offset
cells)
(h/call wasm/internal-module "_set_grid_cells"))) (h/call wasm/internal-module "_set_grid_cells")))

View File

@ -81,9 +81,24 @@
(defn write-u8 (defn write-u8
"Write unsigned int8. Expects a DataView instance" "Write unsigned int8. Expects a DataView instance"
[target offset value] [target offset value]
(buf/write-byte target offset value)) (buf/write-u8 target offset value))
(defn write-f32 (defn write-f32
"Write float32. Expects a DataView instance" "Write float32. Expects a DataView instance"
[target offset value] [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))