luv

Workshop wiki

gpu-tests.lisp

hal/gpu-tests.lisp

system luv/test · 19 definitions · on GitHub

in-package#:luv.tests
deftestbuffer-uploads-preserve-sixteen-bit-storage
multiple-value-bind
foreign-typeelement-size
luv::buffer-data-foreign-type
make-array3:element-type'
unsigned-byte16
ok
eq:uint16foreign-type
ok
=2element-size
defclassdescriptor-probe-device
operation:initformnil:accessordescriptor-probe-operation
descriptor:initformnil:accessordescriptor-probe-descriptor
native:initformnil:accessordescriptor-probe-native
owner:initformnil:accessordescriptor-probe-owner
defmethodluv:create
descriptorluv::buffer-descriptor
setf
descriptor-probe-operationdevice
:create-buffer
descriptor-probe-descriptordevice
descriptor
descriptor
defmethodluv:create
descriptorluv::texture-descriptor
setf
descriptor-probe-operationdevice
:create-texture
descriptor-probe-descriptordevice
descriptor
descriptor
defmethodluv:adopt-native-texture
nativeowner
descriptorluv::texture-descriptor
setf
descriptor-probe-operationdevice
:adopt-texture
descriptor-probe-descriptordevice
descriptor
descriptor-probe-nativedevice
native
descriptor-probe-ownerdevice
owner
descriptor
defungpu-request-reason
thunk
handler-case
progn
funcallthunk
:no-error
luv:gpu-request-error
condition
luv:gpu-request-error-reasoncondition
defungpu-request-condition
thunk
handler-case
progn
funcallthunk
nil
luv:gpu-request-error
condition
condition
deftestportable-buffer-descriptors-reach-devices-in-one-canonical-shape
let*
device
usage
vector:vertex:index:copy-dst:vertex
source
luv:make-buffer-descriptor:label"probe buffer":size64:usageusage
canonical
luv:createdevicesource
ok
not
eqsourcecanonical
ok
eq:create-buffer
descriptor-probe-operationdevice
ok
=64
luv::buffer-descriptor-sizecanonical
ok
equal'
:vertex:index:copy-dst
luv::buffer-descriptor-usagecanonical
ok
equsage
luv::buffer-descriptor-usagesource
ok
string="probe buffer"
luv::gpu-descriptor-labelcanonical
deftestportable-texture-descriptors-canonicalize-create-and-adoption
dolist
size'
3216
32161
3216
32161
let*
device
source
luv:make-texture-descriptor:label"probe texture":sizesize:dimensions:2d:format:rgba8-unorm:usage:texture-binding
canonical
luv:createdevicesource
ok
equal'
32161
luv::texture-descriptor-sizecanonical
ok
equal'
:texture-binding
luv::texture-descriptor-usagecanonical
ok
eqsize
luv::texture-descriptor-sizesource
let*
device
native
list:native
owner
list:owner
source
luv:make-texture-descriptor:size
2010
:dimensions:2d:format:r8-unorm:usage
:texture-binding:storage-binding:texture-binding
canonical
luv:adopt-native-texturedevicenativeownersource
ok
eq:adopt-texture
descriptor-probe-operationdevice
ok
eqnative
descriptor-probe-nativedevice
ok
eqowner
descriptor-probe-ownerdevice
ok
equal'
20101
luv::texture-descriptor-sizecanonical
ok
equal'
:texture-binding:storage-binding
luv::texture-descriptor-usagecanonical
deftestportable-descriptor-errors-do-not-depend-on-a-backend
let
device
dolist
size'
nil0-1#.
1+
expt264
ok
eq:invalid-buffer-size
gpu-request-reason
lambda
luv:createdevice
luv:make-buffer-descriptor:sizesize:usage:vertex
dolist
usage'
nil:indirect
:vertex:indirect
:copy-dst:map-read
ok
eq:invalid-buffer-usage
gpu-request-reason
lambda
luv:createdevice
luv:make-buffer-descriptor:size4:usageusage
dolist
size'
nil
16
1682
160
16-1
ok
eq:invalid-texture-size
gpu-request-reason
lambda
luv:createdevice
luv:make-texture-descriptor:sizesize:dimensions:2d:format:r8-unorm:usage:texture-binding
dolist
usage'
nil:present
:copy-dst:present
ok
eq:invalid-texture-usage
gpu-request-reason
lambda
luv:createdevice
luv:make-texture-descriptor:size'
168
:dimensions:2d:format:r8-unorm:usageusage
ok
eq:invalid-texture-dimensions
gpu-request-reason
lambda
luv:createdevice
luv:make-texture-descriptor:size'
168
:dimensions:3d:format:r8-unorm:usage:texture-binding
deftestportable-descriptor-errors-retain-source-and-operation
let*
device
source
luv:make-buffer-descriptor:size0:usage:vertex
condition
ok
eq:create
luv:gpu-error-operationcondition
ok
eqsource
luv:gpu-request-error-descriptorcondition
ok
eql0
luv:gpu-request-error-detailscondition
let
device
dotted-usage
cons:vertex:copy-dst
circular-size
list168
setf
cddrcircular-size
circular-size
ok
eq:invalid-buffer-usage
gpu-request-reason
lambda
luv:createdevice
luv:make-buffer-descriptor:size4:usagedotted-usage
ok
eq:invalid-texture-size
gpu-request-reason
lambda
luv:createdevice
luv:make-texture-descriptor:sizecircular-size:dimensions:2d:format:r8-unorm:usage:texture-binding
deftestnative-retirement-preserves-a-strict-fifo-retry-barrier
let
ledger
luv::make-gpu-retirement-ledger
events'
fail-view-pt
warningnil
luv::enqueue-gpu-retirementledger:view0
lambda
setfevents
nconcevents
list:view
whenfail-view-p
setffail-view-pnil
error"view retirement failed"
luv::enqueue-gpu-retirementledger:texture0
lambda
setfevents
nconcevents
list:texture
luv::enqueue-gpu-retirementledger:future2
lambda
setfevents
nconcevents
list:future
handler-bind
luv::gpu-native-retirement-warning
lambda
condition
setfwarningcondition
muffle-warningcondition

