summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-12-13 12:24:27 -0800
committerGitHub <noreply@github.com>2023-12-13 12:24:27 -0800
commit1406aa2bc9e398e5e5565ba9c6adbb780c29fee1 (patch)
treeab284f85a72d77db7462d3f38a272a3966ed7c83 /source
parent6cbe215e58eeb8edc53d71e8f315e2fb55c0eeee (diff)
Add spirv intrinsics for `ConstBufferPointer`. (#3407)
Fixes #3305. Fixes #3404. Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source')
-rw-r--r--source/slang/hlsl.meta.slang34
-rw-r--r--source/slang/slang-emit-spirv.cpp15
2 files changed, 45 insertions, 4 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 477e0cfaf..39ed13488 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -12546,7 +12546,37 @@ struct ConstBufferPointer
{
__glsl_version(450)
__glsl_extension(GL_EXT_buffer_reference)
- __target_intrinsic(glsl, "$0._data")
[__NoSideEffect]
- T get();
+ T get()
+ {
+ __target_switch
+ {
+ case glsl:
+ __intrinsic_asm "$0._data";
+ case spirv:
+ return spirv_asm {
+ result:$$T = OpLoad $this Aligned $Alignment;
+ };
+ }
+ }
+
+ __glsl_version(450)
+ __glsl_extension(GL_EXT_shader_explicit_arithmetic_types_int64)
+ __glsl_extension(GL_EXT_buffer_reference)
+ [__NoSideEffect]
+ [ForceInline]
+ bool isValid()
+ {
+ __target_switch
+ {
+ case glsl:
+ __intrinsic_asm "(uint64_t($0) != 0)";
+ case spirv:
+ uint64_t zero = 0ULL;
+ return spirv_asm {
+ %ptrval:$$uint64_t = OpConvertPtrToU $this;
+ result:$$bool = OpINotEqual %ptrval $zero;
+ };
+ }
+ }
}
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index d071328c4..5939754e0 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -429,6 +429,8 @@ struct SPIRVEmitContext
/// The next destination `<id>` to allocate.
SpvWord m_nextID = 1;
+ SpvAddressingModel m_addressingMode = SpvAddressingModelLogical;
+
// We will store the logical sections of the SPIR-V module
// in a single array so that we can easily look up a
// section by its `SpvLogicalSectionID`.
@@ -1200,7 +1202,7 @@ struct SPIRVEmitContext
emitOpMemoryModel(
getSection(SpvLogicalSectionID::MemoryModel),
nullptr,
- SpvAddressingModelLogical,
+ m_addressingMode,
SpvMemoryModelGLSL450
);
}
@@ -1394,6 +1396,14 @@ struct SPIRVEmitContext
requireSPIRVCapability(SpvCapabilityShaderInvocationReorderNV);
return emitOpTypeHitObject(inst);
+ case kIROp_HLSLConstBufferPointerType:
+ ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_variable_pointers"));
+ requireSPIRVCapability(SpvCapabilityVariablePointers);
+ ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_physical_storage_buffer"));
+ requireSPIRVCapability(SpvCapabilityPhysicalStorageBufferAddresses);
+ m_addressingMode = SpvAddressingModelPhysicalStorageBuffer64;
+ return emitOpTypePointer(inst, SpvStorageClassPhysicalStorageBuffer, inst->getOperand(0));
+
case kIROp_FuncType:
// > OpTypeFunction
//
@@ -4908,7 +4918,6 @@ SlangResult emitSPIRVFromIR(
}
#endif
- context.emitFrontMatter();
for (auto inst : irModule->getGlobalInsts())
{
if (as<IRDebugSource>(inst))
@@ -4925,6 +4934,8 @@ SlangResult emitSPIRVFromIR(
{
context.ensureInst(irEntryPoint);
}
+ context.emitFrontMatter();
+
context.emitPhysicalLayout();
spirvOut.addRange(