Skip to content

Commit 8806307

Browse files
DBDuncansys-ce-bb
authored andcommitted
Add updated SPV_INTEL_bindless_images preview extension (#2559)
The updated SPV_INTEL_bindless_images spec can be seen in this PR: #13753 Original commit: KhronosGroup/SPIRV-LLVM-Translator@e9a9a3fc1fd3e57
1 parent 673ece7 commit 8806307

File tree

11 files changed

+41
-3
lines changed

11 files changed

+41
-3
lines changed

llvm-spirv/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);

llvm-spirv/lib/SPIRV/SPIRVInternal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,10 @@ const static char TranslateOCLMemScope[] = "__translate_ocl_memory_scope";
364364
const static char TranslateSPIRVMemOrder[] = "__translate_spirv_memory_order";
365365
const static char TranslateSPIRVMemScope[] = "__translate_spirv_memory_scope";
366366
const static char TranslateSPIRVMemFence[] = "__translate_spirv_memory_fence";
367+
const static char ConvertHandleToImageINTEL[] = "ConvertHandleToImageINTEL";
368+
const static char ConvertHandleToSamplerINTEL[] = "ConvertHandleToSamplerINTEL";
369+
const static char ConvertHandleToSampledImageINTEL[] =
370+
"ConvertHandleToSampledImageINTEL";
367371
} // namespace kSPIRVName
368372

369373
namespace kSPIRVPostfix {

llvm-spirv/lib/SPIRV/SPIRVUtil.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2501,6 +2501,7 @@ class SPIRVFriendlyIRMangleInfo : public BuiltinFuncMangleInfo {
25012501
}
25022502
case internal::OpConvertHandleToImageINTEL:
25032503
case internal::OpConvertHandleToSamplerINTEL:
2504+
case internal::OpConvertHandleToSampledImageINTEL:
25042505
addUnsignedArg(0);
25052506
break;
25062507
default:;

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5785,7 +5785,12 @@ void LLVMToSPIRVBase::oclGetMutatedArgumentTypesByBuiltin(
57855785
StringRef Demangled;
57865786
if (!oclIsBuiltin(F->getName(), Demangled))
57875787
return;
5788-
if (Demangled.find(kSPIRVName::SampledImage) == std::string::npos)
5788+
// Note: kSPIRVName::ConvertHandleToSampledImageINTEL contains
5789+
// kSPIRVName::SampledImage as a substring, but we still want to return in
5790+
// this case.
5791+
if (Demangled.find(kSPIRVName::SampledImage) == std::string::npos ||
5792+
Demangled.find(kSPIRVName::ConvertHandleToSampledImageINTEL) !=
5793+
std::string::npos)
57895794
return;
57905795
if (FT->getParamType(1)->isIntegerTy())
57915796
ChangedType[1] = getSPIRVType(OpTypeSampler, true);

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4045,7 +4045,9 @@ template <Op OC> class SPIRVBindlessImagesInstBase : public SPIRVUnaryInst<OC> {
40454045
SPVErrLog.checkError(
40464046
(ResTy->isTypeImage() && OC == internal::OpConvertHandleToImageINTEL) ||
40474047
(ResTy->isTypeSampler() &&
4048-
OC == internal::OpConvertHandleToSamplerINTEL),
4048+
OC == internal::OpConvertHandleToSamplerINTEL) ||
4049+
(ResTy->isTypeSampledImage() &&
4050+
OC == internal::OpConvertHandleToSampledImageINTEL),
40494051
SPIRVEC_InvalidInstruction,
40504052
InstName + "\nIncorrect return type of the instruction must be "
40514053
"image/sampler\n");
@@ -4055,6 +4057,7 @@ template <Op OC> class SPIRVBindlessImagesInstBase : public SPIRVUnaryInst<OC> {
40554057
typedef SPIRVBindlessImagesInstBase<internal::Op##x> SPIRV##x;
40564058
_SPIRV_OP(ConvertHandleToImageINTEL)
40574059
_SPIRV_OP(ConvertHandleToSamplerINTEL)
4060+
_SPIRV_OP(ConvertHandleToSampledImageINTEL)
40584061
#undef _SPIRV_OP
40594062

40604063
} // namespace SPIRV

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVOpCodeEnumInternal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,5 @@ _SPIRV_OP_INTERNAL(ConvertHandleToImageINTEL,
4141
internal::ConvertHandleToImageINTEL)
4242
_SPIRV_OP_INTERNAL(ConvertHandleToSamplerINTEL,
4343
internal::ConvertHandleToSamplerINTEL)
44+
_SPIRV_OP_INTERNAL(ConvertHandleToSampledImageINTEL,
45+
internal::ConvertHandleToSampledImageINTEL)

llvm-spirv/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; }

llvm-spirv/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;

llvm-spirv/lib/SPIRV/libSPIRV/spirv_internal.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ enum InternalOp {
8989
IOpCooperativeMatrixPrefetchINTEL = 6449,
9090
IOpConvertHandleToImageINTEL = 6529,
9191
IOpConvertHandleToSamplerINTEL = 6530,
92+
IOpConvertHandleToSampledImageINTEL = 6531,
9293
IOpPrev = OpMax - 2,
9394
IOpForward
9495
};
@@ -220,6 +221,7 @@ _SPIRV_OP(Op, TypeTaskSequenceINTEL)
220221
_SPIRV_OP(Capability, BindlessImagesINTEL)
221222
_SPIRV_OP(Op, ConvertHandleToImageINTEL)
222223
_SPIRV_OP(Op, ConvertHandleToSamplerINTEL)
224+
_SPIRV_OP(Op, ConvertHandleToSampledImageINTEL)
223225
#undef _SPIRV_OP
224226

225227
constexpr SourceLanguage SourceLanguagePython =

llvm-spirv/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}

llvm-spirv/test/extensions/INTEL/SPV_INTEL_bindless_images/negative/i32-in-physical64.ll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@ target triple = "spir64-unknown-unknown"
1212
define spir_func void @foo(i32 %in) {
1313
%img = call spir_func target("spirv.Image", i32, 2, 0, 0, 0, 0, 0, 0) @_Z33__spirv_ConvertHandleToImageINTELi(i32 %in)
1414
%samp = call spir_func target("spirv.Sampler") @_Z35__spirv_ConvertHandleToSamplerINTELl(i64 42)
15+
%sampImage = call spir_func target("spirv.SampledImage", i64, 1, 0, 0, 0, 0, 0, 0) @_Z40__spirv_ConvertHandleToSampledImageINTELl(i64 43)
1516
ret void
1617
}
1718

1819
declare spir_func target("spirv.Image", i32, 2, 0, 0, 0, 0, 0, 0) @_Z33__spirv_ConvertHandleToImageINTELi(i32)
1920

2021
declare spir_func target("spirv.Sampler") @_Z35__spirv_ConvertHandleToSamplerINTELl(i64)
2122

23+
declare spir_func target("spirv.SampledImage", i64, 1, 0, 0, 0, 0, 0, 0) @_Z40__spirv_ConvertHandleToSampledImageINTELl(i64)
24+
2225
!opencl.spir.version = !{!0}
2326
!spirv.Source = !{!1}
2427
!llvm.ident = !{!2}

0 commit comments

Comments
 (0)