The failed view is an ownership barrier: its texture and every later entry remain untouched until the view succeeds.

ok
equal'
:view
events
ok
eq:test
luv:gpu-native-retirement-operationwarning
ok
=1
length
luv:gpu-native-retirement-failureswarning
ok
eq:view
luv:gpu-native-retirement-failure-resource
first
luv:gpu-native-retirement-failureswarning
ok
=1
luv:gpu-native-retirement-failure-attempts
first
luv:gpu-native-retirement-failureswarning
ok
search"view retirement failed"
princ-to-string
luv:gpu-native-retirement-failure-cause
first
luv:gpu-native-retirement-failureswarning
ok
search"retained the failed resource and its FIFO successors"
princ-to-stringwarning
ok
equal'
:view:texture:future
mapcar#'luv::gpu-retirement-entry-resource
luv::gpu-retirement-ledger-entriesledger
setfeventsnil
luv::maintain-gpu-retirement-ledgerledger2:operation:test-retry
ok
equal'
:view:texture:future
events
ok
null
luv::gpu-retirement-ledger-entriesledger
deftestnative-retirement-detaches-callback-enqueues-without-losing-order
let
ledger
luv::make-gpu-retirement-ledger
events'
fail-second-pt
luv::enqueue-gpu-retirementledger:first0
lambda
push:firstevents

Model a release callback which recursively destroys another owner.

luv::enqueue-gpu-retirementledger:callback-child0
lambda
push:callback-childevents

Recursive maintenance cannot overtake the outer detached batch, and device teardown cannot mistake that detached batch for emptiness.

luv::enqueue-gpu-retirementledger:second0
lambda
push:secondevents
whenfail-second-p
setffail-second-pnil
error"second retirement failed"
ok
equal'
:second:first
events

