Repository navigation
[SPIR-V] Add descriptor heap -fvk-resource-heap-stride / -fvk-sampler-heap-stride CLI flags - #8519
Jonathan Zakharov (jzakharovnv) wants to merge 12 commits into
Conversation
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
1e2a278 to
5e7b928
Compare
|
@microsoft-github-policy-service agree company="NVIDIA" |
9c5badc to
ff7bb88
Compare
d2c47bb to
9f55ccb
Compare
6bc5a9e to
c69d8a0
Compare
Diego Novillo (dnovillo)
left a comment
There was a problem hiding this comment.
Thanks for the fixes. LGTM now.
2feca89 to
7edda02
Compare
|
7edda02 to
5783deb
Compare
There was a problem hiding this comment.
Pull request overview
Adds configurable resource and sampler descriptor-heap strides while expanding native SPV_EXT_descriptor_heap lowering.
Changes:
- Adds and validates the two stride CLI options.
- Supports literal and computed descriptor-array strides, including acceleration structures.
- Expands documentation and SPIR-V regression coverage.
Reviewed changes
Copilot reviewed 57 out of 57 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
tools/clang/unittests/SPIRV/SpirvContextTest.cpp |
Tests runtime-array uniquing. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.typed-formats.hlsl |
Tests typed image formats. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.texturecube.hlsl |
Tests cube textures. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.texture.hlsl |
Tests buffer textures. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.texture-sampler-assignment.hlsl |
Tests texture/sampler reassignment. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.texture-ms.hlsl |
Tests multisampled textures. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.texture-dims.hlsl |
Tests sampled texture dimensions. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.structured-buffer-atomic.hlsl |
Tests structured-buffer atomics. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.stride-cli.hlsl |
Tests literal CLI strides. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.stride-cli-permute.hlsl |
Tests stride values and validation. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.static-global.hlsl |
Tests static resource aliases. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.sampler-comparison.hlsl |
Tests comparison samplers. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.sample-grad-bias.hlsl |
Tests gradient and bias sampling. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.rwtexture-dims.hlsl |
Tests storage texture dimensions. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.rwtexture-atomics.hlsl |
Tests untyped image atomics. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.rwbyteaddressbuffer.hlsl |
Tests writable byte buffers. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.nonuniform.hlsl |
Tests divergent heap indexing. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.mixed-bound.hlsl |
Tests bound/heap coexistence. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.mixed-alias.error.hlsl |
Tests mixed-alias diagnostics. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.load-offset.hlsl |
Tests texture-load offsets. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.groupshared.hlsl |
Tests groupshared interoperability. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.gather.hlsl |
Tests texture gathers. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.function-params.hlsl |
Tests resource parameters. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.discarded.error.hlsl |
Tests discarded-access diagnostics. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.counter-ops.error.hlsl |
Tests unsupported counter diagnostics. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.constant-texture-buffer.hlsl |
Tests constant/texture buffers. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.constant-buffer-assignment.hlsl |
Tests constant-buffer reassignment. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.buffer.hlsl |
Tests buffer heap lowering. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.array-stride.hlsl |
Tests computed default strides. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.array-stride.accelstruct.hlsl |
Tests acceleration-structure strides. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.append-consume.error.hlsl |
Tests append/consume diagnostics. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.acceleration-structure.stride.error.hlsl |
Tests acceleration-stride errors. |
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.acceleration-structure.hlsl |
Tests acceleration-structure loads. |
tools/clang/test/CodeGenSPIRV/resource-heap-ext-texture.hlsl |
Removes superseded coverage. |
tools/clang/lib/SPIRV/SpirvType.cpp |
Includes stride IDs in type equality. |
tools/clang/lib/SPIRV/SpirvInstruction.cpp |
Implements new SPIR-V instructions. |
tools/clang/lib/SPIRV/SpirvEmitter.h |
Declares descriptor-heap helpers/state. |
tools/clang/lib/SPIRV/SpirvEmitter.cpp |
Implements native heap lowering and strides. |
tools/clang/lib/SPIRV/SpirvContext.cpp |
Uniques extended descriptor types. |
tools/clang/lib/SPIRV/SpirvBuilder.cpp |
Builds computed heap strides. |
tools/clang/lib/SPIRV/LowerTypeVisitor.cpp |
Lowers untyped image pointers. |
tools/clang/lib/SPIRV/EmitVisitor.h |
Declares new emission handlers. |
tools/clang/lib/SPIRV/EmitVisitor.cpp |
Emits new types, constants, and decorations. |
tools/clang/lib/SPIRV/DeclResultIdMapper.h |
Declares function alias support. |
tools/clang/lib/SPIRV/DeclResultIdMapper.cpp |
Implements function aliases. |
tools/clang/lib/SPIRV/CapabilityVisitor.cpp |
Requires Vulkan 1.3 for native heaps. |
tools/clang/lib/SPIRV/AstTypeProbe.cpp |
Detects acceleration structures. |
tools/clang/include/clang/SPIRV/SpirvVisitor.h |
Extends visitor dispatch. |
tools/clang/include/clang/SPIRV/SpirvType.h |
Stores runtime-array stride IDs. |
tools/clang/include/clang/SPIRV/SpirvInstruction.h |
Defines new instruction classes. |
tools/clang/include/clang/SPIRV/SpirvContext.h |
Exposes extended type uniquing. |
tools/clang/include/clang/SPIRV/SpirvBuilder.h |
Exposes stride construction APIs. |
tools/clang/include/clang/SPIRV/AstTypeProbe.h |
Declares acceleration-type detection. |
lib/DxcSupport/HLSLOptions.cpp |
Parses and validates stride options. |
include/dxc/Support/SPIRVOptions.h |
Stores stride overrides. |
include/dxc/Support/HLSLOptions.td |
Defines the CLI flags. |
docs/SPIR-V.rst |
Documents native heaps and strides. |
There was a problem hiding this comment.
🟡 Changes recommended
Image atomic lowering now reverses base and coordinate evaluation order, potentially changing shaders with side effects.
Get a fresh assessment by requesting another Copilot review.
Review details
Suppressed comments (1)
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.array-stride.hlsl:62
- Use the possessive “its” here.
- Files reviewed: 64/64 changed files
- Comments generated: 1
- Review effort level: Balanced
6f3d049 to
9692e4e
Compare
There was a problem hiding this comment.
🟡 Changes recommended
Passing a heap-initialized acceleration structure to an out/inout helper can bypass reassignment diagnostics and leave later traces using the original heap handle after reassignment.
8 open issues
This now evaluates the coordinate expression before the image/base expression. The previous path… IncludingSPV_NV_ray_tracinghere makes every native-heap shader build an acceleration-structure… Writable helper arguments bypass heap resource reassignment diagnostics · New The fallback chooses the stride from the element type instead of the heap selected by… These stride values are consumed only by the native-fspv-use-descriptor-heappath, but option… The guard only recognizes a local aliasDeclRefExpr, so a direct argument such as… Test does not exercise the resource heap stride exemption · New For append/consume declarations, the firstdoExpremits the unsupported-resource error and…
4 resolved since last review
The definition no longer matches the new two-argument declaration or either call site, so this… This guard only catches a heap buffer after it has been assigned to aDeclRefExpralias. Passing… For an acceleration-structure alias, this condition is true for every reassignment, including… This overstates the implementation: buffer aliases are re-derived from the saved index on every…
Review effort: Balanced
There was a problem hiding this comment.
🔵 Needs a closer look
Acceleration-structure aliases passed to out/inout helpers can silently lose updates, leaving subsequent ray queries using stale handles; this path needs a fix and regression coverage.
3 open issues
5 resolved since last review
This now evaluates the coordinate expression before the image/base expression. The previous path… IncludingSPV_NV_ray_tracinghere makes every native-heap shader build an acceleration-structure… The fallback chooses the stride from the element type instead of the heap selected by… These stride values are consumed only by the native-fspv-use-descriptor-heappath, but option… The guard only recognizes a local aliasDeclRefExpr, so a direct argument such as…
Review effort: Balanced
33ef0bc to
bc9aec9
Compare
…CLI stride support
Gregory Roth (pow2clk)
left a comment
There was a problem hiding this comment.
It looks good overall! I'd like to understand the need for the new onSamplerHeap parameter before I sign off.
The copy editing suggestions are purely optional.
| descriptors; otherwise compilation fails, unless `-fvk-resource-heap-stride` | ||
| is given. |
There was a problem hiding this comment.
I'm not actually suggesting these just get deleted, but these would be replaced by my suggestion above
| descriptors; otherwise compilation fails, unless `-fvk-resource-heap-stride` | |
| is given. |



Building off of #8518, this PR adds two new command-line flags that override the ArrayStride of the descriptor heap runtime arrays emitted by -fspv-use-descriptor-heap. It is part 3/4 in a series.
-fvk-resource-heap-stride and -fvk-sampler-heap-stride sets the stride for ResourceDescriptorHeap SamplerDescriptorHeap arrays respectively. N and M must be a power of two in [8, 256]. When set, the CLI value takes the highest precedence.
Assisted by an AI agent.
Diego Novillo (@dnovillo)