mirror of
				https://github.com/webmproject/libwebp.git
				synced 2025-10-31 02:15:42 +01:00 
			
		
		
		
	Merge "SSE2 implementation of VP8PackARGB"
This commit is contained in:
		| @@ -37,6 +37,7 @@ LOCAL_SRC_FILES := \ | |||||||
|     src/dsp/alpha_processing_sse2.c \ |     src/dsp/alpha_processing_sse2.c \ | ||||||
|     src/dsp/argb.c \ |     src/dsp/argb.c \ | ||||||
|     src/dsp/argb_mips_dsp_r2.c \ |     src/dsp/argb_mips_dsp_r2.c \ | ||||||
|  |     src/dsp/argb_sse2.c \ | ||||||
|     src/dsp/cpu.c \ |     src/dsp/cpu.c \ | ||||||
|     src/dsp/dec.c \ |     src/dsp/dec.c \ | ||||||
|     src/dsp/dec_clip_tables.c \ |     src/dsp/dec_clip_tables.c \ | ||||||
|   | |||||||
| @@ -182,6 +182,7 @@ DSP_DEC_OBJS = \ | |||||||
|     $(DIROBJ)\dsp\alpha_processing_sse2.obj \ |     $(DIROBJ)\dsp\alpha_processing_sse2.obj \ | ||||||
|     $(DIROBJ)\dsp\argb.obj \ |     $(DIROBJ)\dsp\argb.obj \ | ||||||
|     $(DIROBJ)\dsp\argb_mips_dsp_r2.obj \ |     $(DIROBJ)\dsp\argb_mips_dsp_r2.obj \ | ||||||
|  |     $(DIROBJ)\dsp\argb_sse2.obj \ | ||||||
|     $(DIROBJ)\dsp\cpu.obj \ |     $(DIROBJ)\dsp\cpu.obj \ | ||||||
|     $(DIROBJ)\dsp\dec.obj \ |     $(DIROBJ)\dsp\dec.obj \ | ||||||
|     $(DIROBJ)\dsp\dec_clip_tables.obj \ |     $(DIROBJ)\dsp\dec_clip_tables.obj \ | ||||||
|   | |||||||
| @@ -114,6 +114,7 @@ DSP_DEC_OBJS = \ | |||||||
|     src/dsp/alpha_processing_sse2.o \ |     src/dsp/alpha_processing_sse2.o \ | ||||||
|     src/dsp/argb.o \ |     src/dsp/argb.o \ | ||||||
|     src/dsp/argb_mips_dsp_r2.o \ |     src/dsp/argb_mips_dsp_r2.o \ | ||||||
|  |     src/dsp/argb_sse2.o \ | ||||||
|     src/dsp/cpu.o \ |     src/dsp/cpu.o \ | ||||||
|     src/dsp/dec.o \ |     src/dsp/dec.o \ | ||||||
|     src/dsp/dec_clip_tables.o \ |     src/dsp/dec_clip_tables.o \ | ||||||
|   | |||||||
| @@ -11,8 +11,6 @@ commondir = $(includedir)/webp | |||||||
| COMMON_SOURCES = | COMMON_SOURCES = | ||||||
| COMMON_SOURCES += alpha_processing.c | COMMON_SOURCES += alpha_processing.c | ||||||
| COMMON_SOURCES += alpha_processing_mips_dsp_r2.c | COMMON_SOURCES += alpha_processing_mips_dsp_r2.c | ||||||
| COMMON_SOURCES += argb.c |  | ||||||
| COMMON_SOURCES += argb_mips_dsp_r2.c |  | ||||||
| COMMON_SOURCES += cpu.c | COMMON_SOURCES += cpu.c | ||||||
| COMMON_SOURCES += dec.c | COMMON_SOURCES += dec.c | ||||||
| COMMON_SOURCES += dec_clip_tables.c | COMMON_SOURCES += dec_clip_tables.c | ||||||
| @@ -37,6 +35,8 @@ COMMON_SOURCES += yuv_mips32.c | |||||||
| COMMON_SOURCES += yuv_mips_dsp_r2.c | COMMON_SOURCES += yuv_mips_dsp_r2.c | ||||||
|  |  | ||||||
| ENC_SOURCES = | ENC_SOURCES = | ||||||
|  | ENC_SOURCES += argb.c | ||||||
|  | ENC_SOURCES += argb_mips_dsp_r2.c | ||||||
| ENC_SOURCES += enc.c | ENC_SOURCES += enc.c | ||||||
| ENC_SOURCES += enc_mips32.c | ENC_SOURCES += enc_mips32.c | ||||||
| ENC_SOURCES += enc_mips_dsp_r2.c | ENC_SOURCES += enc_mips_dsp_r2.c | ||||||
| @@ -58,6 +58,7 @@ libwebpdspdecode_sse2_la_CPPFLAGS = $(libwebpdsp_sse2_la_CPPFLAGS) | |||||||
| libwebpdspdecode_sse2_la_CFLAGS = $(libwebpdsp_sse2_la_CFLAGS) | libwebpdspdecode_sse2_la_CFLAGS = $(libwebpdsp_sse2_la_CFLAGS) | ||||||
|  |  | ||||||
| libwebpdsp_sse2_la_SOURCES = | libwebpdsp_sse2_la_SOURCES = | ||||||
|  | libwebpdsp_sse2_la_SOURCES += argb_sse2.c | ||||||
| libwebpdsp_sse2_la_SOURCES += enc_sse2.c | libwebpdsp_sse2_la_SOURCES += enc_sse2.c | ||||||
| libwebpdsp_sse2_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) | libwebpdsp_sse2_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) | ||||||
| libwebpdsp_sse2_la_CFLAGS = $(AM_CFLAGS) $(SSE2_FLAGS) | libwebpdsp_sse2_la_CFLAGS = $(AM_CFLAGS) $(SSE2_FLAGS) | ||||||
|   | |||||||
| @@ -40,6 +40,7 @@ void (*VP8PackRGB)(const uint8_t*, const uint8_t*, const uint8_t*, | |||||||
|                    int, int, uint32_t*); |                    int, int, uint32_t*); | ||||||
|  |  | ||||||
| extern void VP8EncDspARGBInitMIPSdspR2(void); | extern void VP8EncDspARGBInitMIPSdspR2(void); | ||||||
|  | extern void VP8EncDspARGBInitSSE2(void); | ||||||
|  |  | ||||||
| WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspARGBInit(void) { | WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspARGBInit(void) { | ||||||
|   VP8PackARGB = PackARGB; |   VP8PackARGB = PackARGB; | ||||||
| @@ -47,6 +48,11 @@ WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspARGBInit(void) { | |||||||
|  |  | ||||||
|   // If defined, use CPUInfo() to overwrite some pointers with faster versions. |   // If defined, use CPUInfo() to overwrite some pointers with faster versions. | ||||||
|   if (VP8GetCPUInfo != NULL) { |   if (VP8GetCPUInfo != NULL) { | ||||||
|  | #if defined(WEBP_USE_SSE2) | ||||||
|  |     if (VP8GetCPUInfo(kSSE2)) { | ||||||
|  |       VP8EncDspARGBInitSSE2(); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
| #if defined(WEBP_USE_MIPS_DSP_R2) | #if defined(WEBP_USE_MIPS_DSP_R2) | ||||||
|     if (VP8GetCPUInfo(kMIPSdspR2)) { |     if (VP8GetCPUInfo(kMIPSdspR2)) { | ||||||
|       VP8EncDspARGBInitMIPSdspR2(); |       VP8EncDspARGBInitMIPSdspR2(); | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								src/dsp/argb_sse2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/dsp/argb_sse2.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | // Copyright 2014 Google Inc. All Rights Reserved. | ||||||
|  | // | ||||||
|  | // Use of this source code is governed by a BSD-style license | ||||||
|  | // that can be found in the COPYING file in the root of the source | ||||||
|  | // tree. An additional intellectual property rights grant can be found | ||||||
|  | // in the file PATENTS. All contributing project authors may | ||||||
|  | // be found in the AUTHORS file in the root of the source tree. | ||||||
|  | // ----------------------------------------------------------------------------- | ||||||
|  | // | ||||||
|  | //   ARGB making functions (SSE2 version). | ||||||
|  | // | ||||||
|  | // Author: Skal (pascal.massimino@gmail.com) | ||||||
|  |  | ||||||
|  | #include "./dsp.h" | ||||||
|  |  | ||||||
|  | #if defined(WEBP_USE_SSE2) | ||||||
|  |  | ||||||
|  | #include <assert.h> | ||||||
|  | #include <emmintrin.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
|  | static WEBP_INLINE uint32_t MakeARGB32(int a, int r, int g, int b) { | ||||||
|  |   return (((uint32_t)a << 24) | (r << 16) | (g << 8) | b); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void PackARGB(const uint8_t* a, const uint8_t* r, const uint8_t* g, | ||||||
|  |                      const uint8_t* b, int len, uint32_t* out) { | ||||||
|  |   if (g == r + 1) {  // RGBA input order. Need to swap R and B. | ||||||
|  |     int i = 0; | ||||||
|  |     const int len4 = len & ~3; | ||||||
|  |     const __m128i mask = _mm_set1_epi32(0x00ff00ffu); | ||||||
|  |     assert(b == r + 2); | ||||||
|  |     assert(a == r + 3); | ||||||
|  |     for (; i < len4; i += 4) { | ||||||
|  |       const __m128i A = _mm_loadu_si128((__m128i*)(r + 4 * i)); | ||||||
|  |       const __m128i B = _mm_and_si128(A, mask);     // R 0 B 0 | ||||||
|  |       const __m128i C = _mm_andnot_si128(mask, A);  // 0 G 0 A | ||||||
|  |       const __m128i D = _mm_shufflelo_epi16(B, _MM_SHUFFLE(2, 3, 0, 1)); | ||||||
|  |       const __m128i E = _mm_shufflehi_epi16(D, _MM_SHUFFLE(2, 3, 0, 1)); | ||||||
|  |       const __m128i F = _mm_or_si128(E, C); | ||||||
|  |       _mm_storeu_si128((__m128i*)(out + i), F); | ||||||
|  |     } | ||||||
|  |     for (; i < len; ++i) { | ||||||
|  |       out[i] = MakeARGB32(a[4 * i], r[4 * i], g[4 * i], b[4 * i]); | ||||||
|  |     } | ||||||
|  |   } else { | ||||||
|  |     assert(g == b + 1); | ||||||
|  |     assert(r == b + 2); | ||||||
|  |     assert(a == b + 3); | ||||||
|  |     memcpy(out, b, len * 4); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif    // WEBP_USE_SSE2 | ||||||
|  |  | ||||||
|  | extern void VP8EncDspARGBInitSSE2(void); | ||||||
|  |  | ||||||
|  | WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspARGBInitSSE2(void) { | ||||||
|  | #if defined(WEBP_USE_SSE2) | ||||||
|  |   VP8PackARGB = PackARGB; | ||||||
|  | #endif | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user