@@ -233,7 +233,7 @@ Argument* CImagesBI::CImagesUtils::findImageFromBufferPtr(const MetaDataUtils& M
233233 return nullptr ;
234234}
235235
236- static bool isBindlessImageLoad (Value *v)
236+ static bool isBindlessImageOrSamplerLoad (Value *v)
237237{
238238 auto *load = dyn_cast<LoadInst>(v);
239239 if (!load)
@@ -254,7 +254,7 @@ ConstantInt* CImagesBI::CImagesUtils::getImageIndex(
254254{
255255 ConstantInt* imageIndex = nullptr ;
256256
257- imageParam = ValueTracker::track (pCallInst, paramIndex, nullptr , nullptr , isBindlessImageLoad );
257+ imageParam = ValueTracker::track (pCallInst, paramIndex, nullptr , nullptr , isBindlessImageOrSamplerLoad );
258258 IGC_ASSERT (imageParam);
259259 IGC_ASSERT (isa<Argument>(imageParam) || isa<LoadInst>(imageParam));
260260 int i = (*pParamMap)[imageParam].index ;
@@ -264,7 +264,7 @@ ConstantInt* CImagesBI::CImagesUtils::getImageIndex(
264264
265265BufferType CImagesBI::CImagesUtils::getImageType (ParamMap* pParamMap, CallInst* pCallInst, unsigned int paramIndex)
266266{
267- Value *imageParam = ValueTracker::track (pCallInst, paramIndex, nullptr , nullptr , isBindlessImageLoad );
267+ Value *imageParam = ValueTracker::track (pCallInst, paramIndex, nullptr , nullptr , isBindlessImageOrSamplerLoad );
268268 IGC_ASSERT (imageParam);
269269 IGC_ASSERT (isa<Argument>(imageParam) || isa<LoadInst>(imageParam));
270270 return isa<LoadInst>(imageParam) ? BufferType::BINDLESS : (*pParamMap)[imageParam].type ;
@@ -406,15 +406,31 @@ class COCL_sample : public CImagesBI
406406public:
407407 COCL_sample (ParamMap* paramMap, InlineMap* inlineMap, int * nextSampler, Dimension Dim, MetaDataUtils* pMdUtils, ModuleMetaData* modMD) : CImagesBI(paramMap, inlineMap, nextSampler, Dim), m_pMdUtils(pMdUtils), m_modMD(modMD) {}
408408
409- ConstantInt* getSamplerIndex (void )
409+ Value* getSamplerValue (void )
410410 {
411411 ConstantInt* samplerIndex = nullptr ;
412- Value* samplerParam = ValueTracker::track (m_pCallInst, 1 , m_pMdUtils, m_modMD);
412+ Value* samplerParam = ValueTracker::track (m_pCallInst, 1 , m_pMdUtils, m_modMD, isBindlessImageOrSamplerLoad );
413413 if (!samplerParam) {
414414 emitError (" There are instructions that use a sampler, but no sampler found in the kernel!" , m_pCallInst);
415415 return nullptr ;
416416 }
417417
418+ auto modMD = m_pCodeGenContext->getModuleMetaData ();
419+
420+ // If bindless image is preferred, map the bindless pointer
421+ if (modMD->UseBindlessImage )
422+ {
423+ // If sampler is argument, look up index in the parameter map.
424+ int i = isa<Argument>(samplerParam) ? (*m_pParamMap)[samplerParam].index : 0 ;
425+ samplerIndex = ConstantInt::get (m_pIntType, i);
426+ unsigned int addressSpace = IGC::EncodeAS4GFXResource (*samplerIndex, BufferType::BINDLESS_SAMPLER);
427+ Type* ptrTy = llvm::PointerType::get (m_pFloatType, addressSpace);
428+ Value* bindlessSampler = isa<IntegerType>(samplerParam->getType ()) ?
429+ BitCastInst::CreateBitOrPointerCast (samplerParam, ptrTy, " bindless_sampler" , m_pCallInst) :
430+ BitCastInst::CreatePointerCast (samplerParam, ptrTy, " bindless_sampler" , m_pCallInst);
431+ return bindlessSampler;
432+ }
433+
418434 // Argument samplers are looked up in the parameter map
419435 if (isa<Argument>(samplerParam))
420436 {
@@ -609,13 +625,17 @@ class COCL_sample : public CImagesBI
609625 }
610626 }
611627
612- bool prepareSamplerIndex ()
628+ bool prepareSamplerValue ()
613629 {
614- ConstantInt* samplerIndex = getSamplerIndex ();
615- if (!samplerIndex) return false ;
616- unsigned int addrSpace = EncodeAS4GFXResource (*samplerIndex, SAMPLER);
617- Value* sampler = ConstantPointerNull::get (PointerType::get (samplerIndex->getType (), addrSpace));
618- m_args.push_back (sampler);
630+ Value* samplerValue = getSamplerValue ();
631+ if (!samplerValue) return false ;
632+ if (isa<ConstantInt>(samplerValue))
633+ {
634+ unsigned int addrSpace = EncodeAS4GFXResource (*samplerValue, SAMPLER);
635+ samplerValue = ConstantPointerNull::get (PointerType::get (samplerValue->getType (), addrSpace));
636+ }
637+
638+ m_args.push_back (samplerValue);
619639 return true ;
620640 }
621641
@@ -711,8 +731,8 @@ class COCL_sample_l : public COCL_sample
711731 m_args.push_back (m_pFloatZero); // ai (?)
712732 preparePairedResource ();
713733 createGetBufferPtr ();
714- bool samplerIndexFound = prepareSamplerIndex ();
715- if (!samplerIndexFound ) return ;
734+ bool samplerValueFound = prepareSamplerValue ();
735+ if (!samplerValueFound ) return ;
716736
717737 prepareZeroOffsets ();
718738 Type* types[] = {
@@ -749,7 +769,7 @@ class COCL_sample_d : public COCL_sample
749769 m_args.push_back (m_pFloatZero); // minLOD (?)
750770 preparePairedResource ();
751771 prepareImageBTI ();
752- prepareSamplerIndex ();
772+ prepareSamplerValue ();
753773 prepareZeroOffsets ();
754774 Type* types[] = {
755775 m_pCallInst->getType (),
0 commit comments