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 |