Skip to content

Commit 4be564f

Browse files
lfilipkogfxbot
authored andcommitted
Revert of:
Tessellation factors padding in URB header Change-Id: Ie58b1746b72a0442131c28d067dbfbdf15d83153
1 parent 811891f commit 4be564f

File tree

1 file changed

+61
-20
lines changed

1 file changed

+61
-20
lines changed

IGC/Compiler/CISACodeGen/HullShaderLowering.cpp

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class HullShaderLowering : public llvm::FunctionPass
5252
private:
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

Comments
 (0)