Skip to content

Commit 86ec39b

Browse files
krystian-andrzejewskiigcbot
authored andcommitted
Small refactor for emitting sampling instructions
1 parent 5923949 commit 86ec39b

File tree

9 files changed

+256
-106
lines changed

9 files changed

+256
-106
lines changed

IGC/Compiler/CISACodeGen/CISABuilder.cpp

Lines changed: 52 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2442,21 +2442,25 @@ namespace IGC
24422442
V(vKernel->CreateVISAImmediate(aoffimmi, &aoffimmiVal, ISA_TYPE_UW));
24432443
}
24442444

2445-
V(vKernel->AppendVISA3dSampler(
2446-
ConvertSubOpcode(subOpcode, zeroLOD),
2447-
feedbackEnable, // pixel null mask
2448-
cpsEnable,
2449-
!nonUniformState,
2450-
predOpnd,
2451-
GetAluEMask(dst),
2452-
visaExecSize(m_encoderState.m_simdSize),
2453-
ConvertChannelMaskToVisaType(writeMask),
2454-
aoffimmi,
2455-
samplerOpnd,
2456-
btiOpnd,
2457-
dstVar,
2458-
numSources,
2459-
opndArray));
2445+
{
2446+
int status = vKernel->AppendVISA3dSampler(
2447+
ConvertSubOpcode(subOpcode, zeroLOD),
2448+
feedbackEnable, // pixel null mask
2449+
cpsEnable,
2450+
!nonUniformState,
2451+
predOpnd,
2452+
GetAluEMask(dst),
2453+
visaExecSize(m_encoderState.m_simdSize),
2454+
ConvertChannelMaskToVisaType(writeMask),
2455+
aoffimmi,
2456+
samplerOpnd,
2457+
btiOpnd,
2458+
dstVar,
2459+
numSources,
2460+
opndArray);
2461+
2462+
V(status);
2463+
}
24602464
}
24612465

24622466
void CEncoder::Load(
@@ -2486,18 +2490,22 @@ namespace IGC
24862490

24872491
VISA_VectorOpnd* aoffimmi = GetSourceOperandNoModifier(offset);
24882492

2489-
V(vKernel->AppendVISA3dLoad(
2490-
ConvertSubOpcode(subOpcode, zeroLOD),
2491-
feedbackEnable, // pixel null mask
2492-
predOpnd,
2493-
GetAluEMask(dst),
2494-
GetAluExecSize(dst),
2495-
ConvertChannelMaskToVisaType(writeMask),
2496-
aoffimmi,
2497-
surfOpnd,
2498-
dstVar,
2499-
numSources,
2500-
opndArray));
2493+
{
2494+
int status = vKernel->AppendVISA3dLoad(
2495+
ConvertSubOpcode(subOpcode, zeroLOD),
2496+
feedbackEnable, // pixel null mask
2497+
predOpnd,
2498+
GetAluEMask(dst),
2499+
GetAluExecSize(dst),
2500+
ConvertChannelMaskToVisaType(writeMask),
2501+
aoffimmi,
2502+
surfOpnd,
2503+
dstVar,
2504+
numSources,
2505+
opndArray);
2506+
2507+
V(status);
2508+
}
25012509
}
25022510

25032511
void CEncoder::Info(EOPCODE subOpcode, uint writeMask, const ResourceDescriptor& resource, CVariable* lod, CVariable* dst)
@@ -2549,19 +2557,23 @@ namespace IGC
25492557
V(vKernel->CreateVISAImmediate(aoffimmi, &aoffimmiVal, ISA_TYPE_UW));
25502558
}
25512559

2552-
V(vKernel->AppendVISA3dGather4(
2553-
ConvertSubOpcode(subOpcode, false),
2554-
feedbackEnable, // pixel null mask
2555-
predOpnd,
2556-
GetAluEMask(dst),
2557-
visaExecSize(m_encoderState.m_simdSize),
2558-
ConvertSingleSourceChannel(channel),
2559-
aoffimmi,
2560-
samplerOpnd,
2561-
surfOpnd,
2562-
dstVar,
2563-
numSources,
2564-
opndArray));
2560+
{
2561+
int status = vKernel->AppendVISA3dGather4(
2562+
ConvertSubOpcode(subOpcode, false),
2563+
feedbackEnable, // pixel null mask
2564+
predOpnd,
2565+
GetAluEMask(dst),
2566+
visaExecSize(m_encoderState.m_simdSize),
2567+
ConvertSingleSourceChannel(channel),
2568+
aoffimmi,
2569+
samplerOpnd,
2570+
surfOpnd,
2571+
dstVar,
2572+
numSources,
2573+
opndArray);
2574+
2575+
V(status);
2576+
}
25652577
}
25662578

