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