[llvm] [HLSL][SPIR-V] Add SV_DispatchThreadID semantic support (PR #82536)
Nathan Gauër via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 22 07:13:55 PST 2024
================
@@ -1660,6 +1667,68 @@ bool SPIRVInstructionSelector::selectLog10(Register ResVReg,
return Result;
}
+bool SPIRVInstructionSelector::selectDXThreadId(Register ResVReg,
+ const SPIRVType *ResType,
+ MachineInstr &I) const {
+ // DX intrinsic: @llvm.dx.thread.id(i32)
+ // ID Name Description
+ // 93 ThreadId reads the thread ID
+
+ MachineIRBuilder MIRBuilder(I);
+ const SPIRVType *U32Type = GR.getOrCreateSPIRVIntegerType(32, MIRBuilder);
+ const SPIRVType *Vec3Ty =
+ GR.getOrCreateSPIRVVectorType(U32Type, 3, MIRBuilder);
+ const SPIRVType *PtrType = GR.getOrCreateSPIRVPointerType(
+ Vec3Ty, MIRBuilder, SPIRV::StorageClass::Input);
+
+ // Create new register for GlobalInvocationID builtin variable.
+ Register NewRegister =
+ MIRBuilder.getMRI()->createVirtualRegister(&SPIRV::IDRegClass);
+ MIRBuilder.getMRI()->setType(NewRegister, LLT::pointer(0, 32));
+ GR.assignSPIRVTypeToVReg(PtrType, NewRegister, MIRBuilder.getMF());
+
+ // Build GlobalInvocationID global variable with the necessary decorations.
+ Register Variable = GR.buildGlobalVariable(
+ NewRegister, PtrType,
+ getLinkStringForBuiltIn(SPIRV::BuiltIn::GlobalInvocationId), nullptr,
+ SPIRV::StorageClass::Input, nullptr, true, true,
+ SPIRV::LinkageType::Import, MIRBuilder, false);
+
+ // Create new register for loading value.
+ MachineRegisterInfo *MRI = MIRBuilder.getMRI();
+ Register LoadedRegister = MRI->createVirtualRegister(&SPIRV::IDRegClass);
+ MIRBuilder.getMRI()->setType(LoadedRegister, LLT::pointer(0, 32));
+ GR.assignSPIRVTypeToVReg(Vec3Ty, LoadedRegister, MIRBuilder.getMF());
+
+ // Load v3uint value from the global variable.
+ BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpLoad))
+ .addDef(LoadedRegister)
+ .addUse(GR.getSPIRVTypeID(Vec3Ty))
+ .addUse(Variable);
----------------
Keenuts wrote:
Shall this be moved inside a function to be reused for other intrinsics what are fetched from an Input variable in SPIR-V?
Maybe a function like:
```cpp
MachineInstruction* getSPIRVBuiltInValue(SPIRVType *valueType, SPIRV::BuiltIn builtIn);
[...]
MI = getSPIRVBuiltInValue(Vec3Ty, SPIRV::BuiltIn::GlobalInvocationId);
```
https://github.com/llvm/llvm-project/pull/82536
More information about the llvm-commits
mailing list