[SPIR-V] Add descriptor heap -fvk-resource-heap-stride / -fvk-sampler-heap-stride CLI flags - #8519
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. |
CapabilityVisitor::visitInstructionAllTypes was dropping the bool return of requestTargetEnv, so a vk<1.3 target-env would emit the diagnostic but keep lowering. Added sm6_6.descriptorheap.ext.targetenv.error.hlsl to cover rejection of -fspv-use-descriptor-heap with -fspv-target-env=vulkan1.2.
Extends the SPV_EXT_descriptor_heap native heap lowering to cover RaytracingAccelerationStructure resources loaded from ResourceDescriptorHeap. Acceleration structure descriptors are accessed via OpUntypedAccessChainKHR into a runtime array of OpTypeAccelerationStructureKHR, consistent with the image and sampler paths added in the previous commit.
Extends the SPV_EXT_descriptor_heap native heap lowering to cover RaytracingAccelerationStructure resources loaded from ResourceDescriptorHeap. Acceleration structure descriptors are accessed via OpUntypedAccessChainKHR into a runtime array of OpTypeAccelerationStructureKHR, consistent with the image and sampler paths added in the previous commit.
4ada70b to
ae2a006
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 64 out of 64 changed files in this pull request and generated 2 comments.
Suppressed comments (2)
lib/DxcSupport/HLSLOptions.cpp:1221
- When both flags are invalid, these two handlers write to the same stream without a separator, producing a merged diagnostic such as
...got 48-fvk-sampler-heap-stride.... Insert a newline before reporting the sampler error when the resource validation already failed so the promised two diagnostics remain readable.
bool strideOk = true;
strideOk &= handleHeapStride(Args, OPT_fvk_resource_heap_stride,
&opts.SpirvOptions.resourceHeapStride,
"-fvk-resource-heap-stride", errors);
strideOk &= handleHeapStride(Args, OPT_fvk_sampler_heap_stride,
&opts.SpirvOptions.samplerHeapStride,
"-fvk-sampler-heap-stride", errors);
tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.ext.stride-cli-permute.hlsl:2
- Every positive RUN sets both overrides, so the documented independent fallback behavior is not covered: resource-only should retain
ArrayStrideIdEXTfor samplers, and sampler-only should retain it for resources. Add those two cases; the full cross-product cannot catch accidentally suppressing the default stride for the unconfigured heap.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 64 out of 64 changed files in this pull request and generated 2 comments.
Suppressed comments (1)
tools/clang/lib/SPIRV/SpirvEmitter.cpp:3075
- Direct buffer heap expressions bypass the new alias-only rejection. For example, returning
ResourceDescriptorHeap[i]from a function whose result isStructuredBufferenters this branch, thenloadIfGLValueloads the whole buffer resource through theOpBufferPointerEXTpointer—the same invalid SPIR-V that lines 3077–3083 describe for an alias. Reject direct buffer-like heap returns before lowering them as well.
const Expr *parentExpr = cast<CastExpr>(parentMap->getParent(srcExpr));
QualType resourceType = parentExpr->getType();
const auto *declRefExpr = dyn_cast<DeclRefExpr>(base->IgnoreCasts());
declIdMapper.createResourceHeap(cast<VarDecl>(declRefExpr->getDecl()),
resourceType);
| SpirvInstruction *argInfo = nullptr; | ||
| if (const auto *declRefExpr = dyn_cast<DeclRefExpr>(arg)) { |
| bool strideOk = true; | ||
| strideOk &= handleHeapStride(Args, OPT_fvk_resource_heap_stride, | ||
| &opts.SpirvOptions.resourceHeapStride, | ||
| "-fvk-resource-heap-stride", errors); | ||
| strideOk &= handleHeapStride(Args, OPT_fvk_sampler_heap_stride, | ||
| &opts.SpirvOptions.samplerHeapStride, | ||
| "-fvk-sampler-heap-stride", errors); | ||
| if (!strideOk) | ||
| return 1; |
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)