in d3d/archive/images/d3d11/tessellator.cpp [1700:1750]
void CHWTessellator::ComputeTessFactorContext( FXP fxpTessFactor, TESS_FACTOR_CONTEXT& TessFactorCtx )
{
FXP fxpHalfTessFactor = (fxpTessFactor+1/*round*/)/2;
if( Odd() || (fxpHalfTessFactor == FXP_ONE_HALF)) // fxpHalfTessFactor == 1/2 if TessFactor is 1, but we're pretending we are even.
{
fxpHalfTessFactor += FXP_ONE_HALF;
}
FXP fxpFloorHalfTessFactor = fxpFloor(fxpHalfTessFactor);
FXP fxpCeilHalfTessFactor = fxpCeil(fxpHalfTessFactor);
TessFactorCtx.fxpHalfTessFactorFraction = fxpHalfTessFactor - fxpFloorHalfTessFactor;
//CleanseParameter(TessFactorCtx.fxpHalfTessFactorFraction);
TessFactorCtx.numHalfTessFactorPoints = (fxpCeilHalfTessFactor>>FXP_FRACTION_BITS); // for EVEN, we don't include the point always fixed at the midpoint of the TessFactor
if( fxpCeilHalfTessFactor == fxpFloorHalfTessFactor )
{
TessFactorCtx.splitPointOnFloorHalfTessFactor = /*pick value to cause this to be ignored*/ TessFactorCtx.numHalfTessFactorPoints+1;
}
else if( Odd() )
{
if( fxpFloorHalfTessFactor == FXP_ONE )
{
TessFactorCtx.splitPointOnFloorHalfTessFactor = 0;
}
else
{
#ifdef ALLOW_XBOX_360_COMPARISON
if( m_bXBox360Mode )
TessFactorCtx.splitPointOnFloorHalfTessFactor = TessFactorCtx.numHalfTessFactorPoints-2;
else
#endif
TessFactorCtx.splitPointOnFloorHalfTessFactor = (RemoveMSB((fxpFloorHalfTessFactor>>FXP_FRACTION_BITS)-1)<<1) + 1;
}
}
else
{
#ifdef ALLOW_XBOX_360_COMPARISON
if( m_bXBox360Mode )
TessFactorCtx.splitPointOnFloorHalfTessFactor = TessFactorCtx.numHalfTessFactorPoints-1;
else
#endif
TessFactorCtx.splitPointOnFloorHalfTessFactor = (RemoveMSB(fxpFloorHalfTessFactor>>FXP_FRACTION_BITS)<<1) + 1;
}
int numFloorSegments = (fxpFloorHalfTessFactor * 2)>>FXP_FRACTION_BITS;
int numCeilSegments = (fxpCeilHalfTessFactor * 2)>>FXP_FRACTION_BITS;
if( Odd() )
{
numFloorSegments -= 1;
numCeilSegments -= 1;
}
TessFactorCtx.fxpInvNumSegmentsOnFloorTessFactor = s_fixedReciprocal[numFloorSegments];
TessFactorCtx.fxpInvNumSegmentsOnCeilTessFactor = s_fixedReciprocal[numCeilSegments];
}