@@ -52,7 +52,7 @@ class HullShaderLowering : public llvm::FunctionPass
52
52
private:
53
53
void LowerIntrinsicInputOutput (llvm::Function &F);
54
54
55
- unsigned int GetDomainType ();
55
+ unsigned int GetDomainType (llvm::BasicBlock * bb, unsigned & numTEFactorsInDomain );
56
56
57
57
llvm::GenIntrinsicInst* AddURBWriteControlPointOutputs (
58
58
Value* mask,
@@ -126,15 +126,16 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
126
126
{
127
127
SmallVector<Instruction*, 10 > instructionToRemove;
128
128
129
- IRBuilder<> builder (F.getContext ());
129
+ IRBuilder<> builder (F.getContext ());
130
130
131
131
IGC::CodeGenContext* ctx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext ();
132
132
133
133
for (auto BI = F.begin (), BE = F.end (); BI != BE; BI++)
134
134
{
135
135
m_pControlPointOutputs.clear ();
136
-
136
+
137
137
bool isTEFactorURBMsgPadded = false ;
138
+ unsigned int numTEFactorsInDomain = 0 ;
138
139
139
140
for (auto II = BI->begin (), IE = BI->end (); II!=IE; II++)
140
141
{
@@ -240,25 +241,43 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
240
241
instructionToRemove.push_back (inst);
241
242
}
242
243
243
- if ((IID == GenISAIntrinsic::GenISA_OuterScalarTessFactors) ||
244
- (IID == GenISAIntrinsic::GenISA_InnerScalarTessFactors))
244
+ // Apply URB padding for TE factors.
245
+ if (IGC_IS_FLAG_ENABLED (EnableTEFactorsPadding) &&
246
+ ctx->platform .applyTEFactorsPadding () &&
247
+ ((IID == GenISAIntrinsic::GenISA_OuterScalarTessFactors) ||
248
+ (IID == GenISAIntrinsic::GenISA_InnerScalarTessFactors)))
245
249
{
246
- // Apply URB padding for TE factors.
247
- if (IGC_IS_FLAG_ENABLED (EnableTEFactorsPadding) && ctx->platform .applyTEFactorsPadding ())
250
+ if (!isTEFactorURBMsgPadded)
248
251
{
249
- if (!isTEFactorURBMsgPadded)
252
+ // Parse all instructions within BB and count the Inner,Outer ScalarTessFactors factors
253
+ // and get the domain type.
254
+ BasicBlock* bb = dyn_cast<BasicBlock>(BI);
255
+ uint32_t tessShaderDomain = GetDomainType (bb, numTEFactorsInDomain);
256
+
257
+ if ((numTEFactorsInDomain == 2 && tessShaderDomain == USC::TESSELLATOR_DOMAIN_ISOLINE) ||
258
+ (numTEFactorsInDomain == 4 && tessShaderDomain == USC::TESSELLATOR_DOMAIN_TRI) ||
259
+ (numTEFactorsInDomain == 6 && tessShaderDomain == USC::TESSELLATOR_DOMAIN_QUAD))
250
260
{
261
+
262
+ // Adjust the mask value based on the TE factors number.
263
+ unsigned int mask = (1 << (8 - numTEFactorsInDomain)) - 1 ;
264
+
251
265
Value* undef = llvm::UndefValue::get (Type::getFloatTy (F.getContext ()));
252
266
Value* data[8 ] = { undef,undef,undef,undef,undef,undef,undef,undef };
253
- // Add padding at offset 0
254
- AddURBWrite (builder.getInt32 (0 ), builder.getInt32 (0xF ), data, inst);
255
- // Add padding at offset 1
256
- AddURBWrite (builder.getInt32 (1 ), builder.getInt32 (0xF ), data, inst);
267
+ AddURBWrite (
268
+ builder.getInt32 (0 ), // offset
269
+ builder.getInt32 (mask),
270
+ data,
271
+ inst);
257
272
258
273
isTEFactorURBMsgPadded = true ;
259
274
}
260
275
}
276
+ }
261
277
278
+ if ((IID == GenISAIntrinsic::GenISA_OuterScalarTessFactors) ||
279
+ (IID == GenISAIntrinsic::GenISA_InnerScalarTessFactors))
280
+ {
262
281
// The URB Location for tessellation factors spans the first two offsets
263
282
// offset 0 and 1. The tessellation factors occupy the two offsets as mentioned below
264
283
// Quad domain has 4 outer and 2 inner tessellation factors
@@ -284,7 +303,17 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
284
303
// | | | | |
285
304
// ------------------------------------------------------------------------------------
286
305
287
- unsigned int tessShaderDomain = GetDomainType ();
306
+ uint32_t tessShaderDomain = USC::TESSELLATOR_DOMAIN_ISOLINE;
307
+ llvm::NamedMDNode *pMetaData = m_module->getOrInsertNamedMetadata (" TessellationShaderDomain" );
308
+ if (pMetaData && (pMetaData->getNumOperands () == 1 ))
309
+ {
310
+ llvm::MDNode* pTessShaderDomain = pMetaData->getOperand (0 );
311
+ if (pTessShaderDomain)
312
+ {
313
+ tessShaderDomain = int_cast<uint32_t >(
314
+ mdconst::dyn_extract<ConstantInt>(pTessShaderDomain->getOperand (0 ))->getZExtValue ());
315
+ }
316
+ }
288
317
289
318
// offset into URB is 1 for outerScalarTessFactors and
290
319
// 1 if its triangle domain and inner scalar tessellation factor
@@ -372,17 +401,29 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
372
401
}
373
402
}
374
403
375
- unsigned int HullShaderLowering::GetDomainType ()
404
+ unsigned int HullShaderLowering::GetDomainType (llvm::BasicBlock* bb, unsigned &numTEFactorsInDomain )
376
405
{
377
406
unsigned int tessShaderDomain = USC::TESSELLATOR_DOMAIN_ISOLINE;
378
- llvm::NamedMDNode *pMetaData = m_module->getOrInsertNamedMetadata (" TessellationShaderDomain" );
379
- if (pMetaData && (pMetaData->getNumOperands () == 1 ))
407
+ for (auto II = bb->begin (), IE = bb->end (); II != IE; II++)
380
408
{
381
- llvm::MDNode* pTessShaderDomain = pMetaData->getOperand (0 );
382
- if (pTessShaderDomain)
409
+ if (GenIntrinsicInst* inst = dyn_cast<GenIntrinsicInst>(II))
383
410
{
384
- tessShaderDomain = int_cast<uint32_t >(
385
- mdconst::dyn_extract<ConstantInt>(pTessShaderDomain->getOperand (0 ))->getZExtValue ());
411
+ GenISAIntrinsic::ID IID = inst->getIntrinsicID ();
412
+ if ((IID == GenISAIntrinsic::GenISA_OuterScalarTessFactors) ||
413
+ (IID == GenISAIntrinsic::GenISA_InnerScalarTessFactors))
414
+ {
415
+ llvm::NamedMDNode *pMetaData = m_module->getOrInsertNamedMetadata (" TessellationShaderDomain" );
416
+ if (pMetaData && (pMetaData->getNumOperands () == 1 ))
417
+ {
418
+ llvm::MDNode* pTessShaderDomain = pMetaData->getOperand (0 );
419
+ if (pTessShaderDomain)
420
+ {
421
+ tessShaderDomain = int_cast<uint32_t >(
422
+ mdconst::dyn_extract<ConstantInt>(pTessShaderDomain->getOperand (0 ))->getZExtValue ());
423
+ }
424
+ }
425
+ numTEFactorsInDomain++;
426
+ }
386
427
}
387
428
}
388
429
return tessShaderDomain;
0 commit comments