Add facilities for work with dataview with common alases

This commit is contained in:
Andrey Antukh 2025-08-12 11:27:13 +02:00
parent f9d757bb85
commit e69d61eaf4
4 changed files with 35 additions and 24 deletions

View File

@ -129,15 +129,9 @@
(defn wrap
[data]
#?(:clj (let [buffer (ByteBuffer/wrap ^bytes data)]
(.order buffer ByteOrder/LITTLE_ENDIAN))
:cljs
(cond
(instance? js/Uint8Array data)
(new js/DataView (.-buffer ^js data))
:else
(throw (js/Error. "unexpected type")))))
#?(:clj (let [buffer (ByteBuffer/wrap ^bytes data)]
(.order buffer ByteOrder/LITTLE_ENDIAN))
:cljs (new js/DataView (.-buffer ^js data))))
(defn allocate
[size]

View File

@ -8,7 +8,6 @@
"A WASM based render API"
(:require
["react-dom/server" :as rds]
[app.common.buffer :as buf]
[app.common.data :as d :refer [not-empty?]]
[app.common.data.macros :as dm]
[app.common.types.fills :as types.fills]
@ -455,8 +454,7 @@
[entries]
(let [size (mem/get-alloc-size entries GRID-LAYOUT-ROW-U8-SIZE)
offset (mem/alloc size)
heapu8 (mem/get-heap-u8)
buffer (buf/wrap heapu8)]
dview (mem/get-data-view)]
(reduce (fn [offset {:keys [type value]}]
;; NOTE: because of the nature of the grid row data
@ -464,8 +462,8 @@
;; alligned writes, so for heteregeneus writes we use
;; the buffer abstraction (DataView) for perform
;; surgical writes.
(buf/write-byte buffer (+ offset 0) (sr/translate-grid-track-type type))
(buf/write-float buffer (+ offset 1) value)
(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
entries)
@ -476,16 +474,20 @@
[entries]
(let [size (mem/get-alloc-size entries GRID-LAYOUT-COLUMN-U8-SIZE)
offset (mem/alloc size)
heap (-> (mem/get-heap-u8)
(mem/view offset size))]
dview (mem/get-data-view)]
(reduce (fn [offset {:keys [type value]}]
;; NOTE: because of the nature of the grid column data
;; structure memory layout we can't use fully 32 bits
;; 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
entries)
(loop [entries (seq entries)
current-offset 0]
(when-not (empty? entries)
(let [{:keys [type value]} (first entries)]
(.set heap (sr/u8 (sr/translate-grid-track-type type)) (+ current-offset 0))
(.set heap (sr/f32->u8 value) (+ current-offset 1))
(recur (rest entries) (+ current-offset GRID-LAYOUT-COLUMN-U8-SIZE)))))
(h/call wasm/internal-module "_set_grid_columns")))
(defn set-grid-layout-cells

View File

@ -6,6 +6,7 @@
(ns app.render-wasm.mem
(:require
[app.common.buffer :as buf]
[app.render-wasm.helpers :as h]
[app.render-wasm.wasm :as wasm]))
@ -71,3 +72,18 @@
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"
[]
(buf/wrap (get-heap-u8)))
(defn write-u8
"Write unsigned int8. Expects a DataView instance"
[target offset value]
(buf/write-byte target offset value))
(defn write-f32
"Write float32. Expects a DataView instance"
[target offset value]
(buf/write-float target offset value))

View File

@ -6,7 +6,6 @@
(ns app.render-wasm.serializers
(:require
[app.common.data.macros :as dm]
[app.common.uuid :as uuid]
[cuerdas.core :as str]))