luv

Workshop wiki

module.lisp

hal/vulkan/spir-v/module.lisp

system luv/spir-v · 19 definitions · on GitHub

Structured shader IR above the deliberately literal SPIR-V assembler.

instructions.lisp is the small instruction vocabulary and binary encoder. This file gives shaders enough shape to be pleasant live Lisp objects: modules contain functions, functions contain basic blocks, and lowering erases that structure into the linear instruction stream expected by assemble.

in-package#:luv.spir-v
defclassspir-v-module
version:initarg:version:initform#x00010000:accessorspir-v-module-version
generator:initarg:generator:initform0:accessorspir-v-module-generator
capabilities:initarg:capabilities:initform'
shader
:accessorspir-v-module-capabilities
extensions:initarg:extensions:initformnil:accessorspir-v-module-extensions
extended-instruction-imports:initarg:extended-instruction-imports:initformnil:accessorspir-v-module-extended-instruction-imports
addressing-model:initarg:addressing-model:initform'logical:accessorspir-v-module-addressing-model
memory-model:initarg:memory-model:initform'glsl-450:accessorspir-v-module-memory-model
entry-points:initarg:entry-points:initformnil:accessorspir-v-module-entry-points
execution-modes:initarg:execution-modes:initformnil:accessorspir-v-module-execution-modes
debug-instructions:initarg:debug-instructions:initformnil:accessorspir-v-module-debug-instructions
annotations:initarg:annotations:initformnil:accessorspir-v-module-annotations
global-declarations:initarg:global-declarations:initformnil:accessorspir-v-module-global-declarations
function-definitions:initarg:function-definitions:initformnil:accessorspir-v-module-function-definitions
defclassspir-v-extended-instruction-import
result-id:initarg:result-id:accessorspir-v-extended-instruction-import-result-id
name:initarg:name:initform"GLSL.std.450":accessorspir-v-extended-instruction-import-name
:documentation

A durable OpExtInstImport: one named instruction set the module uses. Extended operations reference its result id, so repeated operators in one module share a single import.

defclassspir-v-entry-point
execution-model:initarg:execution-model:initform'gl-compute:accessorspir-v-entry-point-execution-model
function:initarg:function:accessorspir-v-entry-point-function
name:initarg:name:initform"main":accessorspir-v-entry-point-name
interfaces:initarg:interfaces:initformnil:accessorspir-v-entry-point-interfaces
defclassspir-v-execution-mode
function:initarg:function:accessorspir-v-execution-mode-function
name:initarg:name:accessorspir-v-execution-mode-name
literals:initarg:literals:initformnil:accessorspir-v-execution-mode-literals
defclassspir-v-function-definition
result-id:initarg:result-id:accessorspir-v-function-result-id
return-type:initarg:return-type:accessorspir-v-function-return-type
control:initarg:control:initform'none:accessorspir-v-function-control
function-type:initarg:function-type:accessorspir-v-function-type
parameters:initarg:parameters:initformnil:accessorspir-v-function-parameters
basic-blocks:initarg:basic-blocks:initformnil:accessorspir-v-function-basic-blocks
defclassspir-v-basic-block
label:initarg:label:accessorspir-v-basic-block-label
instructions:initarg:instructions:initformnil:accessorspir-v-basic-block-instructions
defgenericlower-spir-v
object
:documentation

Lower one structured shader object to a list of instruction instances.

