summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPascal Massimino <pascal.massimino@gmail.com>2015-01-05 06:51:54 -0800
committerJames Zern <jzern@google.com>2015-03-02 18:43:31 -0800
commit3ae78eb757f43d5ce72e7c9890602861e5be98e8 (patch)
tree60fd58b6a1e33ff7348a1ea00aa08e48f4686f01
parent5c1eeda9228ee0cbeec77c198106cd2b3901b26e (diff)
downloadlibwebp-3ae78eb757f43d5ce72e7c9890602861e5be98e8.tar.gz
multi-thread fix: lock each entry points with a static var
we compare the current VP8GetCPUInfo pointer to the last used. This is less code overall and each implementation is still testable separately (by just changing VP8GetCPUInfo, but not a separate threads!) (cherry picked from commit a437694a17e2ee4c68bf0abba8e45e0dfd2a8e27) Conflicts: src/dsp/alpha_processing.c src/dsp/argb.c src/dsp/dec.c src/dsp/enc.c src/dsp/lossless.c src/dsp/upsampling.c src/dsp/yuv.c Change-Id: Ia13fa8ffc4561a884508f6ab71ed0d1b9f1ce59b
-rw-r--r--src/dsp/alpha_processing.c5
-rw-r--r--src/dsp/dec.c6
-rw-r--r--src/dsp/enc.c5
-rw-r--r--src/dsp/lossless.c5
-rw-r--r--src/dsp/upsampling.c5
-rw-r--r--src/dsp/yuv.c5
6 files changed, 30 insertions, 1 deletions
diff --git a/src/dsp/alpha_processing.c b/src/dsp/alpha_processing.c
index d0f7a6cc..ac88c60d 100644
--- a/src/dsp/alpha_processing.c
+++ b/src/dsp/alpha_processing.c
@@ -311,7 +311,11 @@ int (*WebPExtractAlpha)(const uint8_t*, int, int, int, uint8_t*, int);
extern void WebPInitAlphaProcessingSSE2(void);
+static volatile VP8CPUInfo last_cpuinfo_used = (VP8CPUInfo)&last_cpuinfo_used;
+
void WebPInitAlphaProcessing(void) {
+ if (last_cpuinfo_used == VP8GetCPUInfo) return;
+
WebPMultARGBRow = MultARGBRow;
WebPMultRow = MultRow;
WebPApplyAlphaMultiply = ApplyAlphaMultiply;
@@ -326,4 +330,5 @@ void WebPInitAlphaProcessing(void) {
}
#endif
}
+ last_cpuinfo_used = VP8GetCPUInfo;
}
diff --git a/src/dsp/dec.c b/src/dsp/dec.c
index 65a2a885..35f3cf2a 100644
--- a/src/dsp/dec.c
+++ b/src/dsp/dec.c
@@ -688,7 +688,11 @@ extern void VP8DspInitSSE2(void);
extern void VP8DspInitNEON(void);
extern void VP8DspInitMIPS32(void);
+static volatile VP8CPUInfo last_cpuinfo_used = (VP8CPUInfo)&last_cpuinfo_used;
+
void VP8DspInit(void) {
+ if (last_cpuinfo_used == VP8GetCPUInfo) return;
+
VP8InitClipTables();
VP8TransformWHT = TransformWHT;
@@ -727,5 +731,5 @@ void VP8DspInit(void) {
}
#endif
}
+ last_cpuinfo_used = VP8GetCPUInfo;
}
-
diff --git a/src/dsp/enc.c b/src/dsp/enc.c
index e4ea8cb8..a5fcf5dd 100644
--- a/src/dsp/enc.c
+++ b/src/dsp/enc.c
@@ -692,7 +692,11 @@ extern void VP8EncDspInitAVX2(void);
extern void VP8EncDspInitNEON(void);
extern void VP8EncDspInitMIPS32(void);
+static volatile VP8CPUInfo last_cpuinfo_used = (VP8CPUInfo)&last_cpuinfo_used;
+
void VP8EncDspInit(void) {
+ if (last_cpuinfo_used == VP8GetCPUInfo) return;
+
VP8DspInit(); // common inverse transforms
InitTables();
@@ -737,5 +741,6 @@ void VP8EncDspInit(void) {
}
#endif
}
+ last_cpuinfo_used = VP8GetCPUInfo;
}
diff --git a/src/dsp/lossless.c b/src/dsp/lossless.c
index a1bf3584..7c5784db 100644
--- a/src/dsp/lossless.c
+++ b/src/dsp/lossless.c
@@ -1590,7 +1590,11 @@ extern void VP8LDspInitSSE2(void);
extern void VP8LDspInitNEON(void);
extern void VP8LDspInitMIPS32(void);
+static volatile VP8CPUInfo last_cpuinfo_used = (VP8CPUInfo)&last_cpuinfo_used;
+
void VP8LDspInit(void) {
+ if (last_cpuinfo_used == VP8GetCPUInfo) return;
+
memcpy(VP8LPredictors, kPredictorsC, sizeof(VP8LPredictors));
VP8LSubtractGreenFromBlueAndRed = VP8LSubtractGreenFromBlueAndRed_C;
@@ -1634,6 +1638,7 @@ void VP8LDspInit(void) {
}
#endif
}
+ last_cpuinfo_used = VP8GetCPUInfo;
}
//------------------------------------------------------------------------------
diff --git a/src/dsp/upsampling.c b/src/dsp/upsampling.c
index 2b1656bf..c787782d 100644
--- a/src/dsp/upsampling.c
+++ b/src/dsp/upsampling.c
@@ -189,7 +189,11 @@ const WebPYUV444Converter WebPYUV444Converters[MODE_LAST] = {
extern void WebPInitUpsamplersSSE2(void);
extern void WebPInitUpsamplersNEON(void);
+static volatile VP8CPUInfo last_cpuinfo_used2 = (VP8CPUInfo)&last_cpuinfo_used2;
+
void WebPInitUpsamplers(void) {
+ if (last_cpuinfo_used2 == VP8GetCPUInfo) return;
+
#ifdef FANCY_UPSAMPLING
WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair;
WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePair;
@@ -217,6 +221,7 @@ void WebPInitUpsamplers(void) {
#endif
}
#endif // FANCY_UPSAMPLING
+ last_cpuinfo_used2 = VP8GetCPUInfo;
}
//------------------------------------------------------------------------------
diff --git a/src/dsp/yuv.c b/src/dsp/yuv.c
index d7cb4ebc..8213074d 100644
--- a/src/dsp/yuv.c
+++ b/src/dsp/yuv.c
@@ -123,7 +123,11 @@ WebPSamplerRowFunc WebPSamplers[MODE_LAST];
extern void WebPInitSamplersSSE2(void);
extern void WebPInitSamplersMIPS32(void);
+static volatile VP8CPUInfo last_cpuinfo_used = (VP8CPUInfo)&last_cpuinfo_used;
+
void WebPInitSamplers(void) {
+ if (last_cpuinfo_used == VP8GetCPUInfo) return;
+
WebPSamplers[MODE_RGB] = YuvToRgbRow;
WebPSamplers[MODE_RGBA] = YuvToRgbaRow;
WebPSamplers[MODE_BGR] = YuvToBgrRow;
@@ -149,6 +153,7 @@ void WebPInitSamplers(void) {
}
#endif // WEBP_USE_MIPS32
}
+ last_cpuinfo_used = VP8GetCPUInfo;
}
//-----------------------------------------------------------------------------