@@ -226,7 +226,7 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
226
226
{
227
227
// for each BB handle OutputHSControlPoint intrinsic instructions
228
228
Value* undef = llvm::UndefValue::get (Type::getFloatTy (F.getContext ()));
229
- Value* data[8 ] =
229
+ Value* data[8 ] =
230
230
{
231
231
inst->getOperand (0 ),
232
232
inst->getOperand (1 ),
@@ -253,7 +253,7 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
253
253
// Parse all instructions within BB and count the Inner,Outer ScalarTessFactors factors
254
254
// and get the domain type.
255
255
BasicBlock* bb = dyn_cast<BasicBlock>(BI);
256
- uint32_t tessShaderDomain = GetDomainType (bb, numTEFactorsInDomain);
256
+ uint32_t tessShaderDomain = GetDomainType (bb, numTEFactorsInDomain);
257
257
258
258
if ((numTEFactorsInDomain == 2 && tessShaderDomain == USC::TESSELLATOR_DOMAIN_ISOLINE) ||
259
259
(numTEFactorsInDomain == 4 && tessShaderDomain == USC::TESSELLATOR_DOMAIN_TRI) ||
@@ -273,20 +273,20 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
273
273
274
274
isTEFactorURBMsgPadded = true ;
275
275
}
276
- }
276
+ }
277
277
}
278
278
279
279
if ((IID == GenISAIntrinsic::GenISA_OuterScalarTessFactors) ||
280
280
(IID == GenISAIntrinsic::GenISA_InnerScalarTessFactors))
281
281
{
282
- // The URB Location for tessellation factors spans the first two offsets
282
+ // The URB Location for tessellation factors spans the first two offsets
283
283
// offset 0 and 1. The tessellation factors occupy the two offsets as mentioned below
284
284
// Quad domain has 4 outer and 2 inner tessellation factors
285
285
// Triangle domain has 3 outer and 1 inner tessellation factor
286
286
// Isolines have 2 outer tessellation factors
287
287
//
288
288
// ----------------------------------------------------------------------------------
289
- // | URB Offset 1.3 | URB Offset 1.2 | URB Offset 1.1 | URB Offset 1.0 |
289
+ // | URB Offset 1.3 | URB Offset 1.2 | URB Offset 1.1 | URB Offset 1.0 |
290
290
// ----------------------------------------------------------------------------------
291
291
// | OUTER_QUAD_U_EQ_0 | OUTER_QUAD_V_EQ_0 | OUTER_QUAD_U_EQ_1 | OUTER_QUAD_V_EQ_1 |
292
292
// ----------------------------------------------------------------------------------
@@ -316,7 +316,7 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
316
316
}
317
317
}
318
318
319
- // offset into URB is 1 for outerScalarTessFactors and
319
+ // offset into URB is 1 for outerScalarTessFactors and
320
320
// 1 if its triangle domain and inner scalar tessellation factor
321
321
// 0 if its the quad domain inner tessellation factor
322
322
int offset = (IID == GenISAIntrinsic::GenISA_OuterScalarTessFactors) ? 1 :
@@ -339,8 +339,19 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
339
339
{
340
340
unsigned int tessFactor = int_cast<unsigned int >(llvm::cast<ConstantInt>(inst->getOperand (0 ))->getZExtValue ());
341
341
342
- tessFactor = ((IID == GenISAIntrinsic::GenISA_InnerScalarTessFactors)
343
- && (tessShaderDomain == USC::TESSELLATOR_DOMAIN_TRI)) ? 3 : tessFactor;
342
+ if (tessShaderDomain == USC::TESSELLATOR_DOMAIN_ISOLINE)
343
+ {
344
+ // For isolines first tessellation factor(0) is line-density. The second one(1)
345
+ // is line-detail tessellation factor. To store them properly in patch header
346
+ // we need to set correct bits in URB write mask i.e. 0x4 for line-density
347
+ // and 0x8 for line-detail. Swap the indexes.
348
+ tessFactor ^= 1 ;
349
+ }
350
+ else
351
+ {
352
+ tessFactor = ((IID == GenISAIntrinsic::GenISA_InnerScalarTessFactors) &&
353
+ (tessShaderDomain == USC::TESSELLATOR_DOMAIN_TRI)) ? 3 : tessFactor;
354
+ }
344
355
345
356
AddURBWrite (pOffsetVal,
346
357
builder.getInt32 (1 << (3 - tessFactor)),
@@ -351,16 +362,26 @@ void HullShaderLowering::LowerIntrinsicInputOutput(Function& F)
351
362
{
352
363
builder.SetInsertPoint (inst);
353
364
Value* pSubRes = nullptr ;
365
+ Value* pSubResRHS = nullptr ;
354
366
if ((IID == GenISAIntrinsic::GenISA_InnerScalarTessFactors)
355
367
&& (tessShaderDomain == USC::TESSELLATOR_DOMAIN_TRI))
356
368
{
357
369
pSubRes = inst->getOperand (0 );
358
370
}
359
371
else
360
372
{
373
+ if (tessShaderDomain == USC::TESSELLATOR_DOMAIN_ISOLINE)
374
+ {
375
+ pSubResRHS = builder.CreateXor (inst->getOperand (0 ), builder.getInt32 (1 ));
376
+ }
377
+ else
378
+ {
379
+ pSubResRHS = inst->getOperand (0 );
380
+ }
381
+
361
382
pSubRes = builder.CreateSub (
362
383
builder.getInt32 (3 ),
363
- inst-> getOperand ( 0 ) );
384
+ pSubResRHS );
364
385
}
365
386
366
387
Value* pShiftVal = builder.CreateShl (
0 commit comments