1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/patches/archive/arm-fixes.patch Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,191 @@ 1.4 +diff --git a/gfx/skia/include/core/SkMath.h b/gfx/skia/include/core/SkMath.h 1.5 +--- a/gfx/skia/include/core/SkMath.h 1.6 ++++ b/gfx/skia/include/core/SkMath.h 1.7 +@@ -148,20 +148,17 @@ static inline bool SkIsPow2(int value) { 1.8 + } 1.9 + 1.10 + /////////////////////////////////////////////////////////////////////////////// 1.11 + 1.12 + /** SkMulS16(a, b) multiplies a * b, but requires that a and b are both int16_t. 1.13 + With this requirement, we can generate faster instructions on some 1.14 + architectures. 1.15 + */ 1.16 +-#if defined(__arm__) \ 1.17 +- && !defined(__thumb__) \ 1.18 +- && !defined(__ARM_ARCH_4T__) \ 1.19 +- && !defined(__ARM_ARCH_5T__) 1.20 ++#ifdef SK_ARM_HAS_EDSP 1.21 + static inline int32_t SkMulS16(S16CPU x, S16CPU y) { 1.22 + SkASSERT((int16_t)x == x); 1.23 + SkASSERT((int16_t)y == y); 1.24 + int32_t product; 1.25 + asm("smulbb %0, %1, %2 \n" 1.26 + : "=r"(product) 1.27 + : "r"(x), "r"(y) 1.28 + ); 1.29 +diff --git a/gfx/skia/include/core/SkPostConfig.h b/gfx/skia/include/core/SkPostConfig.h 1.30 +--- a/gfx/skia/include/core/SkPostConfig.h 1.31 ++++ b/gfx/skia/include/core/SkPostConfig.h 1.32 +@@ -300,8 +300,53 @@ 1.33 + #endif 1.34 + #endif 1.35 + 1.36 + ////////////////////////////////////////////////////////////////////// 1.37 + 1.38 + #ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1.39 + #define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1 1.40 + #endif 1.41 ++ 1.42 ++////////////////////////////////////////////////////////////////////// 1.43 ++// ARM defines 1.44 ++ 1.45 ++#if defined(__GNUC__) && defined(__arm__) 1.46 ++ 1.47 ++# define SK_ARM_ARCH 3 1.48 ++ 1.49 ++# if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) \ 1.50 ++ || defined(_ARM_ARCH_4) 1.51 ++# undef SK_ARM_ARCH 1.52 ++# define SK_ARM_ARCH 4 1.53 ++# endif 1.54 ++ 1.55 ++# if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ 1.56 ++ || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ 1.57 ++ || defined(__ARM_ARCH_5TEJ__) || defined(_ARM_ARCH_5) 1.58 ++# undef SK_ARM_ARCH 1.59 ++# define SK_ARM_ARCH 5 1.60 ++# endif 1.61 ++ 1.62 ++# if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ 1.63 ++ || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ 1.64 ++ || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ 1.65 ++ || defined(__ARM_ARCH_6M__) || defined(_ARM_ARCH_6) 1.66 ++# undef SK_ARM_ARCH 1.67 ++# define SK_ARM_ARCH 6 1.68 ++# endif 1.69 ++ 1.70 ++# if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ 1.71 ++ || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ 1.72 ++ || defined(__ARM_ARCH_7EM__) || defined(_ARM_ARCH_7) 1.73 ++# undef SK_ARM_ARCH 1.74 ++# define SK_ARM_ARCH 7 1.75 ++# endif 1.76 ++ 1.77 ++# undef SK_ARM_HAS_EDSP 1.78 ++# if defined(__thumb2__) && (SK_ARM_ARCH >= 6) \ 1.79 ++ || !defined(__thumb__) \ 1.80 ++ && ((SK_ARM_ARCH > 5) || defined(__ARM_ARCH_5E__) \ 1.81 ++ || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)) 1.82 ++# define SK_ARM_HAS_EDSP 1 1.83 ++# endif 1.84 ++ 1.85 ++#endif 1.86 +diff --git a/gfx/skia/src/opts/SkBitmapProcState_opts_arm.cpp b/gfx/skia/src/opts/SkBitmapProcState_opts_arm.cpp 1.87 +--- a/gfx/skia/src/opts/SkBitmapProcState_opts_arm.cpp 1.88 ++++ b/gfx/skia/src/opts/SkBitmapProcState_opts_arm.cpp 1.89 +@@ -6,17 +6,17 @@ 1.90 + * found in the LICENSE file. 1.91 + */ 1.92 + 1.93 + 1.94 + #include "SkBitmapProcState.h" 1.95 + #include "SkColorPriv.h" 1.96 + #include "SkUtils.h" 1.97 + 1.98 +-#if __ARM_ARCH__ >= 6 && !defined(SK_CPU_BENDIAN) 1.99 ++#if SK_ARM_ARCH >= 6 && !defined(SK_CPU_BENDIAN) 1.100 + void SI8_D16_nofilter_DX_arm( 1.101 + const SkBitmapProcState& s, 1.102 + const uint32_t* SK_RESTRICT xy, 1.103 + int count, 1.104 + uint16_t* SK_RESTRICT colors) __attribute__((optimize("O1"))); 1.105 + 1.106 + void SI8_D16_nofilter_DX_arm(const SkBitmapProcState& s, 1.107 + const uint32_t* SK_RESTRICT xy, 1.108 +@@ -177,17 +177,17 @@ void SI8_opaque_D32_nofilter_DX_arm(cons 1.109 + : [xx] "+r" (xx), [count] "+r" (count), [colors] "+r" (colors) 1.110 + : [table] "r" (table), [srcAddr] "r" (srcAddr) 1.111 + : "memory", "cc", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" 1.112 + ); 1.113 + } 1.114 + 1.115 + s.fBitmap->getColorTable()->unlockColors(false); 1.116 + } 1.117 +-#endif //__ARM_ARCH__ >= 6 && !defined(SK_CPU_BENDIAN) 1.118 ++#endif // SK_ARM_ARCH >= 6 && !defined(SK_CPU_BENDIAN) 1.119 + 1.120 + /////////////////////////////////////////////////////////////////////////////// 1.121 + 1.122 + /* If we replace a sampleproc, then we null-out the associated shaderproc, 1.123 + otherwise the shader won't even look at the matrix/sampler 1.124 + */ 1.125 + void SkBitmapProcState::platformProcs() { 1.126 + bool doFilter = fDoFilter; 1.127 +@@ -195,17 +195,17 @@ void SkBitmapProcState::platformProcs() 1.128 + bool justDx = false; 1.129 + 1.130 + if (fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) { 1.131 + justDx = true; 1.132 + } 1.133 + 1.134 + switch (fBitmap->config()) { 1.135 + case SkBitmap::kIndex8_Config: 1.136 +-#if __ARM_ARCH__ >= 6 && !defined(SK_CPU_BENDIAN) 1.137 ++#if SK_ARM_ARCH >= 6 && !defined(SK_CPU_BENDIAN) 1.138 + if (justDx && !doFilter) { 1.139 + #if 0 /* crashing on android device */ 1.140 + fSampleProc16 = SI8_D16_nofilter_DX_arm; 1.141 + fShaderProc16 = NULL; 1.142 + #endif 1.143 + if (isOpaque) { 1.144 + // this one is only very slighty faster than the C version 1.145 + fSampleProc32 = SI8_opaque_D32_nofilter_DX_arm; 1.146 +diff --git a/gfx/skia/src/opts/SkBlitRow_opts_arm.cpp b/gfx/skia/src/opts/SkBlitRow_opts_arm.cpp 1.147 +--- a/gfx/skia/src/opts/SkBlitRow_opts_arm.cpp 1.148 ++++ b/gfx/skia/src/opts/SkBlitRow_opts_arm.cpp 1.149 +@@ -669,18 +669,23 @@ static void __attribute((noinline,optimi 1.150 + /* Double Loop */ 1.151 + "1: \n\t" /* <double loop> */ 1.152 + "ldm %[src]!, {r5, r6} \n\t" /* loading src pointers into r5 and r6 */ 1.153 + "ldm %[dst], {r7, r8} \n\t" /* loading dst pointers into r7 and r8 */ 1.154 + 1.155 + /* dst1_scale and dst2_scale*/ 1.156 + "lsr r9, r5, #24 \n\t" /* src >> 24 */ 1.157 + "lsr r10, r6, #24 \n\t" /* src >> 24 */ 1.158 ++#ifdef SK_ARM_HAS_EDSP 1.159 + "smulbb r9, r9, %[alpha] \n\t" /* r9 = SkMulS16 r9 with src_scale */ 1.160 + "smulbb r10, r10, %[alpha] \n\t" /* r10 = SkMulS16 r10 with src_scale */ 1.161 ++#else 1.162 ++ "mul r9, r9, %[alpha] \n\t" /* r9 = SkMulS16 r9 with src_scale */ 1.163 ++ "mul r10, r10, %[alpha] \n\t" /* r10 = SkMulS16 r10 with src_scale */ 1.164 ++#endif 1.165 + "lsr r9, r9, #8 \n\t" /* r9 >> 8 */ 1.166 + "lsr r10, r10, #8 \n\t" /* r10 >> 8 */ 1.167 + "rsb r9, r9, #256 \n\t" /* dst1_scale = r9 = 255 - r9 + 1 */ 1.168 + "rsb r10, r10, #256 \n\t" /* dst2_scale = r10 = 255 - r10 + 1 */ 1.169 + 1.170 + /* ---------------------- */ 1.171 + 1.172 + /* src1, src1_scale */ 1.173 +@@ -739,17 +744,21 @@ static void __attribute((noinline,optimi 1.174 + /* else get into the single loop */ 1.175 + /* Single Loop */ 1.176 + "2: \n\t" /* <single loop> */ 1.177 + "ldr r5, [%[src]], #4 \n\t" /* loading src pointer into r5: r5=src */ 1.178 + "ldr r7, [%[dst]] \n\t" /* loading dst pointer into r7: r7=dst */ 1.179 + 1.180 + "lsr r6, r5, #24 \n\t" /* src >> 24 */ 1.181 + "and r8, r12, r5, lsr #8 \n\t" /* ag = r8 = r5 masked by r12 lsr by #8 */ 1.182 ++#ifdef SK_ARM_HAS_EDSP 1.183 + "smulbb r6, r6, %[alpha] \n\t" /* r6 = SkMulS16 with src_scale */ 1.184 ++#else 1.185 ++ "mul r6, r6, %[alpha] \n\t" /* r6 = SkMulS16 with src_scale */ 1.186 ++#endif 1.187 + "and r9, r12, r5 \n\t" /* rb = r9 = r5 masked by r12 */ 1.188 + "lsr r6, r6, #8 \n\t" /* r6 >> 8 */ 1.189 + "mul r8, r8, %[alpha] \n\t" /* ag = r8 times scale */ 1.190 + "rsb r6, r6, #256 \n\t" /* r6 = 255 - r6 + 1 */ 1.191 + 1.192 + /* src, src_scale */ 1.193 + "mul r9, r9, %[alpha] \n\t" /* rb = r9 times scale */ 1.194 + "and r8, r8, r12, lsl #8 \n\t" /* ag masked by reverse mask (r12) */