25672579
void CEncoder::AddrAdd(CVariable* dst, CVariable* src0, CVariable* src1)

IGC/Compiler/CISACodeGen/CISABuilder.hpp

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,42 @@ namespace IGC
189189
CVariable* CPSCounter,
190190
CVariable* sampleIndex,
191191
CVariable* r1Reg);
192-
void Sample(EOPCODE subOpcode, uint writeMask, CVariable* offset, const ResourceDescriptor& bindingTableIndex, const SamplerDescriptor& SamplerIdx, uint numSources, CVariable* dst, llvm::SmallVector<CVariable*, 4> & payload, bool zeroLOD, bool cpsEnable, bool feedbackEnable, bool nonUniformState = false);
193-
void Load(EOPCODE subOpcode, uint writeMask, CVariable* offset, const ResourceDescriptor& resource, uint numSources, CVariable* dst, llvm::SmallVector<CVariable*, 4> & payload, bool zeroLOD, bool feedbackEnable);
192+
void Sample(
193+
EOPCODE subOpcode,
194+
uint writeMask,
195+
CVariable* offset,
196+
const ResourceDescriptor& bindingTableIndex,
197+
const SamplerDescriptor& SamplerIdx,
198+
uint numSources,
199+
CVariable* dst,
200+
llvm::SmallVector<CVariable*, 4> & payload,
201+
bool zeroLOD,
202+
bool cpsEnable,
203+
bool feedbackEnable,
204+
bool nonUniformState = false);
205+
void Load(
206+
EOPCODE subOpcode,
207+
uint writeMask,
208+
CVariable* offset,
209+
const ResourceDescriptor& resource,
210+
uint numSources,
211+
CVariable* dst,
212+
llvm::SmallVector<CVariable*, 4> & payload,
213+
bool zeroLOD,
214+
bool feedbackEnable);
215+
194216
void Info(EOPCODE subOpcode, uint writeMask, const ResourceDescriptor& resource, CVariable* lod, CVariable* dst);
195-
void Gather4Inst(EOPCODE subOpcode, CVariable* offset, const ResourceDescriptor& resource, const SamplerDescriptor& sampler, uint numSources, CVariable* dst, llvm::SmallVector<CVariable*, 4> & payload, uint channel, bool feedbackEnable);
217+
218+
void Gather4Inst(
219+
EOPCODE subOpcode,
220+
CVariable* offset,
221+
const ResourceDescriptor& resource,
222+
const SamplerDescriptor& sampler,
223+
uint numSources,
224+
CVariable* dst,
225+
llvm::SmallVector<CVariable*, 4> & payload,
226+
uint channel,
227+
bool feedbackEnable);
196228

197229
void OWLoad(CVariable* dst, const ResourceDescriptor& resource, CVariable* offset, bool owordAligned, uint dstSize, uint dstOffset = 0);
198230
void OWStore(CVariable* dst, e_predefSurface surfaceType, CVariable* bufidx, CVariable* offset, uint dstSize, uint srcOffset);
@@ -895,7 +927,16 @@ namespace IGC
895927
const ResourceDescriptor& resource, uint numSources, CVariable* dst,
896928
llvm::SmallVector<CVariable*, 4> & payload, bool feedbackEnable)
897929
{
898-
Load(subOpcode, writeMask, offset, resource, numSources, dst, payload, false, feedbackEnable);
930+
Load(
931+
subOpcode,
932+
writeMask,
933+
offset,
934+
resource,
935+
numSources,
936+
dst,
937+
payload,
938+
false,
939+
feedbackEnable);
899940
}
900941

901942
inline void CEncoder::Gather(CVariable* dst, CVariable* bufId, CVariable* offset, CVariable* gOffset, e_predefSurface surface, int elementSize)

