1 # Copyright 2013 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 6 # This gyp file contains the platform-specific optimizations for Skia 7 { 8 'targets': [ 9 # Due to an unfortunate intersection of lameness between gcc and gyp, 10 # we have to build the *_SSE2.cpp files in a separate target. The 11 # gcc lameness is that, in order to compile SSE2 intrinsics code, it 12 # must be passed the -msse2 flag. However, with this flag, it may 13 # emit SSE2 instructions even for scalar code, such as the CPUID 14 # test used to test for the presence of SSE2. So that, and all other 15 # code must be compiled *without* -msse2. The gyp lameness is that it 16 # does not allow file-specific CFLAGS, so we must create this extra 17 # target for those files to be compiled with -msse2. 18 # 19 # This is actually only a problem on 32-bit Linux (all Intel Macs have 20 # SSE2, Linux x86_64 has SSE2 by definition, and MSC will happily emit 21 # SSE2 from instrinsics, which generating plain ol' 386 for everything 22 # else). However, to keep the .gyp file simple and avoid platform-specific 23 # build breakage, we do this on all platforms. 24 25 # For about the same reason, we need to compile the ARM opts files 26 # separately as well. 27 { 28 'target_name': 'skia_opts', 29 'type': 'static_library', 30 'includes': [ 31 'skia_common.gypi', 32 ], 33 'include_dirs': [ 34 '../third_party/skia/include/core', 35 '../third_party/skia/src/core', 36 '../third_party/skia/src/opts', 37 ], 38 'conditions': [ 39 [ 'os_posix == 1 and OS != "mac" and OS != "android" and \ 40 target_arch != "arm" and target_arch != "mipsel"', { 41 'cflags': [ 42 '-msse2', 43 ], 44 }], 45 [ 'target_arch != "arm" and target_arch != "mipsel"', { 46 'sources': [ 47 '../third_party/skia/src/opts/SkBitmapProcState_opts_SSE2.cpp', 48 '../third_party/skia/src/opts/SkBlitRect_opts_SSE2.cpp', 49 '../third_party/skia/src/opts/SkBlitRow_opts_SSE2.cpp', 50 '../third_party/skia/src/opts/SkUtils_opts_SSE2.cpp', 51 '../third_party/skia/src/opts/SkXfermode_opts_none.cpp', 52 '../third_party/skia/src/opts/SkBitmapFilter_opts_SSE2.cpp', 53 '../third_party/skia/src/opts/SkMorphology_opts_SSE2.cpp', 54 '../third_party/skia/src/opts/SkBlurImage_opts_SSE2.cpp', 55 ], 56 'dependencies': [ 57 'skia_opts_ssse3', 58 ], 59 }], 60 [ 'target_arch == "arm"', { 61 'conditions': [ 62 [ 'arm_version >= 7 and arm_neon == 1', { 63 'defines': [ 64 '__ARM_HAVE_NEON', 65 ], 66 }], 67 [ 'arm_version >= 7 and arm_neon_optional == 1', { 68 'defines': [ 69 '__ARM_HAVE_OPTIONAL_NEON_SUPPORT', 70 ], 71 }], 72 [ 'arm_version >= 7 and (arm_neon == 1 or arm_neon_optional == 1)', { 73 'cflags': [ 74 # The neon assembly contains conditional instructions which 75 # aren't enclosed in an IT block. The assembler complains 76 # without this option. 77 # See #86592. 78 '-Wa,-mimplicit-it=always', 79 ], 80 'dependencies': [ 81 'skia_opts_neon', 82 ] 83 }], 84 ], 85 # The assembly uses the frame pointer register (r7 in Thumb/r11 in 86 # ARM), the compiler doesn't like that. Explicitly remove the 87 # -fno-omit-frame-pointer flag for Android, as that gets added to all 88 # targets via common.gypi. 89 'cflags!': [ 90 '-fno-omit-frame-pointer', 91 '-marm', 92 '-mapcs-frame', 93 ], 94 'cflags': [ 95 '-fomit-frame-pointer', 96 ], 97 'sources': [ 98 '../third_party/skia/src/opts/SkBitmapProcState_opts_arm.cpp', 99 ], 100 }], 101 [ 'target_arch == "arm" and (arm_version < 7 or (arm_neon == 0 and arm_neon_optional == 1))', { 102 'sources': [ 103 '../third_party/skia/src/opts/memset.arm.S', 104 ], 105 }], 106 [ 'target_arch == "arm" and arm_version < 6', { 107 'sources': [ 108 '../third_party/skia/src/opts/SkBlitMask_opts_none.cpp', 109 '../third_party/skia/src/opts/SkBlitRow_opts_none.cpp', 110 '../third_party/skia/src/opts/SkUtils_opts_none.cpp', 111 '../third_party/skia/src/opts/SkXfermode_opts_none.cpp', 112 '../third_party/skia/src/opts/SkMorphology_opts_none.cpp', 113 '../third_party/skia/src/opts/SkBlurImage_opts_none.cpp', 114 ], 115 }], 116 [ 'target_arch == "arm" and arm_version >= 6', { 117 'sources': [ 118 '../third_party/skia/src/opts/SkBlitMask_opts_arm.cpp', 119 '../third_party/skia/src/opts/SkBlitRow_opts_arm.cpp', 120 '../third_party/skia/src/opts/SkBlitRow_opts_arm.h', 121 '../third_party/skia/src/opts/opts_check_arm.cpp', 122 '../third_party/skia/src/opts/SkXfermode_opts_none.cpp', 123 ], 124 }], 125 [ 'target_arch == "mipsel"',{ 126 'cflags': [ 127 '-fomit-frame-pointer', 128 ], 129 'sources': [ 130 '../third_party/skia/src/opts/SkBitmapProcState_opts_none.cpp', 131 '../third_party/skia/src/opts/SkBlitMask_opts_none.cpp', 132 '../third_party/skia/src/opts/SkBlitRow_opts_none.cpp', 133 '../third_party/skia/src/opts/SkUtils_opts_none.cpp', 134 '../third_party/skia/src/opts/SkXfermode_opts_none.cpp', 135 '../third_party/skia/src/opts/SkMorphology_opts_none.cpp', 136 '../third_party/skia/src/opts/SkBlurImage_opts_none.cpp', 137 ], 138 }], 139 ], 140 }, 141 # For the same lame reasons as what is done for skia_opts, we have to 142 # create another target specifically for SSSE3 code as we would not want 143 # to compile the SSE2 code with -mssse3 which would potentially allow 144 # gcc to generate SSSE3 code. 145 { 146 'target_name': 'skia_opts_ssse3', 147 'type': 'static_library', 148 'includes': [ 149 'skia_common.gypi', 150 ], 151 'include_dirs': [ 152 '../third_party/skia/include/core', 153 '../third_party/skia/src/core', 154 ], 155 'conditions': [ 156 [ 'OS in ["linux", "freebsd", "openbsd", "solaris", "android"]', { 157 'cflags': [ 158 '-mssse3', 159 ], 160 }], 161 [ 'OS == "mac"', { 162 'xcode_settings': { 163 'GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS': 'YES', 164 }, 165 }], 166 [ 'OS == "win"', { 167 'include_dirs': [ 168 'config/win', 169 ], 170 'direct_dependent_settings': { 171 'include_dirs': [ 172 'config/win', 173 ], 174 }, 175 }], 176 [ 'target_arch != "arm" and target_arch != "mipsel"', { 177 'sources': [ 178 '../third_party/skia/src/opts/SkBitmapProcState_opts_SSSE3.cpp', 179 ], 180 }], 181 ], 182 }, 183 { 184 'target_name': 'skia_opts_none', 185 'type': 'static_library', 186 'includes': [ 187 'skia_common.gypi', 188 ], 189 'include_dirs': [ 190 '../third_party/skia/include/core', 191 '../third_party/skia/src/core', 192 ], 193 'sources': [ 194 '../third_party/skia/src/opts/SkBitmapProcState_opts_none.cpp', 195 '../third_party/skia/src/opts/SkBlitMask_opts_none.cpp', 196 '../third_party/skia/src/opts/SkBlitRow_opts_none.cpp', 197 '../third_party/skia/src/opts/SkUtils_opts_none.cpp', 198 '../third_party/skia/src/opts/SkXfermode_opts_none.cpp', 199 '../third_party/skia/src/opts/SkMorphology_opts_none.cpp', 200 '../third_party/skia/src/opts/SkBlurImage_opts_none.cpp', 201 ], 202 }, 203 ], 204 'conditions': [ 205 # NEON code must be compiled with -mfpu=neon which also affects scalar 206 # code. To support dynamic NEON code paths, we need to build all 207 # NEON-specific sources in a separate static library. The situation 208 # is very similar to the SSSE3 one. 209 ['target_arch == "arm" and (arm_neon == 1 or arm_neon_optional == 1)', { 210 'targets': [ 211 { 212 'target_name': 'skia_opts_neon', 213 'type': 'static_library', 214 'includes': [ 215 'skia_common.gypi', 216 ], 217 'include_dirs': [ 218 '../third_party/skia/include/core', 219 '../third_party/skia/src/core', 220 '../third_party/skia/src/opts', 221 ], 222 'cflags!': [ 223 '-fno-omit-frame-pointer', 224 '-mfpu=vfp', # remove them all, just in case. 225 '-mfpu=vfpv3', 226 '-mfpu=vfpv3-d16', 227 ], 228 'cflags': [ 229 '-mfpu=neon', 230 '-fomit-frame-pointer', 231 ], 232 'ldflags': [ 233 '-march=armv7-a', 234 '-Wl,--fix-cortex-a8', 235 ], 236 'sources': [ 237 '../third_party/skia/src/opts/memset16_neon.S', 238 '../third_party/skia/src/opts/memset32_neon.S', 239 '../third_party/skia/src/opts/SkBitmapProcState_arm_neon.cpp', 240 '../third_party/skia/src/opts/SkBitmapProcState_matrixProcs_neon.cpp', 241 '../third_party/skia/src/opts/SkBitmapProcState_matrix_clamp_neon.h', 242 '../third_party/skia/src/opts/SkBitmapProcState_matrix_repeat_neon.h', 243 '../third_party/skia/src/opts/SkBlitMask_opts_arm_neon.cpp', 244 '../third_party/skia/src/opts/SkBlitRow_opts_arm_neon.cpp', 245 '../third_party/skia/src/opts/SkXfermode_opts_arm_neon.cpp', 246 '../third_party/skia/src/opts/SkBlurImage_opts_neon.cpp', 247 '../third_party/skia/src/opts/SkMorphology_opts_neon.cpp', 248 ], 249 'conditions': [ 250 ['arm_neon == 1', { 251 'defines': [ 252 '__ARM_HAVE_NEON', 253 ], 254 }], 255 ['arm_neon_optional == 1', { 256 'defines': [ 257 '__ARM_HAVE_OPTIONAL_NEON_SUPPORT', 258 ], 259 }], 260 ], 261 }, 262 ], 263 }], 264 ], 265 } 266