| Index: third_party/libwebp/dsp/upsampling_sse2.c
|
| diff --git a/third_party/libwebp/dsp/upsampling_sse2.c b/third_party/libwebp/dsp/upsampling_sse2.c
|
| index 45cf0906e964660643b715ed6b31124c0905fe6f..b5b668900f3adee533e1605517f2da804de61c01 100644
|
| --- a/third_party/libwebp/dsp/upsampling_sse2.c
|
| +++ b/third_party/libwebp/dsp/upsampling_sse2.c
|
| @@ -60,10 +60,10 @@
|
| // Loads 17 pixels each from rows r1 and r2 and generates 32 pixels.
|
| #define UPSAMPLE_32PIXELS(r1, r2, out) { \
|
| const __m128i one = _mm_set1_epi8(1); \
|
| - const __m128i a = _mm_loadu_si128((__m128i*)&(r1)[0]); \
|
| - const __m128i b = _mm_loadu_si128((__m128i*)&(r1)[1]); \
|
| - const __m128i c = _mm_loadu_si128((__m128i*)&(r2)[0]); \
|
| - const __m128i d = _mm_loadu_si128((__m128i*)&(r2)[1]); \
|
| + const __m128i a = _mm_loadu_si128((const __m128i*)&(r1)[0]); \
|
| + const __m128i b = _mm_loadu_si128((const __m128i*)&(r1)[1]); \
|
| + const __m128i c = _mm_loadu_si128((const __m128i*)&(r2)[0]); \
|
| + const __m128i d = _mm_loadu_si128((const __m128i*)&(r2)[1]); \
|
| \
|
| const __m128i s = _mm_avg_epu8(a, d); /* s = (a + d + 1) / 2 */ \
|
| const __m128i t = _mm_avg_epu8(b, c); /* t = (b + c + 1) / 2 */ \
|
| @@ -173,6 +173,9 @@ SSE2_UPSAMPLE_FUNC(UpsampleRgbLinePair, VP8YuvToRgb, 3)
|
| SSE2_UPSAMPLE_FUNC(UpsampleBgrLinePair, VP8YuvToBgr, 3)
|
| SSE2_UPSAMPLE_FUNC(UpsampleRgbaLinePair, VP8YuvToRgba, 4)
|
| SSE2_UPSAMPLE_FUNC(UpsampleBgraLinePair, VP8YuvToBgra, 4)
|
| +SSE2_UPSAMPLE_FUNC(UpsampleArgbLinePair, VP8YuvToArgb, 4)
|
| +SSE2_UPSAMPLE_FUNC(UpsampleRgba4444LinePair, VP8YuvToRgba4444, 2)
|
| +SSE2_UPSAMPLE_FUNC(UpsampleRgb565LinePair, VP8YuvToRgb565, 2)
|
|
|
| #undef GET_M
|
| #undef PACK_AND_STORE
|
| @@ -182,33 +185,65 @@ SSE2_UPSAMPLE_FUNC(UpsampleBgraLinePair, VP8YuvToBgra, 4)
|
| #undef CONVERT2RGB_32
|
| #undef SSE2_UPSAMPLE_FUNC
|
|
|
| -#endif // FANCY_UPSAMPLING
|
| -
|
| -#endif // WEBP_USE_SSE2
|
| -
|
| //------------------------------------------------------------------------------
|
| -
|
| -extern void WebPInitUpsamplersSSE2(void);
|
| -
|
| -#ifdef FANCY_UPSAMPLING
|
| +// Entry point
|
|
|
| extern WebPUpsampleLinePairFunc WebPUpsamplers[/* MODE_LAST */];
|
|
|
| -void WebPInitUpsamplersSSE2(void) {
|
| -#if defined(WEBP_USE_SSE2)
|
| - VP8YUVInitSSE2();
|
| +extern void WebPInitUpsamplersSSE2(void);
|
| +
|
| +WEBP_TSAN_IGNORE_FUNCTION void WebPInitUpsamplersSSE2(void) {
|
| WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair;
|
| WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePair;
|
| WebPUpsamplers[MODE_BGR] = UpsampleBgrLinePair;
|
| WebPUpsamplers[MODE_BGRA] = UpsampleBgraLinePair;
|
| + WebPUpsamplers[MODE_ARGB] = UpsampleArgbLinePair;
|
| WebPUpsamplers[MODE_rgbA] = UpsampleRgbaLinePair;
|
| WebPUpsamplers[MODE_bgrA] = UpsampleBgraLinePair;
|
| -#endif // WEBP_USE_SSE2
|
| + WebPUpsamplers[MODE_Argb] = UpsampleArgbLinePair;
|
| + WebPUpsamplers[MODE_RGB_565] = UpsampleRgb565LinePair;
|
| + WebPUpsamplers[MODE_RGBA_4444] = UpsampleRgba4444LinePair;
|
| + WebPUpsamplers[MODE_rgbA_4444] = UpsampleRgba4444LinePair;
|
| +}
|
| +
|
| +#endif // FANCY_UPSAMPLING
|
| +
|
| +//------------------------------------------------------------------------------
|
| +
|
| +extern WebPYUV444Converter WebPYUV444Converters[/* MODE_LAST */];
|
| +extern void WebPInitYUV444ConvertersSSE2(void);
|
| +
|
| +#define YUV444_FUNC(FUNC_NAME, CALL, XSTEP) \
|
| +extern void WebP##FUNC_NAME##C(const uint8_t* y, const uint8_t* u, \
|
| + const uint8_t* v, uint8_t* dst, int len); \
|
| +static void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \
|
| + uint8_t* dst, int len) { \
|
| + int i; \
|
| + const int max_len = len & ~31; \
|
| + for (i = 0; i < max_len; i += 32) CALL(y + i, u + i, v + i, dst + i * XSTEP);\
|
| + if (i < len) { /* C-fallback */ \
|
| + WebP##FUNC_NAME##C(y + i, u + i, v + i, dst + i * XSTEP, len - i); \
|
| + } \
|
| +}
|
| +
|
| +YUV444_FUNC(Yuv444ToRgba, VP8YuvToRgba32, 4);
|
| +YUV444_FUNC(Yuv444ToBgra, VP8YuvToBgra32, 4);
|
| +YUV444_FUNC(Yuv444ToRgb, VP8YuvToRgb32, 3);
|
| +YUV444_FUNC(Yuv444ToBgr, VP8YuvToBgr32, 3);
|
| +
|
| +WEBP_TSAN_IGNORE_FUNCTION void WebPInitYUV444ConvertersSSE2(void) {
|
| + WebPYUV444Converters[MODE_RGBA] = Yuv444ToRgba;
|
| + WebPYUV444Converters[MODE_BGRA] = Yuv444ToBgra;
|
| + WebPYUV444Converters[MODE_RGB] = Yuv444ToRgb;
|
| + WebPYUV444Converters[MODE_BGR] = Yuv444ToBgr;
|
| }
|
|
|
| #else
|
|
|
| -// this empty function is to avoid an empty .o
|
| -void WebPInitUpsamplersSSE2(void) {}
|
| +WEBP_DSP_INIT_STUB(WebPInitYUV444ConvertersSSE2)
|
|
|
| -#endif // FANCY_UPSAMPLING
|
| +#endif // WEBP_USE_SSE2
|
| +
|
| +#if !(defined(FANCY_UPSAMPLING) && defined(WEBP_USE_SSE2))
|
| +WEBP_DSP_INIT_STUB(WebPInitUpsamplersSSE2)
|
| +#endif
|
|
|