IGC/Compiler/CISACodeGen/EmitVISAPass.cpp

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4324,7 +4324,16 @@ void EmitPass::emitLdInstruction(llvm::Instruction* inst)
43244324
{
43254325
m_encoder->SetUniformSIMDSize(m_currShader->m_Platform->getMinDispatchMode());
43264326
}
4327-
m_encoder->Load(opCode, writeMask, offset, resource, numSources, dst, payload, zeroLOD, feedbackEnable);
4327+
m_encoder->Load(
4328+
opCode,
4329+
writeMask,
4330+
offset,
4331+
resource,
4332+
numSources,
4333+
dst,
4334+
payload,
4335+
zeroLOD,
4336+
feedbackEnable);
43284337
m_encoder->Push();
43294338
if (m_currShader->hasReadWriteImage(*(inst->getParent()->getParent())))
43304339
{
@@ -7131,9 +7140,18 @@ void EmitPass::emitSampleInstruction(SampleIntrinsic* inst)
71317140
m_encoder->SetPredicate(flag);
71327141
}
71337142
m_encoder->Sample(
7134-
opCode, writeMask, immOffset, resource, sampler,
7135-
numSources, dst, payload,
7136-
zeroLOD, cpsEnable, hasMaskResponse, needLoop);
7143+
opCode,
7144+
writeMask,
7145+
immOffset,
7146+
resource,
7147+
sampler,
7148+
numSources,
7149+
dst,
7150+
payload,
7151+
zeroLOD,
7152+
cpsEnable,
7153+
hasMaskResponse,
7154+
needLoop);
71377155
m_encoder->Push();
71387156

71397157
if (m_currShader->hasReadWriteImage(*(inst->getParent()->getParent())))
@@ -7480,7 +7498,16 @@ void EmitPass::emitGather4Instruction(SamplerGatherIntrinsic* inst)
74807498
CVariable* flag = nullptr;
74817499
bool needLoop = ResourceLoopHeader(resource, sampler, flag, label);
74827500
m_encoder->SetPredicate(flag);
7483-
m_encoder->Gather4Inst(opCode, offset, resource, sampler, numSources, dst, payload, channel, feedbackEnable);
7501+
m_encoder->Gather4Inst(
7502+
opCode,
7503+
offset,
7504+
resource,
7505+
sampler,
7506+
numSources,
7507+
dst,
7508+
payload,
7509+
channel,
7510+
feedbackEnable);
74847511
m_encoder->Push();
74857512
if (m_currShader->hasReadWriteImage(*(inst->getParent()->getParent())))
74867513
{

visa/BuildCISAIRImpl.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,6 +1172,14 @@ bool CISA_IR_Builder::CISA_eval_sizeof_decl(int lineNum, const char *var, int64_
11721172
return false; \
11731173
} \
11741174
} while (0)
1175+
#define VISA_RESULT_CALL_TO_BOOL(FUNC_RESULT) \
1176+
do { \
1177+
int __status = FUNC_RESULT; \
1178+
if (__status != VISA_SUCCESS) { \
1179+
RecordParseError(lineNum, ""/*IGC_MANGLE(__FUNCTION__)*/, ": unknown error (internal line: ", __LINE__, ")"); \
1180+
return false; \
1181+
} \
1182+
} while (0)
11751183
// similar to above, but returns nullptr on failure.
11761184
#define VISA_CALL_TO_NULLPTR(FUNC, ...) \
11771185
do { \
@@ -2546,10 +2554,12 @@ bool CISA_IR_Builder::createSample4Instruction(
25462554
RecordParseError(lineNum, "one one of R,G,B,A may be specified for sample4 instruction");
25472555
return false;
25482556
}
2549-
VISA_CALL_TO_BOOL(AppendVISA3dGather4,
2557+
int status = m_kernel->AppendVISA3dGather4(
25502558
subOpcode, pixelNullMask, (VISA_PredOpnd*)pred, emask,
25512559
executionSize, channel.getSingleChannel(), (VISA_VectorOpnd*) aoffimmi,
2552-
sampler, surface, (VISA_RawOpnd*) dst, numParameters, params);
2560+
sampler, surface,
2561+
(VISA_RawOpnd*) dst, numParameters, params);
2562+
VISA_RESULT_CALL_TO_BOOL(status);
25532563
return true;
25542564
}
25552565

