Skip to content

Commit b6c8dba

Browse files
[Backport to 18] Add updated SPV_INTEL_bindless_images preview extension (#2559) (#3009)
The updated SPV_INTEL_bindless_images spec can be seen in this PR: intel/llvm#13753
1 parent d8fe736 commit b6c8dba

File tree

11 files changed

+41
-3
lines changed

11 files changed

+41
-3
lines changed

lib/SPIRV/OCLTypeToSPIRV.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,12 @@ void OCLTypeToSPIRVBase::adaptArgumentsBySamplerUse(Module &M) {
195195
StringRef DemangledName;
196196
if (!oclIsBuiltin(MangledName, DemangledName, false))
197197
continue;
198-
if (DemangledName.find(kSPIRVName::SampledImage) == std::string::npos)
198+
// Note: kSPIRVName::ConvertHandleToSampledImageINTEL contains
199+
// kSPIRVName::SampledImage as a substring, but we still want to continue in
200+
// this case.
201+
if (DemangledName.find(kSPIRVName::SampledImage) == std::string::npos ||
202+
DemangledName.find(kSPIRVName::ConvertHandleToSampledImageINTEL) !=
203+
std::string::npos)
199204
continue;
200205

201206
TraceArg(&F, 1);

lib/SPIRV/SPIRVInternal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,10 @@ const static char TranslateSPIRVMemOrder[] = "__translate_spirv_memory_order";
369369
const static char TranslateSPIRVMemScope[] = "__translate_spirv_memory_scope";
370370
const static char TranslateSPIRVMemFence[] = "__translate_spirv_memory_fence";
371371
const static char EntrypointPrefix[] = "__spirv_entry_";
372+
const static char ConvertHandleToImageINTEL[] = "ConvertHandleToImageINTEL";
373+
const static char ConvertHandleToSamplerINTEL[] = "ConvertHandleToSamplerINTEL";
374+
const static char ConvertHandleToSampledImageINTEL[] =
375+
"ConvertHandleToSampledImageINTEL";
372376
} // namespace kSPIRVName
373377

374378
namespace kSPIRVPostfix {

lib/SPIRV/SPIRVUtil.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2454,6 +2454,7 @@ class SPIRVFriendlyIRMangleInfo : public BuiltinFuncMangleInfo {
24542454
}
24552455
case internal::OpConvertHandleToImageINTEL:
24562456
case internal::OpConvertHandleToSamplerINTEL:
2457+
case internal::OpConvertHandleToSampledImageINTEL:
24572458
addUnsignedArg(0);
24582459
break;
24592460
default:;

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5760,7 +5760,12 @@ void LLVMToSPIRVBase::oclGetMutatedArgumentTypesByBuiltin(
57605760
StringRef Demangled;
57615761
if (!oclIsBuiltin(F->getName(), Demangled))
57625762
return;
5763-
if (Demangled.find(kSPIRVName::SampledImage) == std::string::npos)
5763+
// Note: kSPIRVName::ConvertHandleToSampledImageINTEL contains
5764+
// kSPIRVName::SampledImage as a substring, but we still want to return in
5765+
// this case.
5766+
if (Demangled.find(kSPIRVName::SampledImage) == std::string::npos ||
5767+
Demangled.find(kSPIRVName::ConvertHandleToSampledImageINTEL) !=
5768+
std::string::npos)
57645769
return;
57655770
if (FT->getParamType(1)->isIntegerTy())
57665771
ChangedType[1] = getSPIRVType(OpTypeSampler, true);

lib/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4017,7 +4017,9 @@ template <Op OC> class SPIRVBindlessImagesInstBase : public SPIRVUnaryInst<OC> {
40174017
SPVErrLog.checkError(
40184018
(ResTy->isTypeImage() && OC == internal::OpConvertHandleToImageINTEL) ||
40194019
(ResTy->isTypeSampler() &&
4020-
OC == internal::OpConvertHandleToSamplerINTEL),
4020+
OC == internal::OpConvertHandleToSamplerINTEL) ||
4021+
(ResTy->isTypeSampledImage() &&
4022+
OC == internal::OpConvertHandleToSampledImageINTEL),
40214023
SPIRVEC_InvalidInstruction,
40224024
InstName + "\nIncorrect return type of the instruction must be "
40234025
"image/sampler\n");
@@ -4027,6 +4029,7 @@ template <Op OC> class SPIRVBindlessImagesInstBase : public SPIRVUnaryInst<OC> {
40274029
typedef SPIRVBindlessImagesInstBase<internal::Op##x> SPIRV##x;
40284030
_SPIRV_OP(ConvertHandleToImageINTEL)
40294031
_SPIRV_OP(ConvertHandleToSamplerINTEL)
4032+
_SPIRV_OP(ConvertHandleToSampledImageINTEL)
40304033
#undef _SPIRV_OP
40314034

40324035
} // namespace SPIRV

lib/SPIRV/libSPIRV/SPIRVOpCodeEnumInternal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,5 @@ _SPIRV_OP_INTERNAL(ConvertHandleToImageINTEL,
3535
internal::ConvertHandleToImageINTEL)
3636
_SPIRV_OP_INTERNAL(ConvertHandleToSamplerINTEL,
3737
internal::ConvertHandleToSamplerINTEL)
38+
_SPIRV_OP_INTERNAL(ConvertHandleToSampledImageINTEL,
39+
internal::ConvertHandleToSampledImageINTEL)

lib/SPIRV/libSPIRV/SPIRVType.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,10 @@ bool SPIRVType::isTypeSampler() const { return OpCode == OpTypeSampler; }
197197

198198
bool SPIRVType::isTypeImage() const { return OpCode == OpTypeImage; }
199199

200+
bool SPIRVType::isTypeSampledImage() const {
201+
return OpCode == OpTypeSampledImage;
202+
}
203+
200204
bool SPIRVType::isTypeStruct() const { return OpCode == OpTypeStruct; }
201205

202206
bool SPIRVType::isTypeVector() const { return OpCode == OpTypeVector; }

lib/SPIRV/libSPIRV/SPIRVType.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class SPIRVType : public SPIRVEntry {
9393
bool isTypeOpaque() const;
9494
bool isTypePointer() const;
9595
bool isTypeSampler() const;
96+
bool isTypeSampledImage() const;
9697
bool isTypeStruct() const;
9798
bool isTypeVector() const;
9899
bool isTypeJointMatrixINTEL() const;

lib/SPIRV/libSPIRV/spirv_internal.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ enum InternalOp {
8484
IOpCooperativeMatrixPrefetchINTEL = 6449,
8585
IOpConvertHandleToImageINTEL = 6529,
8686
IOpConvertHandleToSamplerINTEL = 6530,
87+
IOpConvertHandleToSampledImageINTEL = 6531,
8788
IOpPrev = OpMax - 2,
8889
IOpForward
8990
};
@@ -226,6 +227,7 @@ _SPIRV_OP(Capability, CacheControlsINTEL)
226227
_SPIRV_OP(Capability, BindlessImagesINTEL)
227228
_SPIRV_OP(Op, ConvertHandleToImageINTEL)
228229
_SPIRV_OP(Op, ConvertHandleToSamplerINTEL)
230+
_SPIRV_OP(Op, ConvertHandleToSampledImageINTEL)
229231
#undef _SPIRV_OP
230232

231233
constexpr SourceLanguage SourceLanguagePython =

test/extensions/INTEL/SPV_INTEL_bindless_images/bindless_images_generic.ll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,33 @@ target triple = "spir64-unknown-unknown"
1818
; CHECK-SPIRV-DAG: TypeVoid [[#VoidTy:]]
1919
; CHECK-SPIRV-DAG: TypeInt [[#Int64Ty:]] 64
2020
; CHECK-SPIRV-DAG: Constant [[#Int64Ty]] [[#Const42:]] 42 0
21+
; CHECK-SPIRV-DAG: Constant [[#Int64Ty]] [[#Const43:]] 43 0
2122
; CHECK-SPIRV-DAG: TypeImage [[#IntImgTy:]] [[#Int64Ty]]
2223
; CHECK-SPIRV-DAG: TypeSampler [[#SamplerTy:]]
24+
; CHECK-SPIRV-DAG: TypeImage [[#IntSmpImgTy:]] [[#Int64Ty]]
25+
; CHECK-SPIRV-DAG: TypeSampledImage [[#SampImageTy:]] [[#IntSmpImgTy]]
2326
; CHECK-SPIRV: FunctionParameter [[#Int64Ty]] [[#Input:]]
2427
; CHECK-SPIRV: ConvertHandleToImageINTEL [[#IntImgTy]] [[#]] [[#Input]]
2528
; CHECK-SPIRV: ConvertHandleToSamplerINTEL [[#SamplerTy]] [[#]] [[#Const42]]
29+
; CHECK-SPIRV: ConvertHandleToSampledImageINTEL [[#SampImageTy]] [[#]] [[#Const43]]
2630

2731
; CHECK-LLVM: call spir_func target("spirv.Image", i64, 2, 0, 0, 0, 0, 0, 0) @_Z76__spirv_ConvertHandleToImageINTEL_RPU3AS133__spirv_Image__long_2_0_0_0_0_0_0m(i64 %{{.*}})
2832
; CHECK-LLVM: call spir_func target("spirv.Sampler") @_Z35__spirv_ConvertHandleToSamplerINTELm(i64 42)
33+
; CHECK-LLVM: call spir_func target("spirv.SampledImage", i64, 1, 0, 0, 0, 0, 0, 0) @_Z40__spirv_ConvertHandleToSampledImageINTELm(i64 43)
2934

3035
define spir_func void @foo(i64 %in) {
3136
%img = call spir_func target("spirv.Image", i64, 2, 0, 0, 0, 0, 0, 0) @_Z33__spirv_ConvertHandleToImageINTELl(i64 %in)
3237
%samp = call spir_func target("spirv.Sampler") @_Z35__spirv_ConvertHandleToSamplerINTELl(i64 42)
38+
%sampImage = call spir_func target("spirv.SampledImage", i64, 1, 0, 0, 0, 0, 0, 0) @_Z40__spirv_ConvertHandleToSampledImageINTELl(i64 43)
3339
ret void
3440
}
3541

3642
declare spir_func target("spirv.Image", i64, 2, 0, 0, 0, 0, 0, 0) @_Z33__spirv_ConvertHandleToImageINTELl(i64)
3743

3844
declare spir_func target("spirv.Sampler") @_Z35__spirv_ConvertHandleToSamplerINTELl(i64)
3945

46+
declare spir_func target("spirv.SampledImage", i64, 1, 0, 0, 0, 0, 0, 0) @_Z40__spirv_ConvertHandleToSampledImageINTELl(i64)
47+
4048
!opencl.spir.version = !{!0}
4149
!spirv.Source = !{!1}
4250
!llvm.ident = !{!2}

0 commit comments

Comments
 (0)