From 8ae991e433d2c0814ea5579613f00173805ff057 Mon Sep 17 00:00:00 2001 From: mtklein Date: Mon, 22 Aug 2016 13:20:18 -0700 Subject: 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 --- src/core/SkColorSpaceXform.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'src/core/SkColorSpaceXform.cpp') 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(SK_Half1) << 48; *((uint64_t*) dst) = tmp; } -- cgit v1.2.3