@@ -2573,10 +2583,11 @@ bool CISA_IR_Builder::create3DLoadInstruction(
25732583
return false; // error recorded
25742584

25752585
VISA_Exec_Size executionSize = Get_VISA_Exec_Size_From_Raw_Size(exec_size);
2576-
VISA_CALL_TO_BOOL(AppendVISA3dLoad,
2586+
int status = m_kernel->AppendVISA3dLoad(
25772587
subOpcode, pixelNullMask, (VISA_PredOpnd*)pred, emask,
2578-
executionSize, channels.getAPI(), (VISA_VectorOpnd*) aoffimmi,
2579-
surface, (VISA_RawOpnd*)dst, numParameters, params);
2588+
executionSize, channels.getAPI(), (VISA_VectorOpnd*) aoffimmi, surface,
2589+
(VISA_RawOpnd*) dst, numParameters, params);
2590+
VISA_RESULT_CALL_TO_BOOL(status);
25802591
return true;
25812592
}
25822593

@@ -2609,11 +2620,12 @@ bool CISA_IR_Builder::create3DSampleInstruction(
26092620

26102621
VISA_Exec_Size executionSize = Get_VISA_Exec_Size_From_Raw_Size(exec_size);
26112622

2612-
VISA_CALL_TO_BOOL(AppendVISA3dSampler,
2623+
int status = m_kernel->AppendVISA3dSampler(
26132624
subOpcode, pixelNullMask, cpsEnable, uniformSampler,
26142625
(VISA_PredOpnd*)pred, emask, executionSize, channels.getAPI(),
2615-
(VISA_VectorOpnd*)aoffimmi,
2616-
sampler, surface, (VISA_RawOpnd*)dst, numParameters, params);
2626+
(VISA_VectorOpnd*)aoffimmi, sampler, surface,
2627+
(VISA_RawOpnd*)dst, numParameters, params);
2628+
VISA_RESULT_CALL_TO_BOOL(status);
26172629
return true;
26182630
}
26192631

visa/ByteCodeReaderNG.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,7 +1665,8 @@ static void readInstructionSampler(unsigned& bytePos, const char* buf, ISA_Opcod
16651665
kernelBuilder->CreateVISAStateOperandHandle(surfaceHnd, container.surfaceVarDecls[surface]);
16661666
kernelBuilderImpl->CreateVISAStateOperandHandle(samplerHnd, container.samplerVarDecls[sampler]);
16671667
kernelBuilderImpl->AppendVISA3dSampler(op.opcode, op.pixelNullMask, op.cpsEnable, !op.nonUniformSampler, pred, emask, esize,
1668-
ChannelMask::createAPIFromBinary(opcode, channelMask), aoffimmi, samplerHnd, surfaceHnd, dst, numParams, params);
1668+
ChannelMask::createAPIFromBinary(opcode, channelMask), aoffimmi, samplerHnd, surfaceHnd,
1669+
dst, numParams, params);
16691670
break;
16701671
}
16711672
case ISA_3D_LOAD:
@@ -1698,7 +1699,8 @@ static void readInstructionSampler(unsigned& bytePos, const char* buf, ISA_Opcod
16981699
VISA_StateOpndHandle* surfaceHnd = NULL;
16991700
kernelBuilder->CreateVISAStateOperandHandle(surfaceHnd, container.surfaceVarDecls[surface]);
17001701
kernelBuilderImpl->AppendVISA3dLoad(op.opcode, op.pixelNullMask, pred, emask, esize,
1701-
ChannelMask::createAPIFromBinary(opcode, channelMask), aoffimmi, surfaceHnd, dst, numParams, params);
1702+
ChannelMask::createAPIFromBinary(opcode, channelMask), aoffimmi, surfaceHnd,
1703+
dst, numParams, params);
17021704
break;
17031705
}
17041706
case ISA_3D_GATHER4:
@@ -1732,7 +1734,8 @@ static void readInstructionSampler(unsigned& bytePos, const char* buf, ISA_Opcod
17321734
kernelBuilder->CreateVISAStateOperandHandle(surfaceHnd, container.surfaceVarDecls[surface]);
17331735
kernelBuilderImpl->CreateVISAStateOperandHandle(samplerHnd, container.samplerVarDecls[sampler]);
17341736
kernelBuilder->AppendVISA3dGather4(op.opcode, op.pixelNullMask, pred, emask, esize,
1735-
(VISASourceSingleChannel)channel, aoffimmi, samplerHnd, surfaceHnd, dst, numParams, params);
1737+
(VISASourceSingleChannel)channel, aoffimmi, samplerHnd, surfaceHnd,
1738+
dst, numParams, params);
17361739
break;
17371740
}
17381741
case ISA_3D_INFO:

visa/CISA.y

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,33 +1145,47 @@ SampleInstruction:
11451145
$5, $6, $7, $8, CISAlineno));
11461146
}
11471147

