@@ -1043,6 +1043,37 @@ static bool buildExtendedBitOpsInst(const SPIRV::IncomingCall *Call,
10431043 return true ;
10441044}
10451045
1046+ // / Helper function for building Intel's bindless image instructions.
1047+ static bool buildBindlessImageINTELInst (const SPIRV::IncomingCall *Call,
1048+ unsigned Opcode,
1049+ MachineIRBuilder &MIRBuilder,
1050+ SPIRVGlobalRegistry *GR) {
1051+ const SPIRV::DemangledBuiltin *Builtin = Call->Builtin ;
1052+ const auto *ST =
1053+ static_cast <const SPIRVSubtarget *>(&MIRBuilder.getMF ().getSubtarget ());
1054+ if ((Opcode == SPIRV::OpConvertHandleToImageINTEL ||
1055+ Opcode == SPIRV::OpConvertHandleToSamplerINTEL ||
1056+ Opcode == SPIRV::OpConvertHandleToSampledImageINTEL) &&
1057+ !ST->canUseExtension (SPIRV::Extension::SPV_INTEL_bindless_images)) {
1058+ std::string DiagMsg = std::string (Builtin->Name ) +
1059+ " : the builtin requires the following SPIR-V "
1060+ " extension: SPV_INTEL_bindless_images" ;
1061+ report_fatal_error (DiagMsg.c_str (), false );
1062+ }
1063+
1064+ // Generate SPIRV instruction accordingly.
1065+ if (Call->isSpirvOp ())
1066+ return buildOpFromWrapper (MIRBuilder, Opcode, Call,
1067+ GR->getSPIRVTypeID (Call->ReturnType ));
1068+
1069+ auto MIB = MIRBuilder.buildInstr (Opcode)
1070+ .addDef (Call->ReturnRegister )
1071+ .addUse (GR->getSPIRVTypeID (Call->ReturnType ));
1072+ MIB.addUse (Call->Arguments [0 ]);
1073+
1074+ return true ;
1075+ }
1076+
10461077static unsigned getNumComponentsForDim (SPIRV::Dim::Dim dim) {
10471078 switch (dim) {
10481079 case SPIRV::Dim::DIM_1D:
@@ -2232,6 +2263,17 @@ static bool generateExtendedBitOpsInst(const SPIRV::IncomingCall *Call,
22322263 return buildExtendedBitOpsInst (Call, Opcode, MIRBuilder, GR);
22332264}
22342265
2266+ static bool generateBindlessImageINTELInst (const SPIRV::IncomingCall *Call,
2267+ MachineIRBuilder &MIRBuilder,
2268+ SPIRVGlobalRegistry *GR) {
2269+ // Lookup the instruction opcode in the TableGen records.
2270+ const SPIRV::DemangledBuiltin *Builtin = Call->Builtin ;
2271+ unsigned Opcode =
2272+ SPIRV::lookupNativeBuiltin (Builtin->Name , Builtin->Set )->Opcode ;
2273+
2274+ return buildBindlessImageINTELInst (Call, Opcode, MIRBuilder, GR);
2275+ }
2276+
22352277static bool buildNDRange (const SPIRV::IncomingCall *Call,
22362278 MachineIRBuilder &MIRBuilder,
22372279 SPIRVGlobalRegistry *GR) {
@@ -2809,6 +2851,8 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
28092851 return generateCoopMatrInst (Call.get (), MIRBuilder, GR);
28102852 case SPIRV::ExtendedBitOps:
28112853 return generateExtendedBitOpsInst (Call.get (), MIRBuilder, GR);
2854+ case SPIRV::BindlessINTEL:
2855+ return generateBindlessImageINTELInst (Call.get (), MIRBuilder, GR);
28122856 }
28132857 return false ;
28142858}
0 commit comments