luv

Workshop wiki

tests.lisp

hal/metal/tests.lisp

system luvcraft/core/test · 29 definitions · on GitHub

in-package#:luvcraft.tests
deftestmetal-slug-textures-accept-their-exact-packed-words
let*
queue
band-texturenil
curve-texturenil
unwind-protect
progn
setfband-texture
createdevice
make-texture-descriptor:size'
21
:dimensions:2d:format:rg16-uint:usage'
:texture-binding:copy-dst
curve-texture
createdevice
make-texture-descriptor:size'
21
:dimensions:2d:format:rgba16-float:usage'
:texture-binding:copy-dst
ok
equal'
211
gpu-texture-sizeband-texture
ok
equal'
211
gpu-texture-sizecurve-texture
write-texturequeue
make-texture-copy:textureband-texture
make-array'
12
:element-type'
unsigned-byte32
:initial-contents'
#x00020001#x00040003
make-texture-data-layout:bytes-per-row8:rows-per-image1
'
21
write-texturequeue
make-texture-copy:texturecurve-texture
make-array'
12
:element-type'
unsigned-byte64
:initial-contents'
#x3c00380034003000#x40003c0038003400
make-texture-data-layout:bytes-per-row16:rows-per-image1
'
21
ok
typepband-texture'luv::metal-gpu-texture
ok
typepcurve-texture'luv::metal-gpu-texture
let
unexpectednil
unwind-protect
progn
setfunexpected
createdevice
make-texture-descriptor:size'
11
:dimensions:2d:format:rgba8-unorm:usage:storage-binding
ok
typepunexpected'luv::metal-gpu-texture
ok
member:storage-binding
gpu-texture-usageunexpected
whenunexpected
destroyunexpected
whencurve-texture
destroycurve-texture
whenband-texture
destroyband-texture
destroydevice
deftestadopted-metal-textures-enter-explicit-residency
let*
nativenil
texturenil
unwind-protect
progn
setfnative
metal:new-metal-texture
luv::metal-native-objectdevice
88metal::+pixel-format-r8-unorm+metal:+texture-usage-shader-read+:storage-modemetal:+storage-mode-private+:label"adopted residency probe"
let
setftexture
adopt-native-texturedevicenativeowner
make-texture-descriptor:size'
88
:dimensions:2d:format:r8-unorm:usage'
:texture-binding
ok
luv::metal-texture-resident-ptexture
ok
equal'
881
gpu-texture-sizetexture
ok
not
luv::metal-texture-owned-ptexture
destroytexture
setftexturenil

The external-owner retain was consumed, but this original native retain remains independently owned by the test.

