Skip to content

Commit 968e644

Browse files
smilczekigcbot
authored andcommitted
Remove tracking of bindless offset for images - PART#3
In case of bindless images, NEO runtime passes bindless offset in image arg of kernel. This bindless offset doesn't need to be tracked because arg tracking in OCLBIConverter pass is only needed to find image's BTI, which isn't used with bindless as it's the bindless offset that is used to find the image's surface state instead of values stored in the Binding Table. This commit is the third part of the tracking removal. It implements handling of inline samplers for bindless mode in two new passes. First, PrepareInlineSamplerForBindless visits instructions calling __bindless_sampler_initializer(int32) and maps the callee's argument for AddImplicitArgs pass and then creates inline sampler metadata. Second, ResolveInlineSamplerForBindless replaces calls to __bindless_sampler_initializer(int32) with corresponding inline sampler implicit args created by AddImplicitArgs. This commit also edits builtin __translate_sampler_initializer(int32) to return __bindless_sampler_initializer(int32) for bindless.
1 parent 5e1dfe3 commit 968e644

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+768
-368
lines changed

IGC/AdaptorOCL/UnifyIROCL.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ SPDX-License-Identifier: MIT
6060
#include "Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncsAnalysis.hpp"
6161
#include "Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncResolution.hpp"
6262
#include "Compiler/Optimizer/OpenCLPasses/ImageFuncs/ResolveSampledImageBuiltins.hpp"
63+
#include "Compiler/Optimizer/OpenCLPasses/PrepareInlineSamplerForBindless/PrepareInlineSamplerForBindless.hpp"
64+
#include "Compiler/Optimizer/OpenCLPasses/ResolveInlineSamplerForBindless/ResolveInlineSamplerForBindless.hpp"
6365
#include "Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryUsageAnalysis.hpp"
6466
#include "Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryResolution.hpp"
6567
#include "Compiler/Optimizer/OpenCLPasses/ProgramScopeConstants/ProgramScopeConstantAnalysis.hpp"
@@ -560,9 +562,12 @@ static void CommonOCLBasedPasses(OpenCLProgramContext* pContext)
560562

561563
mpm.add(new ResolveOCLRaytracingBuiltins());
562564
mpm.add(createRayTracingIntrinsicAnalysisPass());
565+
mpm.add(new PrepareInlineSamplerForBindless());
566+
563567
// Adding implicit args based on Analysis passes
564568
mpm.add(new AddImplicitArgs());
565569

570+
mpm.add(new ResolveInlineSamplerForBindless());
566571
if (IGC_IS_FLAG_ENABLED(BufferBoundsChecking) || pContext->isBufferBoundsChecking())
567572
{
568573
mpm.add(new BufferBoundsCheckingPatcher());

IGC/BiFModule/Headers/bif_flag_controls.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,5 @@ BIF_FLAG_CONTROL(int, MaxHWThreadIDPerSubDevice)
3838
BIF_FLAG_CONTROL(bool, UseAssumeInGetGlobalId)
3939
BIF_FLAG_CONTROL(int, JointMatrixLoadStoreOpt)
4040
BIF_FLAG_CONTROL(bool, UseOOBChecks)
41+
BIF_FLAG_CONTROL(bool, UseBindlessImage)
4142
#endif // __BIF_FLAG_CONTROL_H__

IGC/BiFModule/Implementation/images.cl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,14 @@ SPDX-License-Identifier: MIT
2222

2323
#include "../Headers/spirv.h"
2424

25+
__spirv_Sampler __bindless_sampler_initializer(uint sampler);
26+
2527
__spirv_Sampler __translate_sampler_initializer(uint sampler)
2628
{
29+
if(BIF_FLAG_CTRL_GET(UseBindlessImage))
30+
{
31+
return __bindless_sampler_initializer(sampler);
32+
}
2733
return __builtin_astype((ulong)sampler, __spirv_Sampler);
2834
}
2935

IGC/Compiler/Builtins/BIFFlagCtrl/BIFFlagCtrlResolution.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ void BIFFlagCtrlResolution::FillFlagCtrl() {
116116
}
117117

118118
BIF_FLAG_CTRL_SET(UseOOBChecks, PtrCGC->platform.needsOutOfBoundsBuiltinChecks());
119+
120+
// NOTE: No need to check for UseLegacyBindlessMode,
121+
// as it's unrelated to images.
122+
BIF_FLAG_CTRL_SET(UseBindlessImage, PtrCGC->getModuleMetaData()->UseBindlessImage);
119123
}
120124

121125
#undef BIF_FLAG_CTRL_SET

IGC/Compiler/InitializePasses.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ void initializeOpenCLPrintfAnalysisPass(llvm::PassRegistry&);
118118
void initializeOpenCLPrintfResolutionPass(llvm::PassRegistry&);
119119
void initializePeepholeTypeLegalizerPass(llvm::PassRegistry&);
120120
void initializePositionDepAnalysisPass(llvm::PassRegistry&);
121+
void initializePrepareInlineSamplerForBindlessPass(llvm::PassRegistry&);
121122
void initializePrivateMemoryResolutionPass(llvm::PassRegistry&);
122123
void initializePrivateMemoryToSLMPass(llvm::PassRegistry&);
123124
void initializePrivateMemoryUsageAnalysisPass(llvm::PassRegistry&);
@@ -133,6 +134,7 @@ void initializePullConstantHeuristicsPass(llvm::PassRegistry&);
133134
void initializeScalarizerCodeGenPass(llvm::PassRegistry&);
134135
void initializeReduceLocalPointersPass(llvm::PassRegistry&);
135136
void initializeReplaceUnsupportedIntrinsicsPass(llvm::PassRegistry&);
137+
void initializeResolveInlineSamplerForBindlessPass(llvm::PassRegistry&);
136138
void initializePreCompiledFuncImportPass(llvm::PassRegistry&);
137139
void initializePurgeMetaDataUtilsPass(llvm::PassRegistry&);
138140
void initializeRemoveNonPositionOutputPass(llvm::PassRegistry&);

IGC/Compiler/Optimizer/BuiltInFuncImport.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,22 @@ bool BIImport::runOnModule(Module& M)
649649
IRBuilder<> builder(CI);
650650
Value* newV;
651651
if (funcName.startswith("__builtin_IB_convert_sampler_to_int"))
652-
newV = builder.CreatePtrToInt(CI->getOperand(0), CI->getType());
652+
{
653+
Type* CIOpTy = CI->getOperand(0)->getType();
654+
if (isa<PointerType>(CIOpTy))
655+
{
656+
newV = builder.CreatePtrToInt(CI->getOperand(0), CI->getType());
657+
}
658+
else
659+
{
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+
}
667+
}
653668
else
654669
newV = builder.CreateBitOrPointerCast(CI->getOperand(0), CI->getType());
655670
CI->replaceAllUsesWith(newV);

0 commit comments

Comments
 (0)