Skip to content

Commit dcfa932

Browse files
[Backport to 15] Add updated SPV_INTEL_bindless_images preview extension (#2559) (#3002)
The updated SPV_INTEL_bindless_images spec can be seen in this PR: intel/llvm#13753
1 parent 63a202e commit dcfa932

11 files changed

Lines changed: 43 additions & 3 deletions

File tree

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
@@ -390,6 +390,10 @@ const static char TranslateSPIRVMemOrder[] = "__translate_spirv_memory_order";
390390
const static char TranslateSPIRVMemScope[] = "__translate_spirv_memory_scope";
391391
const static char TranslateSPIRVMemFence[] = "__translate_spirv_memory_fence";
392392
const static char EntrypointPrefix[] = "__spirv_entry_";
393+
const static char ConvertHandleToImageINTEL[] = "ConvertHandleToImageINTEL";
394+
const static char ConvertHandleToSamplerINTEL[] = "ConvertHandleToSamplerINTEL";
395+
const static char ConvertHandleToSampledImageINTEL[] =
396+
"ConvertHandleToSampledImageINTEL";
393397
} // namespace kSPIRVName
394398

395399
namespace kSPIRVPostfix {

lib/SPIRV/SPIRVUtil.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2397,6 +2397,7 @@ class SPIRVFriendlyIRMangleInfo : public BuiltinFuncMangleInfo {
23972397
}
23982398
case internal::OpConvertHandleToImageINTEL:
23992399
case internal::OpConvertHandleToSamplerINTEL:
2400+
case internal::OpConvertHandleToSampledImageINTEL:
24002401
addUnsignedArg(0);
24012402
break;
24022403
default:;

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4942,7 +4942,12 @@ void LLVMToSPIRVBase::oclGetMutatedArgumentTypesByBuiltin(
49424942
StringRef Demangled;
49434943
if (!oclIsBuiltin(F->getName(), Demangled))
49444944
return;
4945-
if (Demangled.find(kSPIRVName::SampledImage) == std::string::npos)
4945+
// Note: kSPIRVName::ConvertHandleToSampledImageINTEL contains
4946+
// kSPIRVName::SampledImage as a substring, but we still want to return in
4947+
// this case.
4948+
if (Demangled.find(kSPIRVName::SampledImage) == std::string::npos ||
4949+
Demangled.find(kSPIRVName::ConvertHandleToSampledImageINTEL) !=
4950+
std::string::npos)
49464951
return;
49474952
if (FT->getParamType(1)->isIntegerTy())
49484953
ChangedType[1] = getSamplerType(F->getParent());

lib/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3943,7 +3943,9 @@ template <Op OC> class SPIRVBindlessImagesInstBase : public SPIRVUnaryInst<OC> {
39433943
SPVErrLog.checkError(
39443944
(ResTy->isTypeImage() && OC == internal::OpConvertHandleToImageINTEL) ||
39453945
(ResTy->isTypeSampler() &&
3946-
OC == internal::OpConvertHandleToSamplerINTEL),
3946+
OC == internal::OpConvertHandleToSamplerINTEL) ||
3947+
(ResTy->isTypeSampledImage() &&
3948+
OC == internal::OpConvertHandleToSampledImageINTEL),
39473949
SPIRVEC_InvalidInstruction,
39483950
InstName + "\nIncorrect return type of the instruction must be "
39493951
"image/sampler\n");
@@ -3953,6 +3955,7 @@ template <Op OC> class SPIRVBindlessImagesInstBase : public SPIRVUnaryInst<OC> {
39533955
typedef SPIRVBindlessImagesInstBase<internal::Op##x> SPIRV##x;
39543956
_SPIRV_OP(ConvertHandleToImageINTEL)
39553957
_SPIRV_OP(ConvertHandleToSamplerINTEL)
3958+
_SPIRV_OP(ConvertHandleToSampledImageINTEL)
39563959
#undef _SPIRV_OP
39573960

39583961
class SPIRVSubgroup2DBlockIOINTELInst : public SPIRVInstTemplateBase {

lib/SPIRV/libSPIRV/SPIRVOpCodeEnumInternal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,5 @@ _SPIRV_OP_INTERNAL(ConvertHandleToImageINTEL,
3333
internal::ConvertHandleToImageINTEL)
3434
_SPIRV_OP_INTERNAL(ConvertHandleToSamplerINTEL,
3535
internal::ConvertHandleToSamplerINTEL)
36+
_SPIRV_OP_INTERNAL(ConvertHandleToSampledImageINTEL,
37+
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
@@ -82,6 +82,7 @@ enum InternalOp {
8282
IOpCooperativeMatrixPrefetchINTEL = 6449,
8383
IOpConvertHandleToImageINTEL = 6529,
8484
IOpConvertHandleToSamplerINTEL = 6530,
85+
IOpConvertHandleToSampledImageINTEL = 6531,
8586
IOpPrev = OpMax - 2,
8687
IOpForward
8788
};
@@ -213,6 +214,7 @@ _SPIRV_OP(Capability, CacheControlsINTEL)
213214
_SPIRV_OP(Capability, BindlessImagesINTEL)
214215
_SPIRV_OP(Op, ConvertHandleToImageINTEL)
215216
_SPIRV_OP(Op, ConvertHandleToSamplerINTEL)
217+
_SPIRV_OP(Op, ConvertHandleToSampledImageINTEL)
216218
#undef _SPIRV_OP
217219

218220
constexpr SourceLanguage SourceLanguagePython =

test/extensions/INTEL/SPV_INTEL_bindless_images/bindless_images_generic.ll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,37 @@ 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 %spirv.Image._ulong_2_0_0_0_0_0_0 addrspace(1)* @_Z77__spirv_ConvertHandleToImageINTEL_RPU3AS134__spirv_Image__ulong_2_0_0_0_0_0_0m(i64 %{{.*}})
2832
; CHECK-LLVM: call spir_func %spirv.Sampler addrspace(2)* @_Z35__spirv_ConvertHandleToSamplerINTELm(i64 42)
33+
; CHECK-LLVM: call spir_func %spirv.SampledImage._ulong_1_0_0_0_0_0_0 addrspace(1)* @_Z40__spirv_ConvertHandleToSampledImageINTELm(i64 43)
2934

3035
%spirv.Image._long_2_0_0_0_0_0_0 = type opaque
3136
%spirv.Sampler = type opaque
37+
%spirv.SampledImage._long_1_0_0_0_0_0_0 = type opaque
3238

3339
define spir_func void @foo(i64 %in) {
3440
%img = call spir_func %spirv.Image._long_2_0_0_0_0_0_0 addrspace(1)* @_Z33__spirv_ConvertHandleToImageINTELl(i64 %in)
3541
%samp = call spir_func %spirv.Sampler addrspace(2)* @_Z35__spirv_ConvertHandleToSamplerINTELl(i64 42)
42+
%sampImage = call spir_func %spirv.SampledImage._long_1_0_0_0_0_0_0 addrspace(1)* @_Z40__spirv_ConvertHandleToSampledImageINTELl(i64 43)
3643
ret void
3744
}
3845

3946
declare spir_func %spirv.Image._long_2_0_0_0_0_0_0 addrspace(1)* @_Z33__spirv_ConvertHandleToImageINTELl(i64)
4047

4148
declare spir_func %spirv.Sampler addrspace(2)* @_Z35__spirv_ConvertHandleToSamplerINTELl(i64)
4249

50+
declare spir_func %spirv.SampledImage._long_1_0_0_0_0_0_0 addrspace(1)* @_Z40__spirv_ConvertHandleToSampledImageINTELl(i64)
51+
4352
!opencl.spir.version = !{!0}
4453
!spirv.Source = !{!1}
4554
!llvm.ident = !{!2}

0 commit comments

Comments
 (0)