luv

Workshop wiki

compositor.lisp

mcclim/compositor.lisp

system luv/mcclim · 17 definitions · on GitHub

A first deliberately theatrical McCLIM compositor.

McCLIM still paints an ordinary CPU raster. The raster mirror uploads it to a sampled GPU texture; this object renders that texture as a perspective-spinning quad into an offscreen color attachment, after which the canvas context performs its familiar texture-to-swapchain copy.

in-package#:mcluv
shader:define-shaderspinning-texture-vertex-specification
:stage:vertex:inputs
vertex-index:uint:built-in:vertex-index
:resources
state:uniform-block:set0:binding2:members
center:vec4
right:vec4
up:vec4
:outputs
clip-position:vec4:built-in:position
texture-coordinate:vec2:location0
let*
x-bit
modvertex-indextwo
y-bit
/vertex-indextwo
center-x
-
*x2.0
1.0
center-y
-
*y2.0
1.0
shader:set-outputtexture-coordinate
shader:set-outputclip-position
+center
*rightcenter-x
*upcenter-y
shader:define-shaderspinning-texture-fragment-specification
:stage:fragment:inputs
texture-coordinate:vec2:location0
:resources
image:texture-2d:set0:binding0:sample-transfer:identity
texture-sampler:sampler:set0:binding1
:outputs
color-output:vec4:location0
let*
texel
shader:sampleimagetexture-samplertexture-coordinate
shader:set-outputcolor-outputtexel
shader:define-shaderlisp-machine-chassis-vertex-specification
:stage:vertex:inputs
vertex-index:uint:built-in:vertex-index
:resources
state:uniform-block:set0:binding2:members
center:vec4
right:vec4
up:vec4
:outputs
clip-position:vec4:built-in:position
chassis-color:vec4:location0
let*
layer
/vertex-indexfour
local-index
modvertex-indexfour
x
shader:float
modlocal-indextwo
y
shader:float
/local-indextwo
shadow-p
<layerone
body-p
<layertwo
scale-x
ifshadow-p1.2058824
ifbody-p1.17647061.0735294
scale-y
ifshadow-p1.2647059
ifbody-p1.23529411.0882353
offset-x
ifshadow-p0.051470590.0
offset-y
ifshadow-p0.08088235
ifbody-p0.017647060.0
color-r
ifshadow-p0.035
ifbody-p0.500.075
color-g
ifshadow-p0.045
ifbody-p0.470.095
color-b
ifshadow-p0.043
ifbody-p0.380.085
color
shader:vec4color-rcolor-gcolor-b1.0
layer-x
+
*
-
*x2.0
1.0
scale-x
offset-x
layer-y
+
*
-
*y2.0
1.0
scale-y
offset-y
shader:set-outputchassis-colorcolor
shader:set-outputclip-position
+center
*rightlayer-x
*uplayer-y
shader:define-shaderlisp-machine-chassis-fragment-specification
:stage:fragment:inputs
chassis-color:vec4:location0
:outputs
color-output:vec4:location0
let*
shader:set-outputcolor-outputchassis-color
defclassspinning-compositor-frame-state
buffer:initarg:buffer:readerspinning-frame-state-buffer
bind-group:initarg:bind-group:readerspinning-frame-state-bind-group
relief-buffer:initformnil:accessorspinning-frame-state-relief-buffer
relief-capacity:initform0:accessorspinning-frame-state-relief-capacity
defclassspinning-texture-compositor
speed:initarg:speed:initform0.12:readerspinning-compositor-speed
start-time:initformnil:accessorspinning-compositor-start-time
device:initformnil:accessorspinning-compositor-device
source:initformnil:accessorspinning-compositor-source
size:initformnil:accessorspinning-compositor-size
depth-format:initformnil:accessorspinning-compositor-depth-format
depth-compare:initformnil:accessorspinning-compositor-depth-compare
target-format:initformnil:accessorspinning-compositor-target-format
output:initformnil:accessorspinning-compositor-output
source-view:initformnil:accessorspinning-compositor-source-view
output-view:initformnil:accessorspinning-compositor-output-view
sampler:initformnil:accessorspinning-compositor-sampler
vertex-module:initformnil:accessorspinning-compositor-vertex-module
fragment-module:initformnil:accessorspinning-compositor-fragment-module
chassis-vertex-module:initformnil:accessorspinning-compositor-chassis-vertex-module
chassis-fragment-module:initformnil:accessorspinning-compositor-chassis-fragment-module
layout:initformnil:accessorspinning-compositor-layout
pipeline:initformnil:accessorspinning-compositor-pipeline
chassis-pipeline:initformnil:accessorspinning-compositor-chassis-pipeline
frame-states:initform
make-hash-table:test#'eq
:readerspinning-compositor-frame-states
defunspinning-compositor-resources
compositor
removenil
list
spinning-compositor-pipelinecompositor
spinning-compositor-chassis-pipelinecompositor
spinning-compositor-layoutcompositor
spinning-compositor-chassis-fragment-modulecompositor
spinning-compositor-chassis-vertex-modulecompositor
spinning-compositor-fragment-modulecompositor
spinning-compositor-vertex-modulecompositor
spinning-compositor-samplercompositor
spinning-compositor-output-viewcompositor
spinning-compositor-source-viewcompositor
spinning-compositor-outputcompositor
defunclear-spinning-compositor-resources
compositor
maphash
lambda
surfacestate
declare
ignoresurface
alexandria:when-let
buffer
spinning-frame-state-relief-bufferstate
luv:destroy
spinning-frame-state-bind-groupstate
luv:destroy
spinning-frame-state-bufferstate
spinning-compositor-frame-statescompositor
clrhash
spinning-compositor-frame-statescompositor
dolist
luv:destroyresource
setf
spinning-compositor-devicecompositor
nil
spinning-compositor-sourcecompositor
nil
spinning-compositor-sizecompositor
nil
spinning-compositor-depth-formatcompositor
nil
spinning-compositor-depth-comparecompositor
nil
spinning-compositor-target-formatcompositor
nil
spinning-compositor-outputcompositor
nil
spinning-compositor-source-viewcompositor
nil
spinning-compositor-output-viewcompositor
nil
spinning-compositor-samplercompositor
nil
spinning-compositor-vertex-modulecompositor
nil
spinning-compositor-fragment-modulecompositor
nil
spinning-compositor-chassis-vertex-modulecompositor
nil
spinning-compositor-chassis-fragment-modulecompositor
nil
spinning-compositor-layoutcompositor
nil
spinning-compositor-pipelinecompositor
nil
spinning-compositor-chassis-pipelinecompositor
nil
compositor
defunensure-spinning-compositor-resources
compositorcontextsource&keydepth-format
depth-compare:less
target-format
let*
size
luv:gpu-texture-sizesource
format
luv:gpu-texture-formatsource
target-format
ortarget-formatformat
unless
and
eqdevice
spinning-compositor-devicecompositor
eqsource
spinning-compositor-sourcecompositor
equalsize
spinning-compositor-sizecompositor
eqdepth-format
spinning-compositor-depth-formatcompositor
eqdepth-compare
spinning-compositor-depth-comparecompositor
eqtarget-format
spinning-compositor-target-formatcompositor
let
creatednil
completed-pnil
unwind-protect
labels
create-resource
descriptor
let
resource
luv:createdevicedescriptor
pushresourcecreated
resource
let*
output
create-resource
luv:make-texture-descriptor:label"McCLIM composited frame":sizesize:dimensions:2d:formatformat:usage'
:render-attachment:copy-src
source-view
create-resource
luv:make-texture-view-descriptor:texturesource
output-view
create-resource
luv:make-texture-view-descriptor:textureoutput
sampler
create-resource
luv:make-sampler-descriptor:label"McCLIM linear sampler"
vertex-module
create-resource
luv:make-shader-module-descriptor:label"spinning McCLIM vertex shader":language:mathematical:code
fragment-module
create-resource
luv:make-shader-module-descriptor:label"spinning McCLIM fragment shader":language:mathematical:code
chassis-vertex-module
create-resource
luv:make-shader-module-descriptor:label"Lisp machine chassis vertex shader":language:mathematical:code
chassis-fragment-module
create-resource
luv:make-shader-module-descriptor:label"Lisp machine chassis fragment shader":language:mathematical:code
layout
create-resource
luv:make-bind-group-layout-descriptor:label"sampled McCLIM texture layout":entries'
:binding0:type:texture
:binding1:type:sampler
:binding2:type:uniform-buffer
pipeline
create-resource
luv:make-render-pipeline-descriptor:label"spinning McCLIM quad":layoutlayout:vertex`
:module,vertex-module
:fragment`
:module,fragment-module:targets
:format,target-format
:depth-stencil
whendepth-format`
:format,depth-format:depth-write-enablednil:depth-compare,depth-compare
:primitive'
:topology:triangle-strip
chassis-pipeline
create-resource
luv:make-render-pipeline-descriptor:label"Lisp machine terminal chassis":layoutlayout:vertex`
:module,chassis-vertex-module
:fragment`
:module,chassis-fragment-module:targets
:format,target-format
:depth-stencil
whendepth-format`
:format,depth-format:depth-write-enablednil:depth-compare,depth-compare
:primitive'
:topology:triangle-strip
setf
spinning-compositor-devicecompositor
device
spinning-compositor-sourcecompositor
source
spinning-compositor-sizecompositor
size
spinning-compositor-depth-formatcompositor
depth-format
spinning-compositor-depth-comparecompositor
depth-compare
spinning-compositor-target-formatcompositor
target-format
spinning-compositor-outputcompositor
output
spinning-compositor-source-viewcompositor
source-view
spinning-compositor-output-viewcompositor
output-view
spinning-compositor-samplercompositor
sampler
spinning-compositor-vertex-modulecompositor
vertex-module
spinning-compositor-fragment-modulecompositor
fragment-module
spinning-compositor-chassis-vertex-modulecompositor
chassis-vertex-module
spinning-compositor-chassis-fragment-modulecompositor
chassis-fragment-module
spinning-compositor-layoutcompositor
layout
spinning-compositor-pipelinecompositor
pipeline
spinning-compositor-chassis-pipelinecompositor
chassis-pipeline
completed-pt
unlesscompleted-p
dolist
resourcecreated
ignore-errors
luv:destroyresource
compositor
defunensure-spinning-compositor-frame-state
compositorsurface

