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-Headersto match Vulkan SDK 1.3.290
- PR#2 included a combination of control-flow (restructurization) refactors and fixes:
- fixed rewrites of chains of
OpPhis (for e.g. Rust-GPU's non-minimal SSA form) - isolated the
ControlRegions 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
ExitInvocations, 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-Headersto match Vulkan SDK 1.3.275 - PR#55 fixed CFG structurization
"region
childrenlist desync" assertion failures (e.g. rust-gpu#1086) by tracking wholeControlRegions 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/ConstCtorand 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
OpLoopMergesupport on top (by extending a "minimal loop" as needed)
0.3.0 - 2023-07-25
- PR#45 added the ability to
pretty-print
OpExtInsts (SPIR-V "extended instructions") using officialextinst.*.grammar.jsondescriptions 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
OpNames in pretty-printing, to replace theT1/F2/v3"anonymous" style, when unambiguous - PR#40 increased the pretty-printed
HTML
font-sizefrom15pxto17px, 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 anyattrs123shorthands) - 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
DataInstDeffields (kindandoutput_type) toDataInstForm, a new interned type - PR#30 replaced the old
spv-lower-dumpexample (which only dumped plaintext, not HTML) with a more usefulspv-lower-printone
- PR#34 fixed
OpTypePointers being spuriously printed as dependencies ofGlobalVarDecl/PtrToGlobalVar(neither of which actually print the pointer type), and added a CI check forREADME.mdexamples - 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 to120columns - PR#27 fixed some pretty-printing issues
in the initial
Attr::Diagnosticsimplementation (BUGpaths 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
DiagandAttr::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
OpEmitMeshTasksEXTas 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.