The older failure stays before work enqueued by a callback, and the callback child is deliberately not visited in the same maintenance pass.

ok
equal'
:second:callback-child
mapcar#'luv::gpu-retirement-entry-resource
luv::gpu-retirement-ledger-entriesledger
setfeventsnil
ok
equal'
:callback-child:second
events
ok
null
luv::gpu-retirement-ledger-entriesledger
deftestnative-retirement-sequences-resume-after-the-last-successful-step
let
ledger
luv::make-gpu-retirement-ledger
first-attempts0
second-attempts0
third-attempts0
follower-attempts0
fail-second-pt
luv::enqueue-gpu-retirementledger:multi-step0
luv::make-gpu-retirement-sequence
lambda
incffirst-attempts
lambda
incfsecond-attempts
whenfail-second-p
setffail-second-pnil
error"injected second-step failure"
lambda
incfthird-attempts
luv::enqueue-gpu-retirementledger:follower0
lambda
incffollower-attempts
ok
=1first-attempts
ok
=1second-attempts
ok
zeropthird-attempts
ok
zeropfollower-attempts

Retry resumes at step two; the successful destructive step is not run twice, and the follower runs only after the whole owner retires.

ok
=1first-attempts
ok
=2second-attempts
ok
=1third-attempts
ok
=1follower-attempts
ok
null
luv::gpu-retirement-ledger-entriesledger
deftestfinalizer-native-retirement-remains-durably-retryable
let
luv::*gpu-finalizer-retirement-ledger*
luv::make-gpu-retirement-ledger
attempts0
fail-pt
handler-bind
luv::retire-gpu-finalizer-native-ownernil:leaked-owner
lambda
incfattempts
whenfail-p
setffail-pnil
error"injected finalizer teardown failure"
ok
=1attempts
ok
equal'
:leaked-owner
mapcar#'luv::gpu-retirement-entry-resource
luv::gpu-retirement-ledger-entriesluv::*gpu-finalizer-retirement-ledger*
ok
=2attempts
ok
null
luv::gpu-retirement-ledger-entriesluv::*gpu-finalizer-retirement-ledger*
deftestnative-retirement-transfer-precedes-invalidation
let
ledger
luv::make-gpu-retirement-ledger
invalidated-pnil
luv::transfer-gpu-retirementledger:resource0
lambda
nil
lambda
ok
eq:resource
luv::gpu-retirement-entry-resource
first
luv::gpu-retirement-ledger-entriesledger
setfinvalidated-pt
okinvalidated-p
let
invalidated-pnil
conditionnil
handler-case
luv::perform-gpu-retirement-directly:resource
lambda
error"native teardown failed"
lambda
setfinvalidated-pt
luv:gpu-native-retirement-error
error
setfconditionerror
ok
eq:destroy
luv:gpu-native-retirement-operationcondition
ok
=1
length
luv:gpu-native-retirement-failurescondition
ok
search"native teardown failed"
princ-to-stringcondition
ok
notinvalidated-p
deftestnative-retirement-worker-start-failure-cannot-split-custody
let*
ledger
luv::make-gpu-retirement-ledger
custodian
list:fake-queue
invalidated-pnil
original-spawn
symbol-functionspawn-symbol
unwind-protect
progn
setf
symbol-functionspawn-symbol
lambda
error"injected worker creation failure"
luv::transfer-gpu-retirementledger:owner0
lambda
nil
lambda
setfinvalidated-pt
custodian
okinvalidated-p
ok
=1
length
luv::gpu-retirement-ledger-entriesledger
ok
ok
search"injected worker creation failure"
setf
symbol-functionspawn-symbol
original-spawn
deftestnative-retirement-service-worker-is-ephemeral
let
ok
sb-thread:thread-ephemeral-pthread
sb-thread:join-threadthread
let
creators
looprepeat4collect
sb-thread:make-thread
lambda
looprepeat4always
let
prog1
sb-thread:thread-ephemeral-pthread
sb-thread:join-threadthread
ok
every#'identity
mapcar#'sb-thread:join-threadcreators