ok
not
objc:objective-c-object-released-pnative
whentexture
destroytexture
destroydevice
deftestmetal-coalesces-multiple-sampled-texture-preparations
let*
encodernil
colornil
depthnil
unwind-protect
progn
setfencoder
createdevice
make-command-encoder-descriptor
color
createdevice
make-texture-descriptor:size'
88
:dimensions:2d:format:rgba8-unorm:usage'
:render-attachment:texture-binding
depth
createdevice
make-texture-descriptor:size'
88
:dimensions:2d:format:depth32-float:usage'
:render-attachment:texture-binding
prepare-textureencodercolor:texture-binding
prepare-textureencoderdepth:texture-binding
ok
luv::metal-encoder-pending-consumer-barrierencoder
ok
gethashcolor
luv::metal-encoder-resourcesencoder
ok
gethashdepth
luv::metal-encoder-resourcesencoder
whenencoder
destroyencoder
whendepth
destroydepth
whencolor
destroycolor
destroydevice
deftestmetal-chained-blits-observe-the-prior-blit-write
let*
queue
sourcenil
intermediatenil
readbacknil
encodernil
command-buffernil
unwind-protect
progn
setfsource
createdevice
make-texture-descriptor:label"chained blit source":size:dimensions:2d:format:rgba8-unorm:usage'
:render-attachment:copy-src
intermediate
createdevice
make-texture-descriptor:label"chained blit intermediate":size:dimensions:2d:format:rgba8-unorm:usage'
:copy-src:copy-dst
readback
createdevice
make-buffer-descriptor:label"chained blit readback":size:usage'
:copy-dst
encoder
createdevice
make-command-encoder-descriptor:label"chained blit commands"
end-pass
begin-render-passencoder
make-render-pass-descriptor:color-attachments`
:view,source:load-op:clear:store-op:store:clear-value
1.00.01.01.0
encodeencoder
make-gpu-copy-texture-command:sourcesource:destinationintermediate
encodeencoder
make-gpu-copy-texture-to-buffer-command:sourceintermediate:destinationreadback
setfcommand-buffer
finishencoder
submitqueuecommand-buffer
let
pixels
read-bufferreadback
ok
loopforindexbelow
lengthpixels
by4always
and
=255
arefpixelsindex
zerop
arefpixels
+index1
=255
arefpixels
+index2
=255
arefpixels
+index3
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
whenreadback
destroyreadback
whenintermediate
destroyintermediate
whensource
destroysource
destroydevice
deftestworld-text-cache-reuses-shaping-and-device-glyphs
let*
font
cl-dejavu:font-pathname"DejaVuSans.ttf"
camera
make-instance'fly-camera
firstnil
unwind-protect
progn
setffirst
luvcraft::make-world-text-rundevicecachecamera:bgra8-unorm"hello, world"font
second
luvcraft::make-world-text-rundevicecachecamera:bgra8-unorm"hello, world"font
let
first-glyphs
luvcraft::world-text-run-glyphsfirst
second-glyphs
luvcraft::world-text-run-glyphssecond
resources-by-glyph
make-hash-table
saw-repeated-glyph-pnil
ok
eq
luvcraft::world-text-run-shaped-textfirst
luvcraft::world-text-run-shaped-textsecond
ok
eq
luvcraft::world-text-run-atlasfirst
luvcraft::world-text-run-atlassecond
ok
<
luv.slug:slug-glyph-atlas-band-texel-count
luvcraft::world-text-run-atlasfirst
4096
ok
<
luv.slug:slug-glyph-atlas-curve-texel-count
luvcraft::world-text-run-atlasfirst
4096
dolist
glyphfirst-glyphs
let
glyph-id
luv.slug:slug-glyph-placement-glyph-idglyph
multiple-value-bind
resourcepresent-p
gethashglyph-idresources-by-glyph
ifpresent-p
progn
setfsaw-repeated-glyph-pt
ok
eqresource
luv.slug:slug-glyph-placement-resourceglyph
setf
gethashglyph-idresources-by-glyph
luv.slug:slug-glyph-placement-resourceglyph
oksaw-repeated-glyph-p
loopforfirst-glyphinfirst-glyphsforsecond-glyphinsecond-glyphsdo
ok
eq
luv.slug:slug-glyph-placement-resourcefirst-glyph
luv.slug:slug-glyph-placement-resourcesecond-glyph
destroydevice
objc:define-objective-c-messagemake-test-metal-layer
"new":object:ownership:owned:class"CAMetalLayer"
defuninstall-metal-live-probe-vertex
eval'
luv.shader:define-shader-methodluv.shader:shader-specification-formetal-live-probe-vertex-specification
role
eql:metal-live-probe
stage
eql:vertex
:stage:vertex:inputs
position:vec3:location0
:outputs
clip-position:vec4:built-in:position
let*
luv.shader:set-outputclip-positionclip
defuninstall-metal-live-probe-fragment
red&keyinvalid-p
eval`
luv.shader:define-shader-methodluv.shader:shader-specification-formetal-live-probe-fragment-specification
role
eql:metal-live-probe
stage
eql:fragment
:stage,
ifinvalid-p:compute:fragment
:outputs
color:vec4:location0
let*
rgba
luv.shader:vec4,red0.250.751.0
luv.shader:set-outputcolorrgba
deftestmetal-messages-retain-structure-abi
let
ok
equal
getfsize:selector
"setDrawableSize:"
ok
equal
second
second
getfsize:argument-types
'
ok
equal
getfclear:selector
"setClearColor:"
ok
equal
second
second
getfclear:argument-types
'
ok
equal
getfargument-buffer:selector
"setAddress:attributeStride:atIndex:"
ok
equal
getfdraw:selector
"drawPrimitives:vertexStart:vertexCount:instanceCount:baseInstance:"
ok
equal
getfdraw-indexed:selector
"drawIndexedPrimitives:indexCount:indexType:indexBuffer:indexBufferLength:instanceCount:baseVertex:baseInstance:"
ok
equal
getfdraw-mesh:selector
"drawMeshThreadgroups:threadsPerObjectThreadgroup:threadsPerMeshThreadgroup:"
ok
every
lambda
argument
equal
secondargument
'
rest
getfdraw-mesh:argument-types
deftestnative-close-can-be-deferred-for-application-teardown
let
setf
lambda
native-canvasevent
declare
ignorenative-canvas
push
canvas-event-timestampevent
timestamps
:defer-canvas-close
ok
not
luv::sdl-canvas-close-requested-pcanvas