A swapchain image is only acquired again after its previous presentation, so its matching uniform buffer is no longer being read by the GPU.

or
gethashsurface
spinning-compositor-frame-statescompositor
let*
device
spinning-compositor-devicecompositor
buffernil
bind-groupnil
completed-pnil
unwind-protect
progn
setfbuffer
luv:createdevice
luv:make-buffer-descriptor:label"McCLIM quad transform":size64:usage'
:uniform
bind-group
luv:createdevice
luv:make-bind-group-descriptor:label"sampled McCLIM raster and uniform state":layout
spinning-compositor-layoutcompositor
:entries`
:binding0:resource,
spinning-compositor-source-viewcompositor
:binding1:resource,
spinning-compositor-samplercompositor
:binding2:resource,buffer
let
state
make-instance'spinning-compositor-frame-state:bufferbuffer:bind-groupbind-group
setf
gethashsurface
spinning-compositor-frame-statescompositor
state
completed-pt
state
unlesscompleted-p
whenbind-group
luv:destroybind-group
whenbuffer
defunspinning-compositor-state
compositortimestamp&key
aspect-scale1.0
unless
spinning-compositor-start-timecompositor
setf
spinning-compositor-start-timecompositor
timestamp
let
phase
*2pi
spinning-compositor-speedcompositor
-timestamp
spinning-compositor-start-timecompositor
make-array12:element-type'single-float:initial-contents
let
sine
sinphase
cosine
cosphase
mapcar
lambda
value
coercevalue'single-float
list
*sine0.12
0.00.451.18
*0.68aspect-scalecosine
0.0
*0.22sine
*0.48sine
0.00.680.00.0
defunrender-spinning-mirror-frame
mirrortimestamp
let
context
mirror-contextmirror
source
mirror-texturemirror
compositor
mirror-compositormirror
when
andcontextsource
eq:open
luv:canvas-state
mirror-targetmirror
let
state
spinning-compositor-statecompositortimestamp
luv:present-canvas-framecontext
lambda
surfaceencoder
let
frame-state
luv:write-buffer
spinning-frame-state-bufferframe-state
state
let
pass
luv:begin-render-passencoder
luv:make-render-pass-descriptor:label"McCLIM offscreen pass":color-attachments`
:view,
spinning-compositor-output-viewcompositor
:load-op:clear:store-op:store:clear-value
0.0250.0250.041.0
luv:encodepass
luv:make-gpu-set-pipeline-command:pipeline
spinning-compositor-chassis-pipelinecompositor
luv:encodepass
luv:make-gpu-set-bind-group-command:index0:bind-group
spinning-frame-state-bind-groupframe-state
dotimes
layer3
luv:encodepass
luv:make-gpu-draw-command:vertex-count4:first-vertex
*layer4
luv:encodepass
luv:make-gpu-set-pipeline-command:pipeline
spinning-compositor-pipelinecompositor
luv:encodepass
luv:make-gpu-set-bind-group-command:index0:bind-group
spinning-frame-state-bind-groupframe-state
luv:encodepass
luv:make-gpu-draw-command:vertex-count4
luv:encodeencoder
luv:make-gpu-copy-texture-command:source
spinning-compositor-outputcompositor
:destinationsurface
mirror
defmethodpresent-raster-mirror-texture
declare
ignorecontexttexture
render-spinning-mirror-framemirror
float
/
get-internal-real-time
internal-time-units-per-second
1.0d0
defunenable-spinning-mirror
mirror&key
frames-per-second60
speed0.12

Make mirror orbit as a sampled texture and return its compositor.

check-typemirrorluv-raster-mirror
release-raster-mirror-compositor
mirror-compositormirror
let*
compositor
make-instance'spinning-texture-compositor:speedspeed
canvas
mirror-targetmirror
setf
mirror-compositormirror
compositor
luv:make-cadence-clock
lambda
native-canvastimestamp
declare
ignorenative-canvas
:frames-per-secondframes-per-second
compositor
defundisable-spinning-mirror
mirror

Return mirror to direct texture presentation.

check-typemirrorluv-raster-mirror
let
canvas
mirror-targetmirror
release-raster-mirror-compositor
mirror-compositormirror
setf
mirror-compositormirror
nil
setf
mcclim-render:image-dirty-regionmirror
+everywhere+
mirror
defunopen-spinning-widget-lab
&key
title"McCLIM widget drifting through luv space"
frames-per-second60
speed0.12

Open widget-lab and immediately composite it as a spinning 3D quad.

let*
frame
open-widget-lab:titletitle:server-path'
:luv-raster
sheet
frame-top-level-sheetframe
mirror
sheet-direct-mirrorsheet
enable-spinning-mirrormirror:frames-per-secondframes-per-second:speedspeed
frame