luv

Workshop wiki

examples.lisp

hal/examples.lisp

system luv · 20 definitions · on GitHub

Small live demos built out of the public canvas protocol.

in-package#:luv
defclassclear-color-demo
canvas:initarg:canvas:readerdemo-canvas
device:initarg:device:readerdemo-device
context:initarg:context:readerdemo-context
speed:initarg:speed:readerdemo-speed
start-time:initformnil:accessordemo-start-time
:documentation

A running cadence-clock color-cycle demonstration.

defunclear-color-component
phaseoffset
*0.5
+1.0
sin
+phaseoffset
defunrender-clear-color-demo-frame
demotimestamp
unless
demo-start-timedemo
setf
demo-start-timedemo
timestamp
let*
tau
*2pi
phase
*tau
demo-speeddemo
-timestamp
demo-start-timedemo
defunstart-clear-color-demo
&key
title"luv clear color demo"
frames-per-second60
speed0.08

Open and return a smoothly cycling clear-color-demo.

speed is the number of complete color cycles per second. Stop the returned object with stop-clear-color-demo.

let
canvas
make-sdl-canvas:titletitle:widthwidth:heightheight
devicenil
handler-case
progn
setfdevice
request-gpu-device*gpu-provider*
make-device-descriptor:labeltitle
let*
context
make-canvas-contextcanvas*gpu-provider*
make-canvas-configuration:devicedevice
demo
make-instance'clear-color-demo:canvascanvas:devicedevice:contextcontext:speedspeed
setf
make-cadence-clock
lambda
native-canvastimestamp
declare
ignorenative-canvas
:frames-per-secondframes-per-second
demo
error
condition
whendevice
destroydevice
errorcondition
defunstop-clear-color-demo
demo

Stop demo, close its canvas, and return no values.

values
defclasscompute-gradient-demo
canvas:initarg:canvas:readerdemo-canvas
device:initarg:device:readerdemo-device
context:initarg:context:readerdemo-context
texture:initarg:texture:readercompute-demo-texture
view:initarg:view:readercompute-demo-view
module:initarg:module:readercompute-demo-module
layout:initarg:layout:readercompute-demo-layout
pipeline:initarg:pipeline:readercompute-demo-pipeline
bind-group:initarg:bind-group:readercompute-demo-bind-group
:documentation

A compute shader writing an intermediate texture copied to a canvas.

defunrender-compute-gradient-demo
demo
let*
context
demo-contextdemo
present-canvas-framecontext
lambda
surface-textureencoderpresentation-time
declare
ignorepresentation-time
let
encodepass
make-gpu-set-pipeline-command:pipeline
compute-demo-pipelinedemo
encodepass
make-gpu-set-bind-group-command:index0:bind-group
compute-demo-bind-groupdemo
encodepass
make-gpu-dispatch-workgroups-command:x
ceiling
firstextent
8
:y
ceiling
secondextent
8
encodeencoder
make-gpu-copy-texture-command:source
compute-demo-texturedemo
:destinationsurface-texture
defunstart-compute-gradient-demo
&key
title"luv s-expression compute shader"

Open a canvas filled by an s-expression SPIR-V compute shader.

