diff options
author | 2016-08-22 13:20:18 -0700 | |
---|---|---|
committer | 2016-08-22 13:20:18 -0700 | |
commit | 8ae991e433d2c0814ea5579613f00173805ff057 (patch) | |
tree | 03948b83317a26c3a1c176c3bfd102a044b0beca /src/core/SkColorSpaceXform.cpp | |
parent | 4f3a0ca85d28a8fc7fcc1ac5c4a1864c66bdea14 (diff) |
Flush denorm half floats to zero.
I think we convinced ourselves that denorms, while a good chunk of half floats,
cover a rather small fraction of the representable range, which is always
close enough to zero to flush.
This makes both paths of the conversion to or from float considerably simpler.
These functions now work for zero-or-normal half floats (excluding infinite, NaN).
I'm not aware of a term for this class so I've called them "ordinary".
A handful of GMs and SKPs draw differently in --config f16, but all imperceptibly.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2256023002
Review-Url: https://codereview.chromium.org/2256023002
Diffstat (limited to 'src/core/SkColorSpaceXform.cpp')
-rw-r--r-- | src/core/SkColorSpaceXform.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp index 3795d2d8d6..f445939267 100644 --- a/src/core/SkColorSpaceXform.cpp +++ b/src/core/SkColorSpaceXform.cpp @@ -876,25 +876,25 @@ static inline void store_2dot2_1(void* dst, const uint32_t* src, static inline void store_f16(void* dst, const uint32_t* src, Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da, const uint8_t* const[3], SwapRB) { - Sk4h_store4(dst, SkFloatToHalf_finite(dr), - SkFloatToHalf_finite(dg), - SkFloatToHalf_finite(db), - SkFloatToHalf_finite(da)); + Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr), + SkFloatToHalf_finite_ftz(dg), + SkFloatToHalf_finite_ftz(db), + SkFloatToHalf_finite_ftz(da)); } static inline void store_f16_1(void* dst, const uint32_t* src, Sk4f& rgba, const Sk4f& a, const uint8_t* const[3], SwapRB kSwapRB) { rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]); - SkFloatToHalf_finite(rgba).store((uint64_t*) dst); + SkFloatToHalf_finite_ftz(rgba).store((uint64_t*) dst); } static inline void store_f16_opaque(void* dst, const uint32_t* src, Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da, const uint8_t* const[3], SwapRB) { - Sk4h_store4(dst, SkFloatToHalf_finite(dr), - SkFloatToHalf_finite(dg), - SkFloatToHalf_finite(db), + Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr), + SkFloatToHalf_finite_ftz(dg), + SkFloatToHalf_finite_ftz(db), SK_Half1); } @@ -902,7 +902,7 @@ static inline void store_f16_1_opaque(void* dst, const uint32_t* src, Sk4f& rgba, const Sk4f& a, const uint8_t* const[3], SwapRB kSwapRB) { uint64_t tmp; - SkFloatToHalf_finite(rgba).store(&tmp); + SkFloatToHalf_finite_ftz(rgba).store(&tmp); tmp |= static_cast<uint64_t>(SK_Half1) << 48; *((uint64_t*) dst) = tmp; } |