[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,
----------------
VyacheslavLevytskyy wrote:
Variable names should start with an upper case letter (https://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly).
https://github.com/llvm/llvm-project/pull/111564
More information about the llvm-commits
mailing list