let
canvas
make-sdl-canvas:titletitle:widthwidth:heightheight
devicenil
resourcesnil
completed-pnil
unwind-protect
progn
setfdevice
request-gpu-device*gpu-provider*
make-device-descriptor:labeltitle
context
make-canvas-contextcanvas*gpu-provider*
make-canvas-configuration:devicedevice
let*
texture
createdevice
make-texture-descriptor:label"compute gradient":sizeextent:dimensions:2d:format:rgba8-unorm:usage'
:storage-binding:copy-src
view
createdevice
make-texture-view-descriptor:texturetexture
module
createdevice
make-shader-module-descriptor:code
spv:gradient-compute-shader:width
firstextent
:height
secondextent
layout
createdevice
make-bind-group-layout-descriptor:entries'
:binding0:type:storage-texture
pipeline
createdevice
make-compute-pipeline-descriptor:layoutlayout:modulemodule
bind-group
createdevice
make-bind-group-descriptor:layoutlayout:entries`
:binding0:resource,view
demo
make-instance'compute-gradient-demo:canvascanvas:devicedevice:contextcontext:texturetexture:viewview:modulemodule:layoutlayout:pipelinepipeline:bind-groupbind-group
setfresources
listbind-grouppipelinelayoutmoduleviewtexture
setfcompleted-pt
demo
unlesscompleted-p
dolist
resourceresources
ignore-errors
destroyresource
whendevice
destroydevice
defunstop-compute-gradient-demo
demo

Destroy demo's compute resources and close its canvas.

dolist
resource
list
compute-demo-bind-groupdemo
compute-demo-pipelinedemo
compute-demo-layoutdemo
compute-demo-moduledemo
compute-demo-viewdemo
compute-demo-texturedemo
destroyresource
close-canvas
demo-canvasdemo
destroy
demo-devicedemo
values
defunrender-metal-slug-bezier-proof
provider

Render the fixed Slug outline on Metal and return pixels, width, height, format.

The shader specifications remain backend-neutral and independently lower to SPIR-V. This live proof uses Metal because the current no-resource pipeline seam is available there without inventing an empty bind-group abstraction.

let
devicenil
vertex-modulenil
fragment-modulenil
pipelinenil
targetnil
verticesnil
readbacknil
encodernil
command-buffernil
format:rgba8-unorm
unwind-protect
progn
setfdevicevertex-module
createdevice
make-shader-module-descriptor:label"Slug proof vertex":language:mathematical:code
fragment-module
createdevice
make-shader-module-descriptor:label"Slug proof fragment":language:mathematical:code
pipeline
createdevice
make-render-pipeline-descriptor:label"Slug quadratic outline proof":layoutnil:vertex`
:module,vertex-module:buffers
:array-stride36:attributes
:shader-location0:offset0:format:float32x3
:shader-location1:offset12:format:float32x3
:shader-location2:offset24:format:float32x3
:fragment`
:module,fragment-module:targets
:format,format
target
createdevice
make-texture-descriptor:label"Slug proof target":size:dimensions:2d:formatformat:usage'
:render-attachment:copy-src
vertices
createdevice
make-buffer-descriptor:label"Slug proof quad":size
*544
:usage'
:vertex:copy-dst
readback
createdevice
make-buffer-descriptor:label"Slug proof readback":size:usage'
:copy-dst
write-buffervertices
make-array54:element-type'single-float:initial-contents'
-0.8-0.80.00.01.00.0204.8204.80.00.8-0.80.01.01.00.0204.8204.80.00.80.80.01.00.00.0204.8204.80.0-0.8-0.80.00.01.00.0204.8204.80.00.80.80.01.00.00.0204.8204.80.0-0.80.80.00.00.00.0204.8204.80.0
setfencoder
createdevice
make-command-encoder-descriptor:label"Slug proof commands"
let
pass
begin-render-passencoder
make-render-pass-descriptor:color-attachments`
:view,target:load-op:clear:store-op:store:clear-value
0.00.00.01.0
set-pipelinepasspipeline
set-vertex-bufferpass0vertices
drawpass6
encodeencoder
make-gpu-copy-texture-to-buffer-command:sourcetarget:destinationreadback
setfcommand-buffer
finishencoder
submitcommand-buffer
values
read-bufferreadback
widthheightformat
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
whenreadback
destroyreadback
whenvertices
destroyvertices
whentarget
destroytarget
whenpipeline
destroypipeline
whenfragment-module
destroyfragment-module
whenvertex-module
destroyvertex-module
whendevice
destroydevice
defunappend-analytic-roundrect-quad
datacenterx-axisy-axishalf-sizeradiuscolor&key
alpha1.0
padding0.08

Append one padded analytic-roundrect quad to interleaved proof data.

let*
half-width
firsthalf-size
half-height
secondhalf-size
extent-x
+half-widthpadding
extent-y
+half-heightpadding
corners
list
list
-extent-x
-extent-y
listextent-x
-extent-y
listextent-xextent-y
list
-extent-x
-extent-y
listextent-xextent-y
list
-extent-x
extent-y
dolist
cornercorners
destructuring-bind
local-xlocal-y
corner
let
clip-x
+
firstcenter
*local-x
firstx-axis
*local-y
firsty-axis
clip-y
+
secondcenter
*local-x
secondx-axis
*local-y
secondy-axis
dolist
value
listclip-xclip-yalphalocal-xlocal-y0.0half-widthhalf-heightradius
firstcolor
secondcolor
thirdcolor
vector-push-extend
coercevalue'single-float
data
data
defunrender-metal-analytic-roundrect-proof
provider

Render one parameterized analytic roundrect family on Metal.

The four instances are a roundrect, capsule, circle, and affinely transformed ellipse. They share one resource-free mathematical pipeline and differ only in dense vertex parameters.

