@@ -1648,9 +1648,7 @@ bool DirectX::_StoreScanline(
1648
1648
for (size_t icount = 0 ; icount < (size - sizeof (XMHALF4) + 1 ); icount += sizeof (XMHALF4))
1649
1649
{
1650
1650
if (sPtr >= ePtr) break ;
1651
- XMVECTOR v = *sPtr ++;
1652
- v = XMVectorClamp (v, g_HalfMin, g_HalfMax);
1653
- XMStoreHalf4 (dPtr++, v);
1651
+ XMStoreHalf4 (dPtr++, *sPtr ++);
1654
1652
}
1655
1653
return true ;
1656
1654
}
@@ -1841,9 +1839,7 @@ bool DirectX::_StoreScanline(
1841
1839
for (size_t icount = 0 ; icount < (size - sizeof (HALF) + 1 ); icount += sizeof (HALF))
1842
1840
{
1843
1841
if (sPtr >= ePtr) break ;
1844
- float v = XMVectorGetX (*sPtr ++);
1845
- v = std::max<float >(std::min<float >(v, 65504 .f ), -65504 .f );
1846
- *(dPtr++) = XMConvertFloatToHalf (v);
1842
+ *(dPtr++) = XMConvertFloatToHalf (XMVectorGetX (*sPtr ++));
1847
1843
}
1848
1844
return true ;
1849
1845
}
@@ -3598,6 +3594,24 @@ void DirectX::_ConvertScanline(
3598
3594
}
3599
3595
}
3600
3596
}
3597
+
3598
+ // Half-float sanitization
3599
+ if (!(out->flags & CONVF_DEPTH) && (out->flags & CONVF_FLOAT) && out->datasize == 16 && (!(flags & TEX_FILTER_FLOAT16_SATURATE_TO_INF) || !(flags & TEX_FILTER_FLOAT16_KEEP_NANS)))
3600
+ {
3601
+ XMVECTOR* ptr = pBuffer;
3602
+ for (size_t i = 0 ; i < count; ++i, ++ptr)
3603
+ {
3604
+ XMVECTOR v = *ptr;
3605
+
3606
+ if (!(flags & TEX_FILTER_FLOAT16_SATURATE_TO_INF))
3607
+ v = XMVectorClamp (v, g_HalfMin, g_HalfMax);
3608
+
3609
+ if (!(flags & TEX_FILTER_FLOAT16_KEEP_NANS))
3610
+ v = XMVectorSelect (v, XMVectorZero (), XMVectorIsNaN (v));
3611
+
3612
+ *ptr = v;
3613
+ }
3614
+ }
3601
3615
}
3602
3616
3603
3617
0 commit comments