diff options
| author | Jay Kwak <82421531+jkwak-work@users.noreply.github.com> | 2025-01-09 20:49:25 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-09 20:49:25 -0800 |
| commit | 55ff4686e5685c414d82f16b9c1a4a331bd4f853 (patch) | |
| tree | 3ac28ec249ad345417b04247ea2d17d03adbd9b1 /source/slang/slang-emit-spirv.cpp | |
| parent | fce63c2c550b8715e347a44b1d874f48157543d3 (diff) | |
Support a storage class, NodePayloadAMDX, for SPIRV work-graphs (#6052)
In order to unblock experiments with SPIRV work-graphs, Slang
needs to support the storage class, `NodePayloadAMDX`.
Note that this commit is only to support a storage class,
`NodePayloadAMDX`. There are many parts required for work-graphs
hasn't been implemented yet.
The implementation of `DispatchNodeInputRecord` is not required, but it
is implemented mostly for a testing purpose.
Closes #6049
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-emit-spirv.cpp')
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index d8c479cd1..1407404ad 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -1311,6 +1311,8 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex return SpvStorageClassImage; case AddressSpace::UserPointer: return SpvStorageClassPhysicalStorageBuffer; + case AddressSpace::NodePayloadAMDX: + return SpvStorageClassNodePayloadAMDX; case AddressSpace::Global: case AddressSpace::MetalObjectData: case AddressSpace::SpecializationConstant: @@ -1504,13 +1506,22 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex SLANG_ASSERT(ptrType); if (ptrType->hasAddressSpace()) storageClass = addressSpaceToStorageClass(ptrType->getAddressSpace()); - if (storageClass == SpvStorageClassStorageBuffer) + + switch (storageClass) + { + case SpvStorageClassStorageBuffer: ensureExtensionDeclaration( UnownedStringSlice("SPV_KHR_storage_buffer_storage_class")); - if (storageClass == SpvStorageClassPhysicalStorageBuffer) - { + break; + case SpvStorageClassPhysicalStorageBuffer: requirePhysicalStorageAddressing(); + break; + case SpvStorageClassNodePayloadAMDX: + requireSPIRVCapability(SpvCapabilityShaderEnqueueAMDX); + ensureExtensionDeclaration(UnownedStringSlice("SPV_AMDX_shader_enqueue")); + break; } + auto valueType = ptrType->getValueType(); // If we haven't emitted the inner type yet, we need to emit a forward declaration. bool useForwardDeclaration = @@ -1524,17 +1535,20 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex builder.setInsertBefore(valueType); valueTypeId = getID(ensureInst(builder.getUIntType())); } + else if (useForwardDeclaration) + { + valueTypeId = getIRInstSpvID(valueType); + } + else if (storageClass == SpvStorageClassNodePayloadAMDX) + { + auto spvValueType = ensureInst(valueType); + auto spvNodePayloadType = emitOpTypeNodePayloadArray(inst, spvValueType); + valueTypeId = getID(spvNodePayloadType); + } else { - if (useForwardDeclaration) - { - valueTypeId = getIRInstSpvID(valueType); - } - else - { - auto spvValueType = ensureInst(valueType); - valueTypeId = getID(spvValueType); - } + auto spvValueType = ensureInst(valueType); + valueTypeId = getID(spvValueType); } auto resultSpvType = emitOpTypePointer(inst, storageClass, valueTypeId); @@ -7564,6 +7578,8 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex case SpvOpMemberDecorate: case SpvOpMemberDecorateString: return getSection(SpvLogicalSectionID::Annotations); + case SpvOpTypeNodePayloadArrayAMDX: + return getSection(SpvLogicalSectionID::ConstantsAndTypes); default: return defaultParent; } |