let
devicenil
vertex-modulenil
fragment-modulenil
pipelinenil
targetnil
vertex-buffernil
readbacknil
encodernil
command-buffernil
format:rgba8-unorm
data
make-array0:element-type'single-float:adjustablet:fill-pointer0
append-analytic-roundrect-quaddata'
-0.360.43
'
0.340.0
'
0.00.34
'
1.00.48
0.24'
0.960.320.48
append-analytic-roundrect-quaddata'
0.420.43
'
0.340.0
'
0.00.34
'
0.850.28
0.28'
1.00.630.18
append-analytic-roundrect-quaddata'
-0.38-0.32
'
0.180.0
'
0.00.18
'
1.01.0
1.0'
0.280.820.56
append-analytic-roundrect-quaddata'
0.36-0.32
'
0.280.10
'
-0.070.18
'
1.01.0
1.0'
0.430.581.0
unwind-protect
progn
setfdevicevertex-module
createdevice
make-shader-module-descriptor:label"analytic roundrect proof vertex":language:mathematical:code
fragment-module
createdevice
make-shader-module-descriptor:label"analytic roundrect proof fragment":language:mathematical:code
pipeline
createdevice
make-render-pipeline-descriptor:label"analytic roundrect family proof":layoutnil:vertex`
:module,vertex-module:buffers
:array-stride48:attributes
:shader-location0:offset0:format:float32x3
:shader-location1:offset12:format:float32x3
:shader-location2:offset24:format:float32x3
:shader-location3:offset36:format:float32x3
:fragment`
:module,fragment-module:targets
:format,format:blend:premultiplied-alpha
target
createdevice
make-texture-descriptor:label"analytic roundrect proof target":size:dimensions:2d:formatformat:usage'
:render-attachment:copy-src
vertex-buffer
createdevice
make-buffer-descriptor:label"analytic roundrect proof quads":size
*
lengthdata
4
:usage'
:vertex:copy-dst
readback
createdevice
make-buffer-descriptor:label"analytic roundrect proof readback":size:usage'
:copy-dst
write-buffervertex-bufferdata
setfencoder
createdevice
make-command-encoder-descriptor:label"analytic roundrect proof commands"
let
pass
begin-render-passencoder
make-render-pass-descriptor:color-attachments`
:view,target:load-op:clear:store-op:store:clear-value
0.0350.040.0551.0
set-pipelinepasspipeline
set-vertex-bufferpass0vertex-buffer
drawpass
/
lengthdata
12
encodeencoder
make-gpu-copy-texture-to-buffer-command:sourcetarget:destinationreadback
setfcommand-buffer
finishencoder
submitcommand-buffer
values
read-bufferreadback
widthheightformat
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
whenreadback
destroyreadback
whenvertex-buffer
destroyvertex-buffer
whentarget
destroytarget
whenpipeline
destroypipeline
whenfragment-module
destroyfragment-module
whenvertex-module
destroyvertex-module
whendevice
destroydevice
defunrender-metal-slug-outline
provideroutline

Render one em-normalized quadratic outline through Slug's texture path.

The proof window is the unit em square. outline may contain any number of closed contours and curves that fit that window; serialization and both axis traversals are data-driven. Return pixels, width, height, and format.

let
devicenil
vertex-modulenil
fragment-modulenil
pipelinenil
band-texturenil
band-viewnil
curve-texturenil
curve-viewnil
bind-groupnil
targetnil
verticesnil
readbacknil
encodernil
command-buffernil
format:rgba8-unorm
serialized
luv.slug:serialize-slug-outlineoutline:horizontal-band-count1:vertical-band-count1
unwind-protect
progn
setfdevicevertex-module
createdevice
make-shader-module-descriptor:label"Slug outline vertex":language:mathematical:code
fragment-module
createdevice
make-shader-module-descriptor:label"Slug band traversal fragment":language:mathematical:code
layout
createdevice
make-bind-group-layout-descriptor:label"Slug outline texture layout":entries'
:binding0:type:texture
:binding1:type:texture
pipeline
createdevice
make-render-pipeline-descriptor:label"Slug serialized outline pipeline":layoutlayout:vertex`
:module,vertex-module:buffers
:array-stride36:attributes
:shader-location0:offset0:format:float32x3
:shader-location1:offset12:format:float32x3
:shader-location2:offset24:format:float32x3
:fragment`
:module,fragment-module:targets
:format,format
band-texture
createdevice
make-texture-descriptor:label"Slug RG16U bands":size:dimensions:2d:format:rg16-uint:usage'
:texture-binding:copy-dst
curve-texture
createdevice
make-texture-descriptor:label"Slug RGBA16F curves":size:dimensions:2d:format:rgba16-float:usage'
:texture-binding:copy-dst
write-texture
make-texture-copy:textureband-texture
luv.slug:slug-serialized-outline-band-upload-dataserialized
make-texture-data-layout:bytes-per-row
*4
luv.slug:slug-serialized-outline-band-widthserialized
:rows-per-image
write-texture
make-texture-copy:texturecurve-texture
luv.slug:slug-serialized-outline-curve-upload-dataserialized
make-texture-data-layout:bytes-per-row
*8
luv.slug:slug-serialized-outline-curve-widthserialized
:rows-per-image
setfband-view
createdevice
make-texture-view-descriptor:textureband-texture
curve-view
createdevice
make-texture-view-descriptor:texturecurve-texture
bind-group
createdevice
make-bind-group-descriptor:label"Slug outline textures":layoutlayout:entries`
:binding0:resource,band-view
:binding1:resource,curve-view
target
createdevice
make-texture-descriptor:label"Slug outline target":size:dimensions:2d:formatformat:usage'
:render-attachment:copy-src
vertices
createdevice
make-buffer-descriptor:label"Slug em-square quad":size
*544
:usage'
:vertex:copy-dst
readback
createdevice
make-buffer-descriptor:label"Slug outline readback":size:usage'
:copy-dst
write-buffervertices
make-array54:element-type'single-float:initial-contents'
-0.8-0.80.00.00.00.0204.8204.80.00.8-0.80.01.00.00.0204.8204.80.00.80.80.01.01.00.0204.8204.80.0-0.8-0.80.00.00.00.0204.8204.80.00.80.80.01.01.00.0204.8204.80.0-0.80.80.00.01.00.0204.8204.80.0
setfencoder
createdevice
make-command-encoder-descriptor:label"Slug outline commands"
let
pass
begin-render-passencoder
make-render-pass-descriptor:color-attachments`
:view,target:load-op:clear:store-op:store:clear-value
0.00.00.01.0
set-pipelinepasspipeline
set-bind-grouppass0bind-group
set-vertex-bufferpass0vertices
drawpass6
encodeencoder
make-gpu-copy-texture-to-buffer-command:sourcetarget:destinationreadback
setfcommand-buffer
finishencoder
submitcommand-buffer
values
read-bufferreadback
widthheightformat
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
whenreadback
destroyreadback
whenvertices
destroyvertices
whentarget
destroytarget
whenbind-group
destroybind-group
whencurve-view
destroycurve-view
whenband-view
destroyband-view
whencurve-texture
destroycurve-texture
whenband-texture
destroyband-texture
whenpipeline
destroypipeline
whenfragment-module
destroyfragment-module
whenvertex-module
destroyvertex-module
whendevice
destroydevice
defunrender-metal-slug-glyph
providercharacterfont-loader

Render character from font-loader through Slug's GPU outline path.

defstructslug-text-drawglyph-idserializedorigin-xorigin-youtline-min-xoutline-min-youtline-max-xoutline-max-yband-textureband-viewcurve-texturecurve-viewbind-group
defunmake-slug-text-draws
shapedfont-loader

Join HarfBuzz placement records to ZPB-TTF outlines by glyph ID.

let*
units-per-em
luv.slug:slug-shaped-text-units-per-emshaped
unit
/1units-per-em
pen-x0
pen-y0
draws
loopforplacementacross
luv.slug:slug-shaped-text-glyphsshaped
forglyph-id=
luv.slug:slug-shaped-glyph-glyph-idplacement
forglyph=foroutline=do
when
luv.slug:slug-outline-contoursoutline
let*
serialized
luv.slug:serialize-slug-outlineoutline:horizontal-band-count1:vertical-band-count1
packed
luv.slug:slug-serialized-outline-packed-outlineserialized
push
make-slug-text-draw:glyph-idglyph-id:serializedserialized:origin-x
*
+pen-x
luv.slug:slug-shaped-glyph-x-offsetplacement
unit
:origin-y
*
+pen-y
luv.slug:slug-shaped-glyph-y-offsetplacement
unit
:outline-min-x
luv.slug:slug-packed-outline-min-xpacked
:outline-min-y
luv.slug:slug-packed-outline-min-ypacked
:outline-max-x
luv.slug:slug-packed-outline-max-xpacked
:outline-max-y
luv.slug:slug-packed-outline-max-ypacked
draws
incfpen-x
luv.slug:slug-shaped-glyph-x-advanceplacement
incfpen-y
luv.slug:slug-shaped-glyph-y-advanceplacement
nreversedraws
defunslug-text-extents
drawsshapedfont-loader
let*
unit
/1
luv.slug:slug-shaped-text-units-per-emshaped
advance-x
*unit
luv.slug:slug-shaped-text-x-advanceshaped
advance-y
*unit
luv.slug:slug-shaped-text-y-advanceshaped
values
min0.0
loopfordrawindrawsminimize
+
slug-text-draw-origin-xdraw
slug-text-draw-outline-min-xdraw
min0.0
*unit
zpb-ttf:descenderfont-loader
loopfordrawindrawsminimize
+
slug-text-draw-origin-ydraw
slug-text-draw-outline-min-ydraw
maxadvance-x
loopfordrawindrawsmaximize
+
slug-text-draw-origin-xdraw
slug-text-draw-outline-max-xdraw
maxadvance-y
*unit
zpb-ttf:ascenderfont-loader
loopfordrawindrawsmaximize
+
slug-text-draw-origin-ydraw
slug-text-draw-outline-max-ydraw
defunmake-slug-text-vertices
drawswidthheightmin-xmin-ymax-xmax-y
let*
margin24.0
span-x
max1/1024
-max-xmin-x
span-y
max1/1024
-max-ymin-y
pixels-per-em
min180.0
/
-width
*margin2
span-x
/
-height
*margin2
span-y
x-offset
/
-width
*span-xpixels-per-em
2
y-offset
/
-height
*span-ypixels-per-em
2
padding
/1.0pixels-per-em
data
make-array
*54
lengthdraws
:element-type'single-float
labels
clip-x
x
-
*2
/
+x-offset
*
-xmin-x
pixels-per-em
width
1
clip-y
y
-1
*2
/
+y-offset
*
-ymin-y
pixels-per-em
height
write-vertex
offsetclip-xclip-youtline-xoutline-y
let
values
listclip-xclip-y0.0outline-xoutline-y0.0pixels-per-empixels-per-em0.0
loopforvalueinvaluesforindexfromoffsetdo
setf
arefdataindex
coercevalue'single-float
loopfordrawindrawsfordraw-indexfrom0forbase=
*draw-index54
foroutline-left=
-
slug-text-draw-outline-min-xdraw
padding
foroutline-bottom=
-
slug-text-draw-outline-min-ydraw
padding
foroutline-right=
+
slug-text-draw-outline-max-xdraw
padding
foroutline-top=
+
slug-text-draw-outline-max-ydraw
padding
forlayout-left=
+
slug-text-draw-origin-xdraw
outline-left
forlayout-bottom=
+
slug-text-draw-origin-ydraw
outline-bottom
forlayout-right=
+
slug-text-draw-origin-xdraw
outline-right
forlayout-top=
+
slug-text-draw-origin-ydraw
outline-top
forleft=
clip-xlayout-left
forbottom=
clip-ylayout-bottom
forright=
clip-xlayout-right
fortop=
clip-ylayout-top
do
write-vertexbaseleftbottomoutline-leftoutline-bottom
write-vertex
+base9
rightbottomoutline-rightoutline-bottom
write-vertex
+base18
righttopoutline-rightoutline-top
write-vertex
+base27
leftbottomoutline-leftoutline-bottom
write-vertex
+base36
righttopoutline-rightoutline-top
write-vertex
+base45
lefttopoutline-leftoutline-top
data
defuncreate-metal-slug-texture-pair
devicelayoutdrawresources
let
serialized
slug-text-draw-serializeddraw
band-texturenil
curve-texturenil
band-viewnil
curve-viewnil
bind-groupnil
completed-pnil
unwind-protect
progn
setfband-texture
createdevice
make-texture-descriptor:label"Shaped glyph RG16U bands":size:dimensions:2d:format:rg16-uint:usage'
:texture-binding:copy-dst
curve-texture
createdevice
make-texture-descriptor:label"Shaped glyph RGBA16F curves":size:dimensions:2d:format:rgba16-float:usage'
:texture-binding:copy-dst
band-view
createdevice
make-texture-view-descriptor:textureband-texture
curve-view
createdevice
make-texture-view-descriptor:texturecurve-texture
bind-group
createdevice
make-bind-group-descriptor:label"Shaped Slug glyph":layoutlayout:entries`
:binding0:resource,band-view
:binding1:resource,curve-view
write-texture
make-texture-copy:textureband-texture
luv.slug:slug-serialized-outline-band-upload-dataserialized
make-texture-data-layout:bytes-per-row
*4
luv.slug:slug-serialized-outline-band-widthserialized
:rows-per-image
write-texture
make-texture-copy:texturecurve-texture
luv.slug:slug-serialized-outline-curve-upload-dataserialized
make-texture-data-layout:bytes-per-row
*8
luv.slug:slug-serialized-outline-curve-widthserialized
:rows-per-image
setf
slug-text-draw-band-texturedraw
band-texture
slug-text-draw-band-viewdraw
band-view
slug-text-draw-curve-texturedraw
curve-texture
slug-text-draw-curve-viewdraw
curve-view
slug-text-draw-bind-groupdraw
bind-group
completed-pt
append
listbind-groupcurve-viewband-viewcurve-textureband-texture
resources
unlesscompleted-p
dolist
resource
removenil
listbind-groupcurve-viewband-viewcurve-textureband-texture
destroyresource
defunrender-metal-slug-text
providerstringfont-pathname

