blob: 2ac395c0273e10d1057dfd0149c0015812600616 [file] [log] [blame]
epoger@google.comae85aea2011-05-31 13:50:51 +00001{
epoger@google.comae85aea2011-05-31 13:50:51 +00002 'targets': [
3 # Due to an unfortunate intersection of lameness between gcc and gyp,
4 # we have to build the *_SSE2.cpp files in a separate target. The
5 # gcc lameness is that, in order to compile SSE2 intrinsics code, it
6 # must be passed the -msse2 flag. However, with this flag, it may
7 # emit SSE2 instructions even for scalar code, such as the CPUID
8 # test used to test for the presence of SSE2. So that, and all other
9 # code must be compiled *without* -msse2. The gyp lameness is that it
10 # does not allow file-specific CFLAGS, so we must create this extra
11 # target for those files to be compiled with -msse2.
12 #
13 # This is actually only a problem on 32-bit Linux (all Intel Macs have
14 # SSE2, Linux x86_64 has SSE2 by definition, and MSC will happily emit
15 # SSE2 from instrinsics, while generating plain ol' 386 for everything
16 # else). However, to keep the .gyp file simple and avoid platform-specific
17 # build breakage, we do this on all platforms.
18
19 # For about the same reason, we need to compile the ARM opts files
20 # separately as well.
21 {
22 'target_name': 'opts',
23 'type': 'static_library',
24 'include_dirs': [
25 '../include/config',
26 '../include/core',
27 '../src/core',
djsollen@google.coma44e6c62012-01-09 14:38:25 +000028 '../src/opts',
epoger@google.comae85aea2011-05-31 13:50:51 +000029 ],
30 'conditions': [
djsollen@google.come341cb32012-06-28 16:08:05 +000031 [ 'skia_arch_type == "x86"', {
tomhudson@google.com95ad1552012-02-14 18:28:54 +000032 'conditions': [
33 [ 'skia_os in ["linux", "freebsd", "openbsd", "solaris"]', {
34 'cflags': [
35 '-msse2',
36 ],
37 }],
38 ],
djsollen@google.com58629292011-11-03 13:08:29 +000039 'sources': [
djsollen@google.coma44e6c62012-01-09 14:38:25 +000040 '../src/opts/opts_check_SSE2.cpp',
djsollen@google.com58629292011-11-03 13:08:29 +000041 '../src/opts/SkBitmapProcState_opts_SSE2.cpp',
42 '../src/opts/SkBlitRow_opts_SSE2.cpp',
tomhudson@google.com8dd90a92012-03-19 13:49:50 +000043 '../src/opts/SkBlitRect_opts_SSE2.cpp',
djsollen@google.com58629292011-11-03 13:08:29 +000044 '../src/opts/SkUtils_opts_SSE2.cpp',
45 ],
tomhudson@google.com95ad1552012-02-14 18:28:54 +000046 'dependencies': [
47 'opts_ssse3',
48 ],
djsollen@google.com58629292011-11-03 13:08:29 +000049 }],
djsollen@google.come341cb32012-06-28 16:08:05 +000050 [ 'skia_arch_type == "arm" and armv7 == 1', {
djsollen@google.com58629292011-11-03 13:08:29 +000051 # The assembly uses the frame pointer register (r7 in Thumb/r11 in
52 # ARM), the compiler doesn't like that.
53 'cflags!': [
54 '-fno-omit-frame-pointer',
55 ],
56 'cflags': [
57 '-fomit-frame-pointer',
58 ],
digit@google.comeec9dbc2012-05-30 13:54:41 +000059 'variables': {
60 'arm_neon_optional%': '<(arm_neon_optional>',
61 },
djsollen@google.com58629292011-11-03 13:08:29 +000062 'sources': [
djsollen@google.coma44e6c62012-01-09 14:38:25 +000063 '../src/opts/opts_check_arm.cpp',
64 '../src/opts/memset.arm.S',
djsollen@google.com58629292011-11-03 13:08:29 +000065 '../src/opts/SkBitmapProcState_opts_arm.cpp',
66 '../src/opts/SkBlitRow_opts_arm.cpp',
digit@google.coma8dd1ce2012-08-08 22:06:29 +000067 '../src/opts/SkBlitRow_opts_arm.h',
djsollen@google.com58629292011-11-03 13:08:29 +000068 ],
digit@google.comeec9dbc2012-05-30 13:54:41 +000069 'conditions': [
70 [ 'arm_neon == 1 or arm_neon_optional == 1', {
71 'dependencies': [
72 'opts_neon',
73 ]
74 }]
75 ],
djsollen@google.com58629292011-11-03 13:08:29 +000076 }],
djsollen@google.come341cb32012-06-28 16:08:05 +000077 [ 'skia_arch_type == "arm" and armv7 != 1', {
djsollen@google.com58629292011-11-03 13:08:29 +000078 'sources': [
79 '../src/opts/SkBitmapProcState_opts_none.cpp',
80 '../src/opts/SkBlitRow_opts_none.cpp',
81 '../src/opts/SkUtils_opts_none.cpp',
82 ],
83 }],
epoger@google.comae85aea2011-05-31 13:50:51 +000084 ],
85 },
tomhudson@google.com95ad1552012-02-14 18:28:54 +000086 # For the same lame reasons as what is done for skia_opts, we have to
87 # create another target specifically for SSSE3 code as we would not want
88 # to compile the SSE2 code with -mssse3 which would potentially allow
89 # gcc to generate SSSE3 code.
90 {
91 'target_name': 'opts_ssse3',
92 'type': 'static_library',
93 'include_dirs': [
94 '../include/config',
95 '../include/core',
96 '../src/core',
97 ],
98 'conditions': [
epoger@google.com21099232012-02-14 19:49:19 +000099 [ 'skia_os in ["linux", "freebsd", "openbsd", "solaris"]', {
tomhudson@google.com95ad1552012-02-14 18:28:54 +0000100 'cflags': [
101 '-mssse3',
102 ],
103 }],
epoger@google.com21099232012-02-14 19:49:19 +0000104 # TODO(epoger): the following will enable SSSE3 on Macs, but it will
105 # break once we set OTHER_CFLAGS anywhere else (the first setting will
106 # be replaced, not added to)
107 [ 'skia_os in ["mac"]', {
108 'xcode_settings': {
109 'OTHER_CFLAGS': ['-mssse3',],
110 },
111 }],
djsollen@google.come341cb32012-06-28 16:08:05 +0000112 [ 'skia_arch_type == "x86"', {
tomhudson@google.com95ad1552012-02-14 18:28:54 +0000113 'sources': [
114 '../src/opts/SkBitmapProcState_opts_SSSE3.cpp',
115 ],
116 }],
117 ],
118 },
digit@google.comeec9dbc2012-05-30 13:54:41 +0000119 # NEON code must be compiled with -mfpu=neon which also affects scalar
120 # code. To support dynamic NEON code paths, we need to build all
121 # NEON-specific sources in a separate static library. The situation
122 # is very similar to the SSSE3 one.
123 {
124 'target_name': 'opts_neon',
125 'type': 'static_library',
126 'include_dirs': [
127 '../include/config',
128 '../include/core',
129 '../src/core',
digit@google.comfce02ac2012-08-01 14:25:07 +0000130 '../src/opts',
digit@google.comeec9dbc2012-05-30 13:54:41 +0000131 ],
132 'cflags!': [
133 '-fno-omit-frame-pointer',
134 '-mfpu=vfp', # remove them all, just in case.
135 '-mfpu=vfpv3',
136 '-mfpu=vfpv3-d16',
137 ],
138 'cflags': [
digit@google.comeec9dbc2012-05-30 13:54:41 +0000139 '-mfpu=neon',
digit@google.comfce02ac2012-08-01 14:25:07 +0000140 '-fomit-frame-pointer',
digit@google.comeec9dbc2012-05-30 13:54:41 +0000141 ],
142 'sources': [
143 '../src/opts/memset16_neon.S',
144 '../src/opts/memset32_neon.S',
digit@google.coma8dd1ce2012-08-08 22:06:29 +0000145 '../src/opts/SkBitmapProcState_arm_neon.cpp',
digit@google.comfce02ac2012-08-01 14:25:07 +0000146 '../src/opts/SkBitmapProcState_matrixProcs_neon.cpp',
147 '../src/opts/SkBitmapProcState_matrix_clamp_neon.h',
148 '../src/opts/SkBitmapProcState_matrix_repeat_neon.h',
digit@google.coma8dd1ce2012-08-08 22:06:29 +0000149 '../src/opts/SkBlitRow_opts_arm_neon.cpp',
digit@google.comeec9dbc2012-05-30 13:54:41 +0000150 ],
151 },
epoger@google.comae85aea2011-05-31 13:50:51 +0000152 ],
153}
154
155# Local Variables:
156# tab-width:2
157# indent-tabs-mode:nil
158# End:
159# vim: set expandtab tabstop=2 shiftwidth=2: