luv

Workshop wiki

live-artifact.lisp

luft/render/live-artifact.lisp

system luft/render · 33 definitions · on GitHub

luft's renderer is one live artifact cohort.

Its pipelines share layouts, targets, and meshes, so replacing individual stages would publish an ABI mixture. Build a complete renderer beside the installed one, copy its semantic meshes, and cross the viewer boundary only after every shader module and pipeline exists.

in-package#:luft.render
define-conditionrenderer-source-changed-during-build
error
before:initarg:before:readerrenderer-build-source-before
after:initarg:after:readerrenderer-build-source-after
:report
lambda
conditionstream
formatstream

luft shader source changed while renderer revision ~D was ~ building (now ~D); the unpublished cohort was discarded.

renderer-build-source-beforecondition
renderer-build-source-aftercondition
defstruct
renderer-live-candidate
:constructormake-renderer-live-candidate
renderer
defclassrenderer-live-artifact
viewer:initarg:viewer:accessorrenderer-live-artifact-viewer
status:initarg:status:initform:installed:accessorrenderer-live-artifact-status
diagnostic:initformnil:accessorrenderer-live-artifact-diagnostic
installed-revision:initform0:accessorrenderer-live-artifact-installed-revision
installed-source-revision:initarg:source-revision:accessorrenderer-live-installed-source-revision
attempted-source-revision:initarg:source-revision:accessorrenderer-live-attempted-source-revision
installed-source-values:initarg:source-values:initformnil:accessorrenderer-live-installed-source-values
attempted-source-values:initarg:source-values:initformnil:accessorrenderer-live-attempted-source-values
force-p:initformnil:accessorrenderer-live-artifact-force-p
lock:initform
sb-thread:make-mutex:name"LUFT live renderer cohort"
:readerrenderer-live-artifact-lock
:documentation

The complete last-known-good renderer cohort owned by one luft viewer.

defvar*viewer-live-artifacts*
make-hash-table:test#'eq:weakness:key
defvar*viewer-live-artifacts-lock*
sb-thread:make-mutex:name"LUFT viewer live artifacts"
defmethodlive-artifact-label
declare
ignoreartifact

luft renderer cohort

defmethodlive-artifact-status
renderer-live-artifact-statusartifact
defmethodlive-artifact-diagnostic
renderer-live-artifact-diagnosticartifact
defmethodlive-artifact-installed-revision
renderer-live-artifact-installed-revisionartifact
defgenericnote-renderer-live-diagnostic
viewerdiagnostic
:documentation

Mirror diagnostic into viewer's presentation state without owning it.

defmethodnote-renderer-live-diagnostic
diagnostic
declare
ignoreviewerdiagnostic
nil
defmethodnote-renderer-live-diagnostic
diagnostic
setf
viewer-shader-diagnosticviewer
diagnostic
defunreport-renderer-live-diagnostic
artifactdiagnostic

Best-effort observer update outside artifact's ownership outcome.

alexandria:when-let
viewer
renderer-live-artifact-viewerartifact

A diagnostic surface is secondary to publication. Its failure must never turn an already-installed cohort into an apparent failed build.

diagnostic
defmethodapplication-live-artifacts
alexandria:when-let
listartifact
defuncall-with-renderer-source-values

Call function while collecting its folded live shader values.

Return function's primary value, the collected references, and source revisions immediately before and after the call.

let
references
listnil
let
let
value
funcallfunction
valuesvalue
copy-list
carreferences
before
defunmake-tracked-renderer
devicecolor-formatextent

make-renderer with live source values and revision boundaries.

call-with-renderer-source-values
lambda
make-rendererdevicecolor-formatextent
defunattach-viewer-live-artifact
viewersource-valuessource-revision

Attach viewer's already-installed renderer as its one live cohort.

sb-thread:with-mutex
or
setf
make-instance'renderer-live-artifact:viewerviewer:source-values
copy-listsource-values
:source-revisionsource-revision
defgenericbuild-renderer-live-candidate
artifact
:documentation

Build artifact's complete unpublished renderer and semantic mesh cohort.

defmethodbuild-renderer-live-candidate
let*
viewer
renderer-live-artifact-viewerartifact
old
viewer-rendererviewer
candidatenil
completed-pnil
unlessold
error"Cannot refresh a released LUFT renderer cohort."
unwind-protect
progn
setfcandidate
make-renderer
viewer-deviceviewer
canvas-format
viewer-contextviewer
canvas-extent
viewer-contextviewer
dolist
key
renderer-slot-orderold
renderer-set-meshcandidatekey
mesh-slot-prepared-mesh
gethashkey
renderer-mesh-slotsold
setfcompleted-pt
make-renderer-live-candidatecandidate
unlesscompleted-p
whencandidate
defgenericpublish-renderer-live-candidate
artifactcandidate
:documentation

Publish candidate and return a non-fatal retirement diagnostic, or NIL.

