@@ -1762,18 +1762,28 @@ inline value_type getFormatMaxValue(E_FORMAT format, uint32_t channel)
1762
1762
{
1763
1763
switch (format)
1764
1764
{
1765
- case EF_BC6H_SFLOAT_BLOCK: return 32767 ;
1766
- case EF_BC6H_UFLOAT_BLOCK: return 65504 ;
1767
- default : break ;
1765
+ case EF_B10G11R11_UFLOAT_PACK32:
1766
+ if (channel<=1 )
1767
+ return 65520 ;
1768
+ else if (channel==2 )
1769
+ return 65504 ;
1770
+ break ;
1771
+ case EF_E5B9G9R9_UFLOAT_PACK32:
1772
+ if (channel<3 )
1773
+ return 32704 ;
1774
+ break ;
1775
+ case EF_BC6H_SFLOAT_BLOCK: return 32767 ;
1776
+ case EF_BC6H_UFLOAT_BLOCK: return 65504 ;
1777
+ default : break ;
1768
1778
}
1769
1779
1770
1780
auto bytesPerChannel = (getBytesPerPixel (format)*core::rational (1 ,getFormatChannelCount (format))).getIntegerApprox ();
1771
1781
switch (bytesPerChannel)
1772
1782
{
1773
- case 2u : return 65504 ;
1774
- case 4u : return FLT_MAX;
1775
- case 8u : return DBL_MAX;
1776
- default : break ;
1783
+ case 2u : return 65504 ;
1784
+ case 4u : return FLT_MAX;
1785
+ case 8u : return DBL_MAX;
1786
+ default : break ;
1777
1787
}
1778
1788
}
1779
1789
return 0 ;
@@ -1882,44 +1892,47 @@ inline value_type getFormatPrecision(E_FORMAT format, uint32_t channel, value_ty
1882
1892
else if (isFloatingPointFormat (format))
1883
1893
{
1884
1894
switch (format)
1885
- {
1886
- case EF_B10G11R11_UFLOAT_PACK32:
1887
1895
{
1888
1896
// unsigned values are always ordered as + 1
1889
- float f = std::abs (static_cast <float >(value));
1890
- int bitshft = channel == 2u ? 6 : 5 ;
1891
-
1892
- uint16_t f16 = core::Float16Compressor::compress (f);
1893
- uint16_t enc = f16 >> bitshft;
1894
- uint16_t next_f16 = (enc + 1 ) << bitshft;
1895
-
1896
- return core::Float16Compressor::decompress (next_f16) - f;
1897
- }
1898
- case EF_E5B9G9R9_UFLOAT_PACK32:
1899
- return 0 ; // TODO
1900
- default : break ;
1897
+ case EF_B10G11R11_UFLOAT_PACK32: [[fallthrough]];
1898
+ case EF_E5B9G9R9_UFLOAT_PACK32: // TODO: probably need to change signature and take all values?
1899
+ {
1900
+ float f = std::abs (static_cast <float >(value));
1901
+ int bitshift;
1902
+ if (format==EF_B10G11R11_UFLOAT_PACK32)
1903
+ bitshift = channel==2u ? 6 :5 ;
1904
+ else
1905
+ bitshift = 4 ;
1906
+
1907
+ uint16_t f16 = core::Float16Compressor::compress (f);
1908
+ uint16_t enc = f16 >> bitshift;
1909
+ uint16_t next_f16 = (enc + 1 ) << bitshift;
1910
+
1911
+ return core::Float16Compressor::decompress (next_f16) - f;
1912
+ }
1913
+ default : break ;
1901
1914
}
1902
1915
auto bytesPerChannel = (getBytesPerPixel (format)*core::rational (1 ,getFormatChannelCount (format))).getIntegerApprox ();
1903
1916
switch (bytesPerChannel)
1904
1917
{
1905
- case 2u :
1906
- {
1907
- float f = std::abs (static_cast <float >(value));
1908
- uint16_t f16 = core::Float16Compressor::compress (f);
1909
- uint16_t dir = core::Float16Compressor::compress (2 .f *(f+1 .f ));
1910
- return core::Float16Compressor::decompress ( core::nextafter16 (f16 , dir) ) - f;
1911
- }
1912
- case 4u :
1913
- {
1914
- float f32 = std::abs (static_cast <float >(value));
1915
- return core::nextafter32 (f32 ,2 .f *(f32 +1 .f ))-f32 ;
1916
- }
1917
- case 8u :
1918
- {
1919
- double f64 = std::abs (static_cast <double >(value));
1920
- return core::nextafter64 (f64 ,2.0 *(f64 +1.0 ))-f64 ;
1921
- }
1922
- default : break ;
1918
+ case 2u :
1919
+ {
1920
+ float f = std::abs (static_cast <float >(value));
1921
+ uint16_t f16 = core::Float16Compressor::compress (f);
1922
+ uint16_t dir = core::Float16Compressor::compress (2 .f *(f+1 .f ));
1923
+ return core::Float16Compressor::decompress ( core::nextafter16 (f16 , dir) ) - f;
1924
+ }
1925
+ case 4u :
1926
+ {
1927
+ float f32 = std::abs (static_cast <float >(value));
1928
+ return core::nextafter32 (f32 ,2 .f *(f32 +1 .f ))-f32 ;
1929
+ }
1930
+ case 8u :
1931
+ {
1932
+ double f64 = std::abs (static_cast <double >(value));
1933
+ return core::nextafter64 (f64 ,2.0 *(f64 +1.0 ))-f64 ;
1934
+ }
1935
+ default : break ;
1923
1936
}
1924
1937
}
1925
1938
0 commit comments