@@ -52,7 +52,7 @@ class HullShaderLowering : public llvm::FunctionPass
5252private:
5353 void LowerIntrinsicInputOutput (llvm::Function &F);
5454
55- unsigned int GetDomainType ();
55+ unsigned int GetDomainType (llvm::BasicBlock * bb, unsigned & numTEFactorsInDomain );
5656
5757 llvm::GenIntrinsicInst* AddURBWriteControlPointOutputs (
5858 Value* mask,
@@ -126,15 +126,16 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
126126{
127127 SmallVector<Instruction*, 10 > instructionToRemove;
128128
129- IRBuilder<> builder (F.getContext ());
129+ IRBuilder<> builder (F.getContext ());
130130
131131 IGC::CodeGenContext* ctx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext ();
132132
133133 for (auto BI = F.begin (), BE = F.end (); BI != BE; BI++)
134134 {
135135 m_pControlPointOutputs.clear ();
136-
136+
137137 bool isTEFactorURBMsgPadded = false ;
138+ unsigned int numTEFactorsInDomain = 0 ;
138139
139140 for (auto II = BI->begin (), IE = BI->end (); II!=IE; II++)
140141 {
@@ -240,25 +241,43 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
240241 instructionToRemove.push_back (inst);
241242 }
242243
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)))
245249 {
246- // Apply URB padding for TE factors.
247- if (IGC_IS_FLAG_ENABLED (EnableTEFactorsPadding) && ctx->platform .applyTEFactorsPadding ())
250+ if (!isTEFactorURBMsgPadded)
248251 {
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))
250260 {
261+
262+ // Adjust the mask value based on the TE factors number.
263+ unsigned int mask = (1 << (8 - numTEFactorsInDomain)) - 1 ;
264+
251265 Value* undef = llvm::UndefValue::get (Type::getFloatTy (F.getContext ()));
252266 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);
257272
258273 isTEFactorURBMsgPadded = true ;
259274 }
260275 }
276+ }
261277
278+ if ((IID == GenISAIntrinsic::GenISA_OuterScalarTessFactors) ||
279+ (IID == GenISAIntrinsic::GenISA_InnerScalarTessFactors))
280+ {
262281 // The URB Location for tessellation factors spans the first two offsets
263282 // offset 0 and 1. The tessellation factors occupy the two offsets as mentioned below
264283 // Quad domain has 4 outer and 2 inner tessellation factors
@@ -284,7 +303,17 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
284303 // | | | | |
285304 // ------------------------------------------------------------------------------------
286305
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+ }
288317
289318 // offset into URB is 1 for outerScalarTessFactors and
290319 // 1 if its triangle domain and inner scalar tessellation factor
@@ -372,17 +401,29 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
372401 }
373402}
374403
375- unsigned int HullShaderLowering::GetDomainType ()
404+ unsigned int HullShaderLowering::GetDomainType (llvm::BasicBlock* bb, unsigned &numTEFactorsInDomain )
376405{
377406 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++)
380408 {
381- llvm::MDNode* pTessShaderDomain = pMetaData->getOperand (0 );
382- if (pTessShaderDomain)
409+ if (GenIntrinsicInst* inst = dyn_cast<GenIntrinsicInst>(II))
383410 {
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+ }
386427 }
387428 }
388429 return tessShaderDomain;
0 commit comments