Skip to content

Commit 9749f70

Browse files
smilczekigcbot
authored andcommitted
Revert "Clean-up sampler spir related workarounds in IGC codebase."
This reverts "Clean-up sampler spir related workarounds in IGC codebase."
1 parent 73f4a39 commit 9749f70

5 files changed

Lines changed: 56 additions & 3 deletions

File tree

IGC/Compiler/Optimizer/BuiltInFuncImport.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,18 @@ bool BIImport::runOnModule(Module &M) {
652652
IRBuilder<> builder(CI);
653653
Value *newV;
654654
if (IGCLLVM::starts_with(funcName, "__builtin_IB_convert_sampler_to_int")) {
655-
newV = builder.CreatePtrToInt(CI->getOperand(0), CI->getType());
655+
Type *CIOpTy = CI->getOperand(0)->getType();
656+
if (isa<PointerType>(CIOpTy)) {
657+
newV = builder.CreatePtrToInt(CI->getOperand(0), CI->getType());
658+
}
659+
else {
660+
CodeGenContext *ctx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
661+
662+
bool UseBindlessImage = ctx->getModuleMetaData()->UseBindlessImage;
663+
ctx->getModuleMetaData()->UseBindlessImageWithSamplerTracking = UseBindlessImage;
664+
// i32 to i64
665+
newV = builder.CreateZExt(CI->getOperand(0), CI->getType());
666+
}
656667
} else
657668
newV = builder.CreateBitOrPointerCast(CI->getOperand(0), CI->getType());
658669
CI->replaceAllUsesWith(newV);

IGC/Compiler/Optimizer/OCLBIUtils.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,17 @@ class COCL_sample : public CImagesBI {
577577
//@TODO: Remove the part related to bindless once bindless
578578
// is fully implemented outside this pass.
579579
if (modMD->UseBindlessImage) {
580-
auto *sampler = m_pCallInst->getArgOperand(1);
580+
Value *sampler;
581+
if (modMD->UseBindlessImageWithSamplerTracking) {
582+
Value *samplerValue = ValueTracker::track(m_pCallInst, 1, m_pMdUtils, m_modMD);
583+
int samplerConstantVal = int_cast<int>(cast<ConstantInt>(samplerValue)->getZExtValue());
584+
585+
// Bindless inline sampler is passed via implicit kernel argument.
586+
ImplicitArgs implicitArgs(*m_pFunc, m_pMdUtils);
587+
sampler = implicitArgs.getNumberedImplicitArg(*m_pFunc, ImplicitArg::INLINE_SAMPLER, samplerConstantVal);
588+
} else {
589+
sampler = m_pCallInst->getArgOperand(1);
590+
}
581591

582592
// Map the bindless pointer.
583593
ConstantInt *bindlessIndex = ConstantInt::get(m_pIntType, BINDLESS_BTI);

IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncsAnalysis.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ bool ImageFuncsAnalysis::runOnModule(Module &M) {
5252

5353
m_useAdvancedBindlessMode = ctx->getModuleMetaData()->UseBindlessImage;
5454

55+
m_useBindlessImageWithSamplerTracking = ctx->getModuleMetaData()->UseBindlessImageWithSamplerTracking;
56+
5557
m_useSPVINTELBindlessImages = ctx->getModuleMetaData()->extensions.spvINTELBindlessImages;
5658

5759
// Run on all functions defined in this module
@@ -119,6 +121,35 @@ void ImageFuncsAnalysis::visitCallInst(CallInst &CI) {
119121
else if (funcName == GET_SAMPLER_SNAP_WA_REQUIRED && !m_useSPVINTELBindlessImages) {
120122
imageFunc = &m_argMap[ImplicitArg::SAMPLER_SNAP_WA];
121123
} else {
124+
if (funcName.endswith("sample_l") && m_useBindlessImageWithSamplerTracking) {
125+
Value *callArg = ValueTracker::track(&CI, 1, getAnalysis<MetaDataUtilsWrapper>().getMetaDataUtils(),
126+
getAnalysis<MetaDataUtilsWrapper>().getModuleMetaData());
127+
if (!callArg)
128+
return;
129+
if (ConstantInt *ConstInt = dyn_cast<ConstantInt>(callArg)) {
130+
// Inline sampler doesn't associate with an explicit argument.
131+
// To avoid adding a new metadata entry, inline sampler value is stored as
132+
// explicit argument number.
133+
uint64_t InlineSamplerInitValue = ConstInt->getZExtValue();
134+
auto [_, IsNew] = m_argMap[ImplicitArg::INLINE_SAMPLER].insert(int_cast<int>(InlineSamplerInitValue));
135+
if (!IsNew) {
136+
// Sampler initialized by this specific value was already processed.
137+
// No new sampler will be created. Skip creating inline sampler metadata.
138+
return;
139+
}
140+
141+
// Add metadata for the inline sampler.
142+
ModuleMetaData *ModMD = getAnalysis<MetaDataUtilsWrapper>().getModuleMetaData();
143+
FunctionMetaData &FuncMD = ModMD->FuncMD[CI.getFunction()];
144+
ResourceAllocMD &ResAllocMD = FuncMD.resAllocMD;
145+
InlineSamplersMD InlineSamplerMD;
146+
147+
CImagesBI::CreateInlineSamplerAnnotations(CI.getFunction()->getParent(), InlineSamplerMD,
148+
InlineSamplerInitValue);
149+
InlineSamplerMD.index = m_inlineSamplerIndex++;
150+
ResAllocMD.inlineSamplersMD.push_back(InlineSamplerMD);
151+
}
152+
}
122153
// Non image function, do nothing
123154
return;
124155
}

IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncsAnalysis.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ class ImageFuncsAnalysis : public llvm::ModulePass, public llvm::InstVisitor<Ima
107107
// by being lowered to a ConstantInt value of 0.
108108
bool m_useSPVINTELBindlessImages{};
109109

110+
bool m_useBindlessImageWithSamplerTracking{};
110111
int m_inlineSamplerIndex = 0;
111112
};
112113

IGC/common/MDFrameWork.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,10 +814,10 @@ enum class ShaderTypeMD
814814
ShaderData shaderData;
815815
URBLayoutInfo URBInfo;
816816
bool UseBindlessImage = false;
817-
818817
// This is used to set has_bindless_image_read zeinfo flag.
819818
bool HasBindlessImageRead = false;
820819

820+
bool UseBindlessImageWithSamplerTracking = false;
821821
bool enableRangeReduce = false;
822822
//when true, compiler enables MatchMad optimization for VS
823823
bool allowMatchMadOptimizationforVS = false;

0 commit comments

Comments
 (0)