defmethodpublish-renderer-live-candidate
candidate
let*
viewer
renderer-live-artifact-viewerartifact
old
viewer-rendererviewer
new
renderer-live-candidate-renderercandidate
retirement-diagnosticnil
setf
viewer-rendererviewer
new
renderer-live-candidate-renderercandidate
nil
handler-case
error
condition

Publication succeeded. Backends retain failed native retirement custody; expose it without rolling the viewer back to a dead cohort.

setfretirement-diagnosticcondition
retirement-diagnostic
defgenericrelease-renderer-live-candidate
artifactcandidate
:documentation

Release an unpublished renderer candidate.

defmethodrelease-renderer-live-candidate
candidate
declare
ignoreartifact
alexandria:when-let
renderer
renderer-live-candidate-renderercandidate
setf
renderer-live-candidate-renderercandidate
nil
nil
defunrenderer-live-artifact-refresh-p
artifactsource-revision
or
renderer-live-artifact-force-partifact
>source-revision
renderer-live-attempted-source-revisionartifact
not
luv.shader:shader-source-value-references-current-p
renderer-live-attempted-source-valuesartifact
defun%refresh-renderer-live-artifact
artifact

Refresh artifact while its mutation lock is held.

unless
member
renderer-live-artifact-statusartifact
'
:releasing:released
let
when
renderer-live-artifact-refresh-partifactsource-revision
let
candidatenil
references
listnil
setf
renderer-live-artifact-force-partifact
nil
renderer-live-artifact-statusartifact
:building
let
unwind-protect
handler-case
progn
setfcandidate
let
unless
=source-revisionafter
error'renderer-source-changed-during-build:beforesource-revision:afterafter
let
retirement
setf
renderer-live-artifact-statusartifact
:installed
renderer-live-artifact-diagnosticartifact
retirement
renderer-live-artifact-installed-revisionartifact
1+
renderer-live-artifact-installed-revisionartifact
renderer-live-installed-source-revisionartifact
source-revision
renderer-live-installed-source-valuesartifact
copy-list
carreferences
error
condition

Failed source is inspectable state, not an outage.

setf
renderer-live-artifact-statusartifact
:failed
renderer-live-artifact-diagnosticartifact
condition
setf
renderer-live-attempted-source-revisionartifact
source-revision
renderer-live-attempted-source-valuesartifact
copy-list
carreferences
whencandidate
handler-case
error
condition

Never replace the source/build condition while unwinding an unpublished cohort. Native backends keep failed retirement custody; retain the cleanup detail on the artifact when it is the only diagnostic.

unless
renderer-live-artifact-diagnosticartifact
setf
renderer-live-artifact-diagnosticartifact
condition
artifact
defmethodrefresh-live-artifact
sb-thread:with-mutex
renderer-live-artifact-lockartifact
defunforce-viewer-live-artifact-refresh

Request and synchronously perform one complete renderer-cohort rebuild.

alexandria:when-let
sb-thread:with-mutex
renderer-live-artifact-lockartifact
setf
renderer-live-artifact-force-partifact
t
defunnote-viewer-renderer-replacement
viewersource-valuessource-revision

Adopt a complete renderer installed by an explicit scene rebuild.

alexandria:when-let
sb-thread:with-mutex
renderer-live-artifact-lockartifact
setf
renderer-live-artifact-statusartifact
:installed
renderer-live-artifact-diagnosticartifact
nil
renderer-live-artifact-installed-revisionartifact
1+
renderer-live-artifact-installed-revisionartifact
renderer-live-installed-source-revisionartifact
source-revision
renderer-live-attempted-source-revisionartifact
source-revision
renderer-live-installed-source-valuesartifact
copy-listsource-values
renderer-live-attempted-source-valuesartifact
copy-listsource-values
viewer
defgenericrelease-renderer-live-resources
artifact
:documentation

Release artifact's installed renderer cohort.

defmethodrelease-renderer-live-resources
alexandria:when-let
viewer
renderer-live-artifact-viewerartifact
alexandria:when-let
renderer
viewer-rendererviewer

Relinquish the application-visible borrow before native retirement. Backends retain custody of a failed native destruction, while leaving the renderer installed here would invite a later frame or release to use or retire the same cohort twice.

setf
viewer-rendererviewer
nil
nil
defmethodrelease-live-artifact
sb-thread:with-mutex
renderer-live-artifact-lockartifact
unless
eq:released
renderer-live-artifact-statusartifact
setf
renderer-live-artifact-statusartifact
:releasing
unwind-protect

Release is terminal even when native retirement reports a failure: the backend owns that failed retirement and the application must not resurrect or double-destroy the detached cohort.

alexandria:when-let
viewer
renderer-live-artifact-viewerartifact
setf
renderer-live-artifact-viewerartifact
nil
renderer-live-artifact-statusartifact
:released
nil