1148-
// 1 2 3 4 5 6 7 8 9 10 11 12
1149-
Sample3dInstruction: Predicate SAMPLE_3D_OP PixelNullMaskEnableOpt CPSEnableOpt NonUniformSamplerEnableOpt SAMPLER_CHANNEL ExecSize VecSrcOperand_G_I_IMM Var Var RawOperand RawOperandArray
1148+
// 1 2 3 4 5 6 7 8 9 10 11
1149+
Sample3dInstruction: Predicate SAMPLE_3D_OP PixelNullMaskEnableOpt CPSEnableOpt NonUniformSamplerEnableOpt SAMPLER_CHANNEL ExecSize VecSrcOperand_G_I_IMM Var Var RawOperand
1150+
// 12
1151+
RawOperandArray
11501152
{
1151-
ABORT_ON_FAIL(pBuilder->create3DSampleInstruction(
1153+
const bool success = pBuilder->create3DSampleInstruction(
11521154
$1, $2, $3, $4, $5, ChannelMask::createFromAPI($6),
11531155
$7.emask, $7.exec_size, $8.cisa_gen_opnd, $9, $10,
1154-
$11, (unsigned int)$12, rawOperandArray, CISAlineno));
1156+
$11, (unsigned int)$12, rawOperandArray, CISAlineno);
1157+
1158+
ABORT_ON_FAIL(success);
11551159
}
11561160

11571161
CPSEnableOpt: %empty {$$ = false;} | CPS {$$ = true;}
11581162

11591163
NonUniformSamplerEnableOpt: %empty {$$ = false;} | NON_UNIFORM_SAMPLER {$$ = true;}
11601164

1161-
// 1 2 3 4 5 6 7 8 9
1162-
Load3dInstruction: Predicate LOAD_3D_OP PixelNullMaskEnableOpt SAMPLER_CHANNEL ExecSize VecSrcOperand_G_I_IMM Var RawOperand RawOperandArray
1165+
// 1 2 3 4 5 6 7 8
1166+
Load3dInstruction: Predicate LOAD_3D_OP PixelNullMaskEnableOpt SAMPLER_CHANNEL ExecSize VecSrcOperand_G_I_IMM Var RawOperand
1167+
// 9
1168+
RawOperandArray
11631169
{
1164-
ABORT_ON_FAIL(pBuilder->create3DLoadInstruction(
1170+
const bool success = pBuilder->create3DLoadInstruction(
11651171
$1, $2, $3, ChannelMask::createFromAPI($4),
1166-
$5.emask, $5.exec_size, $6.cisa_gen_opnd, $7, $8, (unsigned int)$9, rawOperandArray, CISAlineno));
1172+
$5.emask, $5.exec_size, $6.cisa_gen_opnd, $7,
1173+
$8, (unsigned int)$9, rawOperandArray, CISAlineno);
1174+
1175+
ABORT_ON_FAIL(success);
11671176
}
11681177

1169-
// 1 2 3 4 5 6 7 8 9 10
1170-
Gather43dInstruction: Predicate SAMPLE4_3D_OP PixelNullMaskEnableOpt SAMPLER_CHANNEL ExecSize VecSrcOperand_G_I_IMM Var Var RawOperand RawOperandArray
1178+
// 1 2 3 4 5 6 7 8 9
1179+
Gather43dInstruction: Predicate SAMPLE4_3D_OP PixelNullMaskEnableOpt SAMPLER_CHANNEL ExecSize VecSrcOperand_G_I_IMM Var Var RawOperand
1180+
// 10
1181+
RawOperandArray
11711182
{
1172-
ABORT_ON_FAIL(pBuilder->createSample4Instruction(
1183+
const bool success = pBuilder->createSample4Instruction(
11731184
$1, $2, $3, ChannelMask::createFromAPI($4), $5.emask, $5.exec_size,
1174-
$6.cisa_gen_opnd, $7, $8, $9, (unsigned int)$10, rawOperandArray, CISAlineno));
1185+
$6.cisa_gen_opnd, $7, $8, $9,
1186+
(unsigned int)$10, rawOperandArray, CISAlineno);
1187+
1188+
ABORT_ON_FAIL(success);
11751189
}
11761190

11771191
PixelNullMaskEnableOpt: %empty {$$ = false;} | PIXEL_NULL_MASK {$$ = true;}

0 commit comments

Comments
 (0)