@@ -352,9 +352,9 @@ class SPIRVInstructionSelector : public InstructionSelector {
352352 SPIRVType *widenTypeToVec4 (const SPIRVType *Type, MachineInstr &I) const ;
353353 bool extractSubvector (Register &ResVReg, const SPIRVType *ResType,
354354 Register &ReadReg, MachineInstr &InsertionPoint) const ;
355- bool generateImageRead (Register &ResVReg, const SPIRVType *ResType,
356- Register ImageReg, Register IdxReg, DebugLoc Loc ,
357- MachineInstr &Pos) const ;
355+ bool generateImageReadOrFetch (Register &ResVReg, const SPIRVType *ResType,
356+ Register ImageReg, Register IdxReg,
357+ DebugLoc Loc, MachineInstr &Pos) const ;
358358 bool BuildCOPY (Register DestReg, Register SrcReg, MachineInstr &I) const ;
359359 bool loadVec3BuiltinInputID (SPIRV::BuiltIn::BuiltIn BuiltInValue,
360360 Register ResVReg, const SPIRVType *ResType,
@@ -1317,8 +1317,8 @@ bool SPIRVInstructionSelector::selectLoad(Register ResVReg,
13171317 }
13181318
13191319 Register IdxReg = IntPtrDef->getOperand (3 ).getReg ();
1320- return generateImageRead (ResVReg, ResType, NewHandleReg, IdxReg,
1321- I.getDebugLoc (), I);
1320+ return generateImageReadOrFetch (ResVReg, ResType, NewHandleReg, IdxReg,
1321+ I.getDebugLoc (), I);
13221322 }
13231323 }
13241324
@@ -3633,27 +3633,32 @@ bool SPIRVInstructionSelector::selectReadImageIntrinsic(
36333633 DebugLoc Loc = I.getDebugLoc ();
36343634 MachineInstr &Pos = I;
36353635
3636- return generateImageRead (ResVReg, ResType, NewImageReg, IdxReg, Loc, Pos);
3636+ return generateImageReadOrFetch (ResVReg, ResType, NewImageReg, IdxReg, Loc,
3637+ Pos);
36373638}
36383639
3639- bool SPIRVInstructionSelector::generateImageRead (Register &ResVReg,
3640- const SPIRVType *ResType,
3641- Register ImageReg,
3642- Register IdxReg, DebugLoc Loc,
3643- MachineInstr &Pos) const {
3640+ bool SPIRVInstructionSelector::generateImageReadOrFetch (
3641+ Register &ResVReg, const SPIRVType *ResType, Register ImageReg,
3642+ Register IdxReg, DebugLoc Loc, MachineInstr &Pos) const {
36443643 SPIRVType *ImageType = GR.getSPIRVTypeForVReg (ImageReg);
36453644 assert (ImageType && ImageType->getOpcode () == SPIRV::OpTypeImage &&
36463645 " ImageReg is not an image type." );
3646+
36473647 bool IsSignedInteger =
36483648 sampledTypeIsSignedInteger (GR.getTypeForSPIRVType (ImageType));
3649+ // Check if the "sampled" operand of the image type is 2.
3650+ auto SampledOp = ImageType->getOperand (6 );
3651+ bool IsFetch = (SampledOp.getImm () != 2 );
36493652
36503653 uint64_t ResultSize = GR.getScalarOrVectorComponentCount (ResType);
36513654 if (ResultSize == 4 ) {
3652- auto BMI = BuildMI (*Pos.getParent (), Pos, Loc, TII.get (SPIRV::OpImageRead))
3653- .addDef (ResVReg)
3654- .addUse (GR.getSPIRVTypeID (ResType))
3655- .addUse (ImageReg)
3656- .addUse (IdxReg);
3655+ auto BMI =
3656+ BuildMI (*Pos.getParent (), Pos, Loc,
3657+ TII.get (IsFetch ? SPIRV::OpImageFetch : SPIRV::OpImageRead))
3658+ .addDef (ResVReg)
3659+ .addUse (GR.getSPIRVTypeID (ResType))
3660+ .addUse (ImageReg)
3661+ .addUse (IdxReg);
36573662
36583663 if (IsSignedInteger)
36593664 BMI.addImm (0x1000 ); // SignExtend
@@ -3662,11 +3667,13 @@ bool SPIRVInstructionSelector::generateImageRead(Register &ResVReg,
36623667
36633668 SPIRVType *ReadType = widenTypeToVec4 (ResType, Pos);
36643669 Register ReadReg = MRI->createVirtualRegister (GR.getRegClass (ReadType));
3665- auto BMI = BuildMI (*Pos.getParent (), Pos, Loc, TII.get (SPIRV::OpImageRead))
3666- .addDef (ReadReg)
3667- .addUse (GR.getSPIRVTypeID (ReadType))
3668- .addUse (ImageReg)
3669- .addUse (IdxReg);
3670+ auto BMI =
3671+ BuildMI (*Pos.getParent (), Pos, Loc,
3672+ TII.get (IsFetch ? SPIRV::OpImageFetch : SPIRV::OpImageRead))
3673+ .addDef (ReadReg)
3674+ .addUse (GR.getSPIRVTypeID (ReadType))
3675+ .addUse (ImageReg)
3676+ .addUse (IdxReg);
36703677 if (IsSignedInteger)
36713678 BMI.addImm (0x1000 ); // SignExtend
36723679 bool Succeed = BMI.constrainAllUses (TII, TRI, RBI);
0 commit comments