All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased - ReleaseDate
0.4.0 - 2024-10-07
- PR#4 updated
SPIRV-Headers
to match Vulkan SDK 1.3.290
- PR#2 included a combination of control-flow (restructurization) refactors and fixes:
- fixed rewrites of chains of
OpPhi
s (for e.g. Rust-GPU's non-minimal SSA form) - isolated the
ControlRegion
s of unstructured SPIR-T CFGs from eachother- i.e. removed the implicit dominance-based (SSA-style) "value visibility" semantics
- explicit (phi-like) propagation of all values across CFG edges required
- structured control-flow, however, retained its more flexible "value visibility"
- (re)structurization "fuses" away the massively redundant dataflow when sound
- fixed SSA dominance issues (introduced by PR#48 "minimal loops") using the above
- i.e. opportunistically simplify conservative (maximally redundant) dataflow
- could be expanded on in the future, moving towards hermetic (RVSDG-like) regions
- fixed issues with
ExitInvocation
s, by supporting them in structured SPIR-T- e.g. this includes terminators like
OpKill
,OpEmitMeshTasksEXT
, etc. - also enables (very hacky) "abort" via
ExitInvocation(OpReturn)
from entry-point
- e.g. this includes terminators like
- optimized common cases of divergent (
unreachable
/ExitInvocation
) control-flow- e.g.
if cond { abort() } else { foo() }
->if cond { abort() } else {} foo()
- effectively flattens chains of checks (w/ the
abort() = ExitInvocation(OpReturn)
hack)
- e.g.
- fixed rewrites of chains of
⬆️ above entries after repository move (to Rust-GPU/spirt
)
See also the transition announcement blog post.
⬇️ below entries before repository move (from EmbarkStudios/spirt
)
- PR#61 updated
SPIRV-Headers
to match Vulkan SDK 1.3.275 - PR#55 fixed CFG structurization
"region
children
list desync" assertion failures (e.g. rust-gpu#1086) by tracking wholeControlRegion
s instead of theirchildren
- also removed a lot of redundant boolean values, thanks to condition propagation becoming always on-demand (instead of relying on less robust special-casing)
- PR#51 combined
TypeCtor
/ConstCtor
and their respective "ctor args", into a single unifiedTypeKind
/ConstKind
- PR#48 changed CFG structurization
from "maximal loops" to "minimal loops" (computed using Tarjan's SCC algorithm),
and added
OpLoopMerge
support on top (by extending a "minimal loop" as needed)
0.3.0 - 2023-07-25
- PR#45 added the ability to
pretty-print
OpExtInst
s (SPIR-V "extended instructions") using officialextinst.*.grammar.json
descriptions and/or custom ones (registered viaContext
)
- PR#43 tweaked several pretty-printing
details to improve visual cohesion ("named arguments" in
module.{dialect,debuginfo}
) and ergonomics (multi-line string literals, HTML entities for anchor escaping, hover on multi-version table cells to disable "no changes" desaturation/dimming) - PR#36 started using
OpName
s in pretty-printing, to replace theT1
/F2
/v3
"anonymous" style, when unambiguous - PR#40 increased the pretty-printed
HTML
font-size
from15px
to17px
, to improve readability - PR#39 shortened pretty-printed names
like
type2
/func3
/etc. toT2
/F3
/etc. (with e.g.type T2 = ...
style definitions) - PR#38 split off
print::Node::Root
, allowing "roots" and "non-root nodes" to have different APIs, and dynamic dispatch to be limited to "roots" (as "non-root nodes" are a small finite set of types) - PR#35 abandoned the custom
#{A, B, C}
"attribute set" style in favor of Rust-like#[A]
#[B]
#[C]
(and always printing them inline, without anyattrs123
shorthands) - PR#33 replaced the
spv.OpFoo<imms>(IDs)
style of pretty-printing withspv.OpFoo(A: imm, B: ID, C: imm, ...)
(unified parenthesized list of operands, with deemphasized operand names infoo:
"named arguments" style) - PR#28 moved two
DataInstDef
fields (kind
andoutput_type
) toDataInstForm
, a new interned type - PR#30 replaced the old
spv-lower-dump
example (which only dumped plaintext, not HTML) with a more usefulspv-lower-print
one
- PR#34 fixed
OpTypePointer
s being spuriously printed as dependencies ofGlobalVarDecl
/PtrToGlobalVar
(neither of which actually print the pointer type), and added a CI check forREADME.md
examples - PR#37 fixed pretty-printing layout
accuracy regarding line widths (by tracking
font-size
-aware "fractional columns"), and raised the maximum line width back up to120
columns - PR#27 fixed some pretty-printing issues
in the initial
Attr::Diagnostics
implementation (BUG
paths and/* ... */
indentation)
0.2.0 - 2023-04-21
- PR#24 added
qptr
("quasi-pointer") type and associated passes to destroy and recreate pointer-related type information (see PR#24 for a much more detailed overview) - PR#22 added
Diag
andAttr::Diagnostics
, for embedding diagnostics (errors or warnings) in SPIR-T itself - PR#18 added anchor-based alignment to multi-version pretty-printing output (the same definitions will be kept on the same lines in all columns, wherever possible, to improve readability)
- PR#26 allowed using
OpEmitMeshTasksEXT
as a terminator (by hardcoding it asControl-Flow
) - PR#25 updated SPIRV-headers from 1.5.4 to 1.6.1
- PR#21 tweaked pretty-printing
styles around de-emphasis (shrinking instead of thinning, for width savings),
and SPIR-V ops/enums (via de-emphasized
spv.
prefix and distinct orange color)
0.1.0 - 2022-12-16
Initial public release of SPIR-T for minimal Rust-GPU integration.
- Conversions from/to SPIR-V (
spv::lower
/spv::lift
). - Control-flow structurizer, from CFGs to SPIR-T's stricter structured control-flow.
- Pretty-printer with (styled and hyperlinked) HTML output.