[llvm] [SPIRV][HLSL] Handle arrays of resources (PR #111564)
Vyacheslav Levytskyy via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 28 10:54:12 PDT 2024
================
@@ -848,6 +870,134 @@ static void AddAtomicFloatRequirements(const MachineInstr &MI,
}
}
+bool isUniformTexelBuffer(MachineInstr *ImageInst) {
+ if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
+ return false;
+ uint32_t Dim = ImageInst->getOperand(2).getImm();
+ uint32_t Sampled = ImageInst->getOperand(6).getImm();
+ return Dim == SPIRV::Dim::DIM_Buffer && Sampled == 1;
+}
+
+bool isStorageTexelBuffer(MachineInstr *ImageInst) {
+ if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
+ return false;
+ uint32_t Dim = ImageInst->getOperand(2).getImm();
+ uint32_t Sampled = ImageInst->getOperand(6).getImm();
+ return Dim == SPIRV::Dim::DIM_Buffer && Sampled == 2;
+}
+
+bool isSampledImage(MachineInstr *ImageInst) {
+ if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
+ return false;
+ uint32_t Dim = ImageInst->getOperand(2).getImm();
+ uint32_t Sampled = ImageInst->getOperand(6).getImm();
+ return Dim != SPIRV::Dim::DIM_Buffer && Sampled == 1;
+}
+
+bool isInputAttachment(MachineInstr *ImageInst) {
+ if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
+ return false;
+ uint32_t Dim = ImageInst->getOperand(2).getImm();
+ uint32_t Sampled = ImageInst->getOperand(6).getImm();
+ return Dim == SPIRV::Dim::DIM_SubpassData && Sampled == 2;
+}
+
+bool isStorageImage(MachineInstr *ImageInst) {
+ if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
+ return false;
+ uint32_t Dim = ImageInst->getOperand(2).getImm();
+ uint32_t Sampled = ImageInst->getOperand(6).getImm();
+ return Dim != SPIRV::Dim::DIM_Buffer && Sampled == 2;
+}
+
+bool isCombinedImageSampler(MachineInstr *SampledImageInst) {
+ if (SampledImageInst->getOpcode() != SPIRV::OpTypeSampledImage)
+ return false;
+
+ const MachineRegisterInfo &MRI = SampledImageInst->getMF()->getRegInfo();
+ Register ImageReg = SampledImageInst->getOperand(1).getReg();
+ auto *ImageInst = MRI.getUniqueVRegDef(ImageReg);
+ return isSampledImage(ImageInst);
+}
+
+bool hasNonUniformDecoration(Register Reg, const MachineRegisterInfo &MRI) {
+ for (const auto &MI : MRI.reg_instructions(Reg)) {
+ if (MI.getOpcode() != SPIRV::OpDecorate)
+ continue;
+
+ uint32_t Dec = MI.getOperand(1).getImm();
+ if (Dec == SPIRV::Decoration::NonUniformEXT)
+ return true;
+ }
+ return false;
+}
+void addOpAccessChainReqs(const MachineInstr &instr,
+ SPIRV::RequirementHandler &handler,
+ const SPIRVSubtarget &subtarget) {
+ const MachineRegisterInfo &MRI = instr.getMF()->getRegInfo();
+ // Get the result type. If it is an image type, then the shader uses
+ // descriptor indexing. The appropriate capabilities will be added based
+ // on the specifics of the image.
+ Register ResTypeReg = instr.getOperand(1).getReg();
+ MachineInstr *ResTypeInst = MRI.getUniqueVRegDef(ResTypeReg);
+
+ assert(ResTypeInst->getOpcode() == SPIRV::OpTypePointer);
+ uint32_t StorageClass = ResTypeInst->getOperand(1).getImm();
+ if (StorageClass != SPIRV::StorageClass::StorageClass::UniformConstant &&
+ StorageClass != SPIRV::StorageClass::StorageClass::Uniform &&
+ StorageClass != SPIRV::StorageClass::StorageClass::StorageBuffer) {
----------------
VyacheslavLevytskyy wrote:
It's nit-picking of course, but here you insert `{ return; }` and in the next if it's just `return;` without `{}`. My perfectionist soul just can't stand it))
https://github.com/llvm/llvm-project/pull/111564
More information about the llvm-commits
mailing list