defmethodlower-spir-v
listobject
defunlower-spir-v-sequence
objects
let
instructionsnil
mapnil
lambda
object
setfinstructions
nconcinstructions
cond
typepobject'instruction
listobject
conspobject
t
error'spir-v-error:formobject:reason:cannot-lower
objects
instructions
defmethodlower-spir-v
list
parse-instruction
list
spir-v-extended-instruction-import-result-idimport
'ext-inst-import
spir-v-extended-instruction-import-nameimport
defmethodlower-spir-v
list
parse-instruction
list*'entry-point
spir-v-entry-point-execution-modelentry-point
spir-v-entry-point-functionentry-point
spir-v-entry-point-nameentry-point
spir-v-entry-point-interfacesentry-point
defmethodlower-spir-v
list
parse-instruction
list*'execution-mode
spir-v-execution-mode-functionmode
spir-v-execution-mode-namemode
spir-v-execution-mode-literalsmode
defmethodlower-spir-v
cons
parse-instruction
list
spir-v-basic-block-labelblock
'label
lower-spir-v-sequence
spir-v-basic-block-instructionsblock
defmethodlower-spir-v
append
list
parse-instruction
list
spir-v-function-result-iddefinition
'function
spir-v-function-return-typedefinition
spir-v-function-controldefinition
spir-v-function-typedefinition
lower-spir-v-sequence
spir-v-function-parametersdefinition
lower-spir-v-sequence
spir-v-function-basic-blocksdefinition
defmethodlower-spir-v
append
loopforcapabilityin
spir-v-module-capabilitiesmodule
collect

SPIR-V logical layout: extensions and extended-instruction imports sit between the capabilities and the memory model.

loopforextensionin
spir-v-module-extensionsmodule
collect
lower-spir-v-sequence
spir-v-module-extended-instruction-importsmodule
list
parse-instruction
list'memory-model
spir-v-module-addressing-modelmodule
spir-v-module-memory-modelmodule
lower-spir-v-sequence
spir-v-module-entry-pointsmodule
lower-spir-v-sequence
spir-v-module-execution-modesmodule
lower-spir-v-sequence
spir-v-module-debug-instructionsmodule
lower-spir-v-sequence
spir-v-module-annotationsmodule
lower-spir-v-sequence
spir-v-module-global-declarationsmodule
lower-spir-v-sequence
spir-v-module-function-definitionsmodule
defunassemble-spir-v-module
module

Lower structured module and assemble its linear instruction stream.

assemble:version
spir-v-module-versionmodule
:generator
spir-v-module-generatormodule
defungradient-compute-module
&key

Make a structured compute shader which writes an XY gradient to RGBA8.

unless
and
integerpwidth
pluspwidth
integerpheight
pluspheight
error'spir-v-error:formnil:reason:invalid-image-size:details
make-instance'spir-v-module:entry-points
list
make-instance'spir-v-entry-point:function'%main:interfaces'
%global-id
:execution-modes
list
make-instance'spir-v-execution-mode:function'%main:name'local-size:literals'
881
:annotations'
decorate%global-idbuilt-in
enumbuilt-inglobal-invocation-id
decorate%output-imagedescriptor-set0
decorate%output-imagebinding0
:global-declarations`
%uinttype-int320
%floattype-float32
%uvec2type-vector%uint2
%uvec3type-vector%uint3
%vec4type-vector%float4
%storage-imagetype-image%float2d0002rgba8
%input-uvec3-pointertype-pointerinput%uvec3
%image-pointertype-pointeruniform-constant%storage-image
%function-typetype-function%void
%inverse-widthconstant%float,
%inverse-heightconstant%float,
%blueconstant%float0.25
%oneconstant%float1.0
%global-idvariable%input-uvec3-pointerinput
%output-imagevariable%image-pointeruniform-constant
:function-definitions
list
make-instance'spir-v-function-definition:result-id'%main:return-type'%void:function-type'%function-type:basic-blocks
list
make-instance'spir-v-basic-block:label'%entry:instructions'
%global-valueload%uvec3%global-id
%coordinatevector-shuffle%uvec2%global-value%global-value01
%xcomposite-extract%uint%coordinate0
%ycomposite-extract%uint%coordinate1
%xfconvert-u-to-f%float%x
%yfconvert-u-to-f%float%y
%redf-mul%float%xf%inverse-width
%greenf-mul%float%yf%inverse-height
%colorcomposite-construct%vec4%red%green%blue%one
%imageload%storage-image%output-image
image-write%image%coordinate%color
defungradient-compute-shader
&key

Assemble the structured RGBA8 gradient compute shader.