This is the SDL event macOS emits for Command-Q, distinct from clicking one window's close button.

cffi:with-foreign-object
event'
:structsdl3:common-event
setf
cffi:foreign-slot-valueevent'
:structsdl3:common-event
'sdl3::%timestamp
17
luv::handle-sdl-canvas-eventcanvasevent
cffi:foreign-enum-value'sdl3::event-type:quit
ok
equal'
170
timestamps
ok
not
luv::sdl-canvas-close-requested-pcanvas
ok
luv::sdl-canvas-close-requested-pcanvas
deftestmetal-provider-owns-a-real-metal-4-queue
let
unwind-protect
progn
ok
typepdevice'metal-gpu-device
ok
equal
objc:objective-c-object-protocol-name
luv::metal-native-object
"MTL4CommandQueue"
ok
equal
objc:objective-c-object-protocol-name
luv::metal-device-residency-setdevice
"MTLResidencySet"
ok
equal
objc:objective-c-object-protocol-name
luv::metal-queue-completion-event
"MTLSharedEvent"
destroydevice
deftestmetal-device-owns-a-real-metal-4-compiler
let
unwind-protect
ok
equal
objc:objective-c-object-protocol-name
metal-device-compilerdevice
"MTL4Compiler"
destroydevice
deftestluvcraft-shader-compiles-in-memory-on-the-metal-device
let
unwind-protect
progn
setfmodule
createdevice
make-shader-module-descriptor:label"block fragment Metal library":language:mathematical:codespecification
ok
eqspecification
luv.msl:msl-document-specification
metal-shader-module-documentmodule
ok
string=
metal-shader-module-entry-pointmodule
"block_world_fragment_specification"
ok
=
metal-shader-module-function-typemodule
metal:+function-type-fragment+
ok
equal
objc:objective-c-object-protocol-name
luv::metal-native-objectmodule
"MTLLibrary"
whenmodule
destroymodule
destroydevice
deftestluvcraft-vertex-and-fragment-link-as-a-metal-4-render-pipeline
let
vertex-modulenil
fragment-modulenil
pipelinenil
unwind-protect
progn
setfvertex-module
createdevice
make-shader-module-descriptor:label"block vertex Metal library":language:mathematical:code
fragment-module
createdevice
make-shader-module-descriptor:label"block fragment Metal library":language:mathematical:code
pipeline
createdevice
make-render-pipeline-descriptor:label"block world Metal 4 pipeline":layoutnil:vertex`
:module,vertex-module:buffers
:array-stride64:attributes
:shader-location0:offset0:format:float32x3
:shader-location1:offset12:format:float32x3
:shader-location2:offset24:format:float32x3
:shader-location3:offset36:format:float32x3
:shader-location4:offset48:format:float32x4
:fragment`
:module,fragment-module:targets
:format:bgra8-unorm:blend:premultiplied-alpha
:primitive'
:topology:triangle-list
:depth-stencil'
:format:depth32-float:depth-write-enabledt:depth-compare:less
ok
equal
objc:objective-c-object-protocol-name
luv::metal-native-objectpipeline
"MTLRenderPipelineState"
ok
equal
objc:objective-c-object-protocol-name
metal-render-pipeline-depth-stencil-statepipeline
"MTLDepthStencilState"
ok
=1
length
metal-render-pipeline-vertex-bufferspipeline
whenpipeline
destroypipeline
whenfragment-module
destroyfragment-module
whenvertex-module
destroyvertex-module
destroydevice
deftesttask-mesh-pipeline-carries-uint64-and-draws-on-metal-4
let
task-modulenil
mesh-modulenil
fragment-modulenil
pipelinenil
targetnil
readbacknil
encodernil
command-buffernil
unwind-protect
progn
setftask-module
createdevice
make-shader-module-descriptor:label"task uint64 Metal library":language:mathematical:code
mesh-module
createdevice
make-shader-module-descriptor:label"mesh uint64 Metal library":language:mathematical:code
fragment-module
createdevice
make-shader-module-descriptor:label"mesh fragment Metal library":language:mathematical:code
pipeline
createdevice
make-mesh-render-pipeline-descriptor:label"task mesh uint64 Metal 4 pipeline":layoutnil:task`
:module,task-module
:mesh`
:module,mesh-module
:fragment`
:module,fragment-module:targets
:format:rgba8-unorm
:max-mesh-workgroups1
target
createdevice
make-texture-descriptor:label"task mesh proof target":size'
3232
:dimensions:2d:format:rgba8-unorm:usage'
:render-attachment:copy-src
readback
createdevice
make-buffer-descriptor:label"task mesh proof readback":size
*32324
:usage'
:copy-dst
encoder
createdevice
make-command-encoder-descriptor:label"task mesh proof commands"
ok
=
metal-shader-module-function-typetask-module
metal:+function-type-object+
ok
=
metal-shader-module-function-typemesh-module
metal:+function-type-mesh+
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
encodeencoder
make-gpu-copy-texture-to-buffer-command:sourcetarget:destinationreadback
setfcommand-buffer
finishencoder
submitcommand-buffer
let
pixels
read-bufferreadback
ok
loopforindexbelow
lengthpixels
by4thereis
plusp
arefpixelsindex
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
whenreadback
destroyreadback
whentarget
destroytarget
whenpipeline
destroypipeline
whenfragment-module
destroyfragment-module
whenmesh-module
destroymesh-module
whentask-module
destroytask-module
destroydevice
deftestfailed-metal-library-keeps-the-device-compiler-usable
let*
bad-document
luv.msl:compile-mslspecification
modulenil
failurenil
setf
luv.msl:msl-document-sourcebad-document
"this is deliberately not Metal source"
unwind-protect
progn
handler-case
createdevice
make-shader-module-descriptor:language:msl:codebad-document
luv::metal-gpu-error
condition
setffailurecondition
okfailure
ok
eq
luv::metal-gpu-error-reasonfailure
:library-compilation-failed
ok
stringp
getf
luv::metal-gpu-error-detailsfailure
:diagnostic
setfmodule
createdevice
make-shader-module-descriptor:language:mathematical:codespecification
whenmodule
destroymodule
destroydevice
deftestlive-metal-pipeline-retains-last-good-and-recovers
let
artifactnil
unwind-protect
progn
setfartifact
luvcraft::make-live-shader-pipeline:role:metal-live-probe:vertex-role:metal-live-probe:label"live Metal pipeline probe":devicedevice:layoutnil:vertex-buffers'
:array-stride12:attributes
:shader-location0:offset0:format:float32x3
:target-format:bgra8-unorm:primitive'
:topology:triangle-list
:depth-stencilnil
let
first-pipeline
luvcraft::live-shader-pipeline-native-pipelineartifact
ok
typepfirst-pipeline'metal-gpu-render-pipeline
ok
eq:installed
live-shader-pipeline-statusartifact
ok
eq:failed
live-shader-pipeline-statusartifact
ok
eqfirst-pipeline
luvcraft::live-shader-pipeline-native-pipelineartifact
ok
not
luv::metal-object-destroyed-pfirst-pipeline
let
replacement
luvcraft::live-shader-pipeline-native-pipelineartifact
ok
eq:installed
live-shader-pipeline-statusartifact
ok
=1
live-shader-pipeline-installed-revisionartifact
ok
not
eqfirst-pipelinereplacement
ok
luv::metal-object-destroyed-pfirst-pipeline
ok
typepreplacement'metal-gpu-render-pipeline
destroydevice
deftestlive-metal-pipeline-replacement-retires-after-its-in-flight-draw
let*
queue
artifactnil
texturenil
verticesnil
encodernil
commandsnil
old-native-pipelinenil
unwind-protect
progn
setfartifact
luvcraft::make-live-shader-pipeline:role:metal-live-probe:vertex-role:metal-live-probe:label"in-flight Metal pipeline probe":devicedevice:layoutnil:vertex-buffers'
:array-stride12:attributes
:shader-location0:offset0:format:float32x3
:target-format:bgra8-unorm:primitive'
:topology:triangle-list
:depth-stencilnil
texture
createdevice
make-texture-descriptor:label"in-flight pipeline target":size'
1616
:dimensions:2d:format:bgra8-unorm:usage'
:render-attachment
vertices
createdevice
make-buffer-descriptor:label"in-flight pipeline vertices":size36:usage'
:vertex:copy-dst
write-buffervertices
make-array9:element-type'single-float:initial-contents'
-0.7-0.60.00.7-0.60.00.00.70.0
let
old-pipeline
luvcraft::live-shader-pipeline-native-pipelineartifact
setfold-native-pipeline
luv::metal-native-objectold-pipeline
encoder
createdevice
make-command-encoder-descriptor
let
pass
begin-render-passencoder
make-render-pass-descriptor:color-attachments
list
list:viewtexture:load-op:clear:store-op:store:clear-value
0.00.00.01.0
set-pipelinepassold-pipeline
set-vertex-bufferpass0vertices
drawpass3
setfcommands
finishencoder
submitqueuecommands
ok
luv::metal-object-destroyed-pold-pipeline
ok
not
eqold-pipeline
luvcraft::live-shader-pipeline-native-pipelineartifact
ok
objc:objective-c-object-released-pold-native-pipeline
whencommands
destroycommands
whenencoder
destroyencoder
whenvertices
destroyvertices
whentexture
destroytexture
destroydevice
deftestmetal-buffer-populates-a-native-metal-4-argument-table
let
buffernil
argument-tablenil
unwind-protect
progn
setfbuffer
createdevice
make-buffer-descriptor:label"argument table probe":size36:usage'
:vertex:copy-dst
write-bufferbuffer
make-array9:element-type'single-float:initial-contents'
-0.65-0.550.00.65-0.550.00.00.700.0
multiple-value-bind
tablediagnostic
metal:new-metal-4-argument-table
luv::metal-native-objectdevice
1:label"argument table probe":attribute-strides-pt
ok
nulldiagnostic
setfargument-tabletable
metal:set-metal-argument-table-bufferargument-table
metal:metal-buffer-gpu-address
luv::metal-native-objectbuffer
120
ok
typepbuffer'metal-gpu-buffer
ok
plusp
metal:metal-buffer-gpu-address
luv::metal-native-objectbuffer
ok
equal
objc:objective-c-object-protocol-nameargument-table
"MTL4ArgumentTable"
whenargument-table
whenbuffer
destroybuffer
destroydevice
deftestmetal-finish-produces-one-shot-portable-work-with-dependencies
let*
queue
texturenil
encodernil
command-buffernil
native-texturenil
native-command-buffernil
allocatornil
unwind-protect
progn
setftexture
createdevice
make-texture-descriptor:label"portable Metal work dependency":size'
88
:dimensions:2d:format:rgba8-unorm:usage'
:render-attachment
native-texture
luv::metal-native-objecttexture
encoder
createdevice
make-command-encoder-descriptor:label"portable Metal work"
encodeencoder
make-gpu-clear-texture-command:texturetexture:color
0.250.50.751.0
setfcommand-buffer
finishencoder
native-command-buffer
luv::metal-native-objectcommand-buffer
allocator
luv::metal-command-buffer-allocatorcommand-buffer
ok
typepcommand-buffer'metal-gpu-command-buffer
ok
membertexture
luv::metal-command-buffer-resourcescommand-buffer
ok
=1
submitqueuecommand-buffer
ok
eq:submitted
luv::metal-command-buffer-statecommand-buffer
ok
=1
luv::metal-object-last-submissiontexture
ok
signals
submitqueuecommand-buffer
'gpu-invalid-state-error
ok
=1
length
luv::metal-queue-pending-submissionsqueue

Logical invalidation is immediate. Native retirement follows the shared-event completion frontier without blocking destroy.

destroycommand-buffer
setfcommand-buffernil
destroytexture
setftexturenil
ok
null
luv::metal-queue-pending-submissionsqueue
ok
objc:objective-c-object-released-pnative-command-buffer
ok
objc:objective-c-object-released-pallocator
ok
objc:objective-c-object-released-pnative-texture
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
whentexture
destroytexture
destroydevice
deftestmetal-submission-signals-its-frontier-when-presentation-raises
let*
queue
encodernil
command-buffernil
native-command-buffernil
allocatornil
unwind-protect
progn
setfencoder
createdevice
make-command-encoder-descriptor
command-buffer
finishencoder
native-command-buffer
luv::metal-native-objectcommand-buffer
allocator
luv::metal-command-buffer-allocatorcommand-buffer
ok
signals
luv::submit-metal-command-buffersqueue
vectorcommand-buffer
:after-commit
lambda
error"presentation probe"
'simple-error
ok
=1
length
luv::metal-queue-pending-submissionsqueue
destroycommand-buffer
setfcommand-buffernil
ok
null
luv::metal-queue-pending-submissionsqueue
ok
objc:objective-c-object-released-pnative-command-buffer
ok
objc:objective-c-object-released-pallocator
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
destroydevice
deftestmetal-completion-signal-failure-is-a-rooted-retry-obligation
let*
queue
encodernil
command-buffernil
original-commit
symbol-functioncommit-symbol
original-signal
symbol-functionsignal-symbol
commits0
signals0
fail-signal-pt
unwind-protect
progn
setfencoder
createdevice
make-command-encoder-descriptor
command-buffer
finishencoder
symbol-functioncommit-symbol
lambda
&restarguments
incfcommits
applyoriginal-commitarguments
symbol-functionsignal-symbol
lambda
&restarguments
incfsignals
whenfail-signal-p
setffail-signal-pnil
error"injected Metal completion signal failure"
applyoriginal-signalarguments
ok
signals
submitqueuecommand-buffer
'simple-error
ok
=1commits
ok
=1signals
ok
eq:submitted
luv::metal-command-buffer-statecommand-buffer
ok
=1
length
luv::metal-queue-pending-submissionsqueue
ok
=1
luv::metal-queue-completion-signal-ready-valuequeue
ok
zerop
luv::metal-queue-completion-signal-enqueued-valuequeue
ok
eqqueue
gethash
luv::metal-queue-retirement-ledgerqueue
luv::*gpu-retirement-ledger-custodians*

The deterministic service pass retries only the published signal, never recommitting the native command buffers.

ok
=1commits
ok
=2signals
ok
=1
luv::metal-queue-completion-signal-enqueued-valuequeue
ok
null
luv::metal-queue-pending-submissionsqueue
setf
symbol-functioncommit-symbol
original-commit
symbol-functionsignal-symbol
original-signal
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
destroydevice
deftestmetal-finish-retains-ended-encoder-ownership-on-wrapper-failure
let*
encoder
createdevice
make-command-encoder-descriptor:label"Metal finish handoff probe"
wrappernil
original-end
symbol-functionend-symbol
original-constructor
symbol-functionconstructor-symbol
ends0
fail-construction-pt
unwind-protect
progn
setf
symbol-functionend-symbol
lambda
&restarguments
incfends
applyoriginal-endarguments
symbol-functionconstructor-symbol
lambda
&restarguments
whenfail-construction-p
setffail-construction-pnil
error"injected Metal command-buffer wrapper failure"
applyoriginal-constructorarguments
ok
signals
finishencoder
'simple-error
ok
=1ends
ok
eq:ended
luv::metal-encoder-stateencoder
ok
luv::metal-encoder-command-bufferencoder
ok
luv::metal-encoder-allocatorencoder
setfwrapper
finishencoder
ok
=1ends
ok
eq:finished
luv::metal-encoder-stateencoder
ok
null
luv::metal-encoder-command-bufferencoder
ok
null
luv::metal-encoder-allocatorencoder
setf
symbol-functionend-symbol
original-end
symbol-functionconstructor-symbol
original-constructor
whenwrapper
destroywrapper
destroyencoder
destroydevice
deftestluvcraft-metal-frame-resources-follow-the-drawable-pool
call-with-sdl-main-thread
lambda
let
sessionnil
unwind-protect
progn
setfsession
start-luvcraft:provider
make-instance'metal-gpu-provider
:world:residency-radius0:visible-pnil:frames-per-secondnil:width160:height100
let*
renderer
luvcraft:luvcraft-session-renderersession
frame-resources-before
loopforstatebeingthehash-valuesofframe-statessum
non-frame-resources
-
length
luvcraft::luvcraft-renderer-resourcesrenderer
frame-resources-before
dotimes
index8
submitted-work-done
device-queue
luvcraft::luvcraft-session-devicesession
let*
state-count
hash-table-countframe-states
frame-resource-count
loopforstatebeingthehash-valuesofframe-statessum
ok
<=1state-count3
ok
=
length
luvcraft::luvcraft-renderer-resources
luvcraft:luvcraft-session-renderersession
+non-frame-resourcesframe-resource-count
whensession
deftestmetal-storage-buffers-carry-packed-words-to-mesh-pipelines
let
termsnil
uniformnil
bind-groupnil
unwind-protect
progn
setfterms
createdevice
make-buffer-descriptor:label"storage words":size32:usage'
:storage
uniform
createdevice
make-buffer-descriptor:label"storage words uniform":size16:usage'
:uniform

Sixty-four-bit words round-trip through the shared buffer.

write-bufferterms
make-array4:element-type'
unsigned-byte64
:initial-contents'
1#x123456789abcdef0#xffffffffffffffff0
let
bytes
ok
=32
lengthbytes
ok
=1
arefbytes0
ok
=#xf0
arefbytes8
ok
=#x12
arefbytes15
ok
=#xff
arefbytes23

A one-word offset is legal for a 64-bit array; a half word is not.

write-bufferterms
make-array1:element-type'
unsigned-byte64
:initial-contents'
7
:offset8
ok
=7
aref8
ok
signals
write-bufferterms
make-array1:element-type'
unsigned-byte64
:initial-contents'
7
:offset4
'gpu-error

Storage buffers bind beside uniform buffers, by usage.

setflayout
createdevice
make-bind-group-layout-descriptor:entries'
:binding0:type:uniform-buffer
:binding1:type:storage-buffer
ok
signals
createdevice
make-bind-group-descriptor:layoutlayout:entries`
:binding0:resource,uniform
:binding1:resource,uniform
'gpu-error
setfbind-group
createdevice
make-bind-group-descriptor:layoutlayout:entries`
:binding0:resource,uniform
:binding1:resource,terms
ok
whenbind-group
destroybind-group
whenuniform
destroyuniform
whenterms
destroyterms
destroydevice
deftestiosurface-round-trips-by-id-and-takes-a-metal-clear

The parent creates a surface and hands out its integer ID; a "child" (here, the same process) looks the ID up, wraps it as a Metal texture, and clears it. The parent's original reference sees the pixels.

let*
id
metal:iosurface-idsurface
nativenil
texturenil
encodernil
command-buffernil
unwind-protect
progn
oktwin
ok
=16
metal:iosurface-widthtwin
setftexture
adopt-native-texturedevicenative
make-texture-descriptor:size'
1616
:dimensions:2d:format:bgra8-unorm:usage'
:render-attachment:texture-binding
setfencoder
createdevice
make-command-encoder-descriptor:label"iosurface clear"
end-pass
begin-render-passencoder
make-render-pass-descriptor:color-attachments`
:view,texture:load-op:clear:store-op:store:clear-value
1.00.50.01.0
setfcommand-buffer
finishencoder
submitcommand-buffer
ok
equal'
0128255255
ok
equal'
0128255255
whencommand-buffer
destroycommand-buffer
whenencoder
destroyencoder
whentexture
destroytexture
destroydevice