Shape string with HarfBuzz and render one Slug quad per drawable glyph.

The proof target is 768 by 256 pixels. HarfBuzz owns glyph selection, ligatures, clusters, advances, and offsets; ZPB-TTF supplies outlines by the resulting glyph IDs. Return pixels, width, height, format, and shaped text. #4G7064

let
devicenil
vertex-modulenil
fragment-modulenil
pipelinenil
targetnil
verticesnil
readbacknil
encodernil
command-buffernil
glyph-resourcesnil
format:rgba8-unorm
shaped
luv.slug:shape-slug-textstringfont-pathname
zpb-ttf:with-font-loader
font-loaderfont-pathname
let
draws
make-slug-text-drawsshapedfont-loader
unlessdraws
error'luv.slug:slug-shaping-error:reason:no-drawable-glyphs:detailsstring
multiple-value-bind
min-xmin-ymax-xmax-y
slug-text-extentsdrawsshapedfont-loader
let
vertex-data
make-slug-text-verticesdrawswidthheightmin-xmin-ymax-xmax-y
unwind-protect
progn
setfdevicevertex-module
createdevice
make-shader-module-descriptor:label"Shaped Slug vertex":language:mathematical:code
fragment-module
createdevice
make-shader-module-descriptor:label"Shaped Slug fragment":language:mathematical:code
layout
createdevice
make-bind-group-layout-descriptor:label"Shaped Slug outline textures":entries'
:binding0:type:texture
:binding1:type:texture
pipeline
createdevice
make-render-pipeline-descriptor:label"HarfBuzz shaped Slug text":layoutlayout:vertex`
:module,vertex-module:buffers
:array-stride36:attributes
:shader-location0:offset0:format:float32x3
:shader-location1:offset12:format:float32x3
:shader-location2:offset24:format:float32x3
:fragment`
:module,fragment-module:targets
:format,format:blend:premultiplied-alpha
target
createdevice
make-texture-descriptor:label"Shaped Slug text target":size:dimensions:2d:formatformat:usage'
:render-attachment:copy-src
vertices
createdevice
make-buffer-descriptor:label"Shaped Slug glyph quads":size
*
lengthvertex-data
4
:usage'
:vertex:copy-dst
readback
createdevice
make-buffer-descriptor:label"Shaped Slug text readback":size:usage'
:copy-dst
write-bufferverticesvertex-data
dolist
drawdraws
setfglyph-resources
setfencoder
createdevice
make-command-encoder-descriptor:label"Shaped Slug text commands"
let
pass
begin-render-passencoder
make-render-pass-descriptor:color-attachments`
:view,target:load-op:clear:store-op:store:clear-value
0.040.120.201.0
set-pipelinepasspipeline
set-vertex-bufferpass0vertices
loopfordrawindrawsforfirst-vertexfrom0by6do
set-bind-grouppass0
slug-text-draw-bind-groupdraw
drawpass61first-vertex
encodeencoder
make-gpu-copy-texture-to-buffer-command:sourcetarget:destinationreadback
setfcommand-buffer
finishencoder
submitcommand-buffer
values
read-bufferreadback
widthheightformatshaped
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
dolist
resourceglyph-resources
destroyresource
whenreadback
destroyreadback
whenvertices
destroyvertices
whentarget
destroytarget
whenpipeline
destroypipeline
whenfragment-module
destroyfragment-module
whenvertex-module
destroyvertex-module
whendevice
destroydevice