From 1406aa2bc9e398e5e5565ba9c6adbb780c29fee1 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 13 Dec 2023 12:24:27 -0800 Subject: Add spirv intrinsics for `ConstBufferPointer`. (#3407) Fixes #3305. Fixes #3404. Co-authored-by: Yong He --- source/slang/hlsl.meta.slang | 34 ++++++++++++++++++++++++++++++++-- source/slang/slang-emit-spirv.cpp | 15 +++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) (limited to 'source') 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 `` 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(inst)) @@ -4925,6 +4934,8 @@ SlangResult emitSPIRVFromIR( { context.ensureInst(irEntryPoint); } + context.emitFrontMatter(); + context.emitPhysicalLayout(); spirvOut.addRange( -- cgit v1.2.3