b394cbc17e349a982e4062ab265d4113b9935709
[mesa.git] / src / gallium / drivers / swr / SConscript
1 Import('*')
2
3 from sys import executable as python_cmd
4 import os.path
5 import distutils.version
6
7 if not env['swr']:
8 Return()
9
10 if not env['llvm']:
11 print 'warning: LLVM disabled: not building swr'
12 env['swr'] = False
13 Return()
14
15 if env['LLVM_VERSION'] < distutils.version.LooseVersion('3.9'):
16 print "warning: swr requires LLVM >= 3.9: not building swr"
17 env['swr'] = False
18 Return()
19
20 env.MSVC2013Compat()
21
22 env = env.Clone()
23
24 # construct llvm include dir
25 if env['platform'] == 'windows':
26 # on windows there is no llvm-config, so LLVM is defined
27 llvm_includedir = os.path.join(os.environ['LLVM'], 'include')
28 else:
29 llvm_config = os.environ.get('LLVM_CONFIG', 'llvm-config')
30 llvm_includedir = env.backtick('%s --includedir' % llvm_config).rstrip()
31 print "llvm include dir %s" % llvm_includedir
32
33 if not env['msvc'] :
34 env.Append(CCFLAGS = [
35 '-std=c++11',
36 ])
37
38 swrroot = '#src/gallium/drivers/swr/'
39 bldroot = Dir('.').abspath
40
41 env.CodeGenerate(
42 target = 'rasterizer/codegen/gen_knobs.cpp',
43 script = swrroot + 'rasterizer/codegen/gen_knobs.py',
44 source = '',
45 command = python_cmd + ' $SCRIPT --output $TARGET --gen_cpp'
46 )
47 Depends('rasterizer/codegen/gen_knobs.cpp',
48 swrroot + 'rasterizer/codegen/templates/gen_knobs.cpp')
49
50 env.CodeGenerate(
51 target = 'rasterizer/codegen/gen_knobs.h',
52 script = swrroot + 'rasterizer/codegen/gen_knobs.py',
53 source = '',
54 command = python_cmd + ' $SCRIPT --output $TARGET --gen_h'
55 )
56 Depends('rasterizer/codegen/gen_knobs.h',
57 swrroot + 'rasterizer/codegen/templates/gen_knobs.h')
58
59 env.CodeGenerate(
60 target = 'rasterizer/jitter/gen_state_llvm.h',
61 script = swrroot + 'rasterizer/codegen/gen_llvm_types.py',
62 source = 'rasterizer/core/state.h',
63 command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET'
64 )
65 Depends('rasterizer/jitter/gen_state_llvm.h',
66 swrroot + 'rasterizer/codegen/templates/gen_llvm.hpp')
67
68 env.CodeGenerate(
69 target = 'rasterizer/jitter/gen_builder.hpp',
70 script = swrroot + 'rasterizer/codegen/gen_llvm_ir_macros.py',
71 source = os.path.join(llvm_includedir, 'llvm/IR/IRBuilder.h'),
72 command = python_cmd + ' $SCRIPT --input $SOURCE --output ' + bldroot + '/rasterizer/jitter --gen_h'
73 )
74 Depends('rasterizer/jitter/gen_builder.hpp',
75 swrroot + 'rasterizer/codegen/templates/gen_builder.hpp')
76
77 env.CodeGenerate(
78 target = 'rasterizer/jitter/gen_builder_x86.hpp',
79 script = swrroot + 'rasterizer/codegen/gen_llvm_ir_macros.py',
80 source = '',
81 command = python_cmd + ' $SCRIPT --output ' + bldroot + '/rasterizer/jitter --gen_x86_h'
82 )
83 Depends('rasterizer/jitter/gen_builder.hpp',
84 swrroot + 'rasterizer/codegen/templates/gen_builder.hpp')
85
86 env.CodeGenerate(
87 target = './gen_swr_context_llvm.h',
88 script = swrroot + 'rasterizer/codegen/gen_llvm_types.py',
89 source = 'swr_context.h',
90 command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET'
91 )
92 Depends('rasterizer/jitter/gen_state_llvm.h',
93 swrroot + 'rasterizer/codegen/templates/gen_llvm.hpp')
94
95 env.CodeGenerate(
96 target = 'rasterizer/archrast/gen_ar_event.hpp',
97 script = swrroot + 'rasterizer/codegen/gen_archrast.py',
98 source = 'rasterizer/archrast/events.proto',
99 command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_event_h'
100 )
101 Depends('rasterizer/jitter/gen_state_llvm.h',
102 swrroot + 'rasterizer/codegen/templates/gen_ar_event.hpp')
103
104 env.CodeGenerate(
105 target = 'rasterizer/archrast/gen_ar_event.cpp',
106 script = swrroot + 'rasterizer/codegen/gen_archrast.py',
107 source = 'rasterizer/archrast/events.proto',
108 command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_event_cpp'
109 )
110 Depends('rasterizer/jitter/gen_state_llvm.h',
111 swrroot + 'rasterizer/codegen/templates/gen_ar_event.cpp')
112
113 env.CodeGenerate(
114 target = 'rasterizer/archrast/gen_ar_eventhandler.hpp',
115 script = swrroot + 'rasterizer/codegen/gen_archrast.py',
116 source = 'rasterizer/archrast/events.proto',
117 command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_eventhandler_h'
118 )
119 Depends('rasterizer/jitter/gen_state_llvm.h',
120 swrroot + 'rasterizer/codegen/templates/gen_ar_eventhandler.hpp')
121
122 env.CodeGenerate(
123 target = 'rasterizer/archrast/gen_ar_eventhandlerfile.hpp',
124 script = swrroot + 'rasterizer/codegen/gen_archrast.py',
125 source = 'rasterizer/archrast/events.proto',
126 command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_eventhandlerfile_h'
127 )
128 Depends('rasterizer/jitter/gen_state_llvm.h',
129 swrroot + 'rasterizer/codegen/templates/gen_ar_eventhandlerfile.hpp')
130
131 # 5 SWR_MULTISAMPLE_TYPE_COUNT
132 # 2 SWR_MSAA_SAMPLE_PATTERN_COUNT
133 # 3 SWR_INPUT_COVERAGE_COUNT
134 # 2 centroid
135 # 2 forcedSampleCount
136 # 2 canEarlyZ
137 backendPixelRateFileCount = 4
138 backendPixelRateFilePat = "rasterizer/core/backends/gen_BackendPixelRate%s.cpp"
139 backendPixelRateFiles = map(lambda x: backendPixelRateFilePat % x,
140 range(0, backendPixelRateFileCount))
141 env.CodeGenerate(
142 target = 'rasterizer/core/backends/gen_BackendPixelRate.hpp',
143 script = swrroot + 'rasterizer/codegen/gen_backends.py',
144 source = '',
145 command = python_cmd + ' $SCRIPT --outdir ' + bldroot + '/rasterizer/core/backends --dim 5 2 3 2 2 2 --numfiles ' + str(backendPixelRateFileCount) + ' --cpp --hpp'
146 )
147 Depends(backendPixelRateFiles,
148 ['rasterizer/core/backends/gen_BackendPixelRate.hpp',
149 'rasterizer/archrast/gen_ar_event.hpp',
150 'rasterizer/codegen/gen_knobs.h']
151 )
152
153 # 5 SWR_MULTISAMPLE_TYPE_COUNT
154 # 2 CenterPattern
155 # 2 Conservative
156 # 3 SWR_INPUT_COVERAGE_COUNT
157 # 5 STATE_VALID_TRI_EDGE_COUNT
158 # 2 RasterScissorEdges
159 genRasterizerFileCount = 4
160 genRasterizerFilePat = "rasterizer/core/backends/gen_rasterizer%s.cpp"
161 genRasterizerFiles = map(lambda x: genRasterizerFilePat % x,
162 range(0, genRasterizerFileCount))
163 env.CodeGenerate(
164 target = 'rasterizer/core/backends/gen_rasterizer.hpp',
165 script = swrroot + 'rasterizer/codegen/gen_backends.py',
166 source = '',
167 command = python_cmd + ' $SCRIPT --outdir ' + bldroot + '/rasterizer/core/backends --rast --dim 5 2 2 3 5 2 --numfiles ' + str(genRasterizerFileCount) + ' --cpp --hpp'
168 )
169 Depends(genRasterizerFiles,
170 ['rasterizer/core/backends/gen_rasterizer.hpp',
171 'rasterizer/archrast/gen_ar_event.hpp',
172 'rasterizer/codegen/gen_knobs.h']
173 )
174
175 Depends('rasterizer/jitter/gen_state_llvm.h',
176 swrroot + 'rasterizer/codegen/templates/gen_backend.cpp')
177
178 # Auto-generated .cpp files (that need to generate object files)
179 built_sources = [
180 'rasterizer/codegen/gen_knobs.cpp',
181 'rasterizer/archrast/gen_ar_event.cpp',
182 ]
183
184 built_sources += [backendPixelRateFiles, genRasterizerFiles]
185
186 source = built_sources
187 source += env.ParseSourceList(swrroot + 'Makefile.sources', [
188 'ARCHRAST_CXX_SOURCES',
189 'COMMON_CXX_SOURCES',
190 'CORE_CXX_SOURCES',
191 'MEMORY_CXX_SOURCES'
192 ])
193
194 env.Prepend(CPPPATH = [
195 '.',
196 'rasterizer',
197 'rasterizer/codegen',
198 'rasterizer/core',
199 'rasterizer/jitter',
200 'rasterizer/archrast',
201 ])
202
203 # AVX lib
204 envavx = env.Clone()
205
206 envavx.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX'])
207 if env['platform'] == 'windows':
208 envavx.Append(CCFLAGS = ['/arch:AVX'])
209 else:
210 envavx.Append(CCFLAGS = ['-mavx'])
211
212 swrAVX = envavx.SharedLibrary(
213 target = 'swrAVX',
214 source = source,
215 OBJPREFIX = 'avx_'
216 )
217 env.Alias('swrAVX', swrAVX)
218
219 # AVX2 lib
220 envavx2 = env.Clone()
221
222 envavx2.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX2'])
223 if env['platform'] == 'windows':
224 envavx2.Append(CCFLAGS = ['/arch:AVX2'])
225 else:
226 envavx2.Append(CCFLAGS = ['-mavx2', '-mfma', '-mbmi2', '-mf16c'])
227
228 swrAVX2 = envavx2.SharedLibrary(
229 target = 'swrAVX2',
230 source = source,
231 OBJPREFIX = 'avx2_'
232 )
233 env.Alias('swrAVX2', swrAVX2)
234
235 source = env.ParseSourceList(swrroot + 'Makefile.sources', [
236 'CXX_SOURCES',
237 'COMMON_CXX_SOURCES',
238 'JITTER_CXX_SOURCES',
239 'LOADER_SOURCES'
240 ])
241 source += [
242 'rasterizer/codegen/gen_knobs.cpp',
243 'rasterizer/archrast/gen_ar_event.cpp',
244 ]
245
246 # main SWR lib
247 envSWR = envavx.Clone() # pick up the arch flag for intrinsic usage
248 envSWR.Append(CPPDEFINES = ['HAVE_SWR_AVX', 'HAVE_SWR_AVX2'])
249 swr = envSWR.ConvenienceLibrary(
250 target = 'swr',
251 source = source,
252 )
253
254 # treat arch libs as dependencies, even though they are not linked
255 # into swr, so we don't have to build them separately
256 Depends(swr, ['swrAVX', 'swrAVX2'])
257
258 env.Alias('swr', swr)
259
260 env.Prepend(LIBS = [swr])
261
262 Export('swr')