1Import('*')
2
3from sys import executable as python_cmd
4import os.path
5import distutils.version
6
7if not env['swr']:
8    Return()
9
10if not env['llvm']:
11    print('warning: LLVM disabled: not building swr')
12    env['swr'] = False
13    Return()
14
15if 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
20env.MSVC2013Compat()
21
22env = env.Clone()
23
24# construct llvm include dir
25if 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')
28else:
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
33if not env['msvc'] :
34    env.Append(CCFLAGS = [
35        '-std=c++11',
36    ])
37
38swrroot = '#src/gallium/drivers/swr/'
39srcroot = Dir(swrroot).abspath
40bldroot = Dir('.').abspath
41
42env.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)
48Depends('rasterizer/codegen/gen_knobs.cpp',
49        swrroot + 'rasterizer/codegen/templates/gen_knobs.cpp')
50
51env.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)
57Depends('rasterizer/codegen/gen_knobs.h',
58        swrroot + 'rasterizer/codegen/templates/gen_knobs.h')
59
60env.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)
66Depends('rasterizer/jitter/gen_state_llvm.h',
67        swrroot + 'rasterizer/codegen/templates/gen_llvm.hpp')
68
69env.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)
75Depends('rasterizer/jitter/gen_builder.hpp',
76        swrroot + 'rasterizer/codegen/templates/gen_builder.hpp')
77
78env.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)
84Depends('rasterizer/jitter/gen_builder.hpp',
85        swrroot + 'rasterizer/codegen/templates/gen_builder.hpp')
86
87env.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)
93Depends('rasterizer/jitter/gen_builder.hpp',
94        swrroot + 'rasterizer/codegen/templates/gen_builder.hpp')
95
96env.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)
102Depends('rasterizer/jitter/gen_state_llvm.h',
103        swrroot + 'rasterizer/codegen/templates/gen_llvm.hpp')
104
105env.CodeGenerate(
106    script = swrroot + 'rasterizer/codegen/gen_archrast.py',
107    target = ['rasterizer/archrast/gen_ar_event.hpp',
108              'rasterizer/archrast/gen_ar_event.cpp',
109              'rasterizer/archrast/gen_ar_eventhandler.hpp',
110              'rasterizer/archrast/gen_ar_eventhandlerfile.hpp'],
111    source = [srcroot + '/rasterizer/archrast/events.proto',
112              srcroot + '/rasterizer/archrast/events_private.proto'],
113    command = python_cmd + ' $SCRIPT --proto $SOURCES --output-dir ' + bldroot + '/rasterizer/archrast')
114Depends('rasterizer/archrast/gen_ar_event.hpp',
115        swrroot + 'rasterizer/archrast/events_private.proto')
116Depends('rasterizer/jitter/gen_state_llvm.h',
117        swrroot + 'rasterizer/codegen/templates/gen_ar_event.hpp')
118Depends('rasterizer/archrast/gen_ar_event.cpp',
119        swrroot + 'rasterizer/archrast/events_private.proto')
120Depends('rasterizer/jitter/gen_state_llvm.h',
121        swrroot + 'rasterizer/codegen/templates/gen_ar_event.cpp')
122Depends('rasterizer/archrast/gen_ar_eventhandler.hpp',
123        swrroot + 'rasterizer/archrast/events_private.proto')
124Depends('rasterizer/jitter/gen_state_llvm.h',
125        swrroot + 'rasterizer/codegen/templates/gen_ar_eventhandler.hpp')
126Depends('rasterizer/archrast/gen_ar_eventhandlerfile.hpp',
127        swrroot + 'rasterizer/archrast/events_private.proto')
128Depends('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
137backendPixelRateFileCount = 4
138backendPixelRateFilePat = "rasterizer/core/backends/gen_BackendPixelRate%s.cpp"
139backendPixelRateFiles = list(backendPixelRateFilePat % x for x in range(0, backendPixelRateFileCount))
140env.CodeGenerate(
141    target = 'rasterizer/core/backends/gen_BackendPixelRate.hpp',
142    script = swrroot + 'rasterizer/codegen/gen_backends.py',
143    source = '',
144    command = python_cmd + ' $SCRIPT --outdir ' + bldroot + '/rasterizer/core/backends --dim 5 2 3 2 2 2 --numfiles ' + str(backendPixelRateFileCount) + ' --cpp --hpp'
145    )
146Depends(backendPixelRateFiles,
147        ['rasterizer/core/backends/gen_BackendPixelRate.hpp',
148         'rasterizer/archrast/gen_ar_event.hpp',
149         'rasterizer/archrast/gen_ar_eventhandler.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
159genRasterizerFileCount = 4
160genRasterizerFilePat = "rasterizer/core/backends/gen_rasterizer%s.cpp"
161genRasterizerFiles = list(genRasterizerFilePat % x for x in range(0, genRasterizerFileCount))
162env.CodeGenerate(
163    target = 'rasterizer/core/backends/gen_rasterizer.hpp',
164    script = swrroot + 'rasterizer/codegen/gen_backends.py',
165    source = '',
166    command = python_cmd + ' $SCRIPT --outdir ' + bldroot + '/rasterizer/core/backends --rast --dim 5 2 2 3 5 2 --numfiles ' + str(genRasterizerFileCount) + ' --cpp --hpp'
167    )
168Depends(genRasterizerFiles,
169        ['rasterizer/core/backends/gen_rasterizer.hpp',
170         'rasterizer/archrast/gen_ar_event.hpp',
171         'rasterizer/archrast/gen_ar_eventhandler.hpp',
172         'rasterizer/codegen/gen_knobs.h']
173        )
174
175Depends('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)
179built_sources = [
180    'rasterizer/codegen/gen_knobs.cpp',
181    'rasterizer/archrast/gen_ar_event.cpp',
182    ]
183
184built_sources += [backendPixelRateFiles, genRasterizerFiles]
185
186source = built_sources
187source += env.ParseSourceList(swrroot + 'Makefile.sources', [
188    'ARCHRAST_CXX_SOURCES',
189    'COMMON_CXX_SOURCES',
190    'CORE_CXX_SOURCES',
191    'MEMORY_CXX_SOURCES'
192])
193
194env.Prepend(CPPPATH = [
195    '.',
196    'rasterizer',
197    'rasterizer/codegen',
198    'rasterizer/core',
199    'rasterizer/jitter',
200    'rasterizer/archrast',
201    ])
202
203# AVX lib
204envavx = env.Clone()
205
206envavx.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX'])
207if env['platform'] == 'windows':
208    envavx.Append(CCFLAGS = ['/arch:AVX'])
209else:
210    envavx.Append(CCFLAGS = ['-mavx'])
211
212swrAVX = envavx.SharedLibrary(
213    target = 'swrAVX',
214    source = source,
215    OBJPREFIX = 'avx_'
216    )
217env.Alias('swrAVX', swrAVX)
218
219# AVX2 lib
220envavx2 = env.Clone()
221
222envavx2.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX2'])
223if env['platform'] == 'windows':
224    envavx2.Append(CCFLAGS = ['/arch:AVX2'])
225else:
226    envavx2.Append(CCFLAGS = ['-mavx2', '-mfma', '-mbmi2', '-mf16c'])
227
228swrAVX2 = envavx2.SharedLibrary(
229    target = 'swrAVX2',
230    source = source,
231    OBJPREFIX = 'avx2_'
232    )
233env.Alias('swrAVX2', swrAVX2)
234
235source = env.ParseSourceList(swrroot + 'Makefile.sources', [
236    'CXX_SOURCES',
237    'COMMON_CXX_SOURCES',
238    'JITTER_CXX_SOURCES',
239    'LOADER_SOURCES'
240])
241source += [
242    'rasterizer/codegen/gen_knobs.cpp',
243    'rasterizer/archrast/gen_ar_event.cpp',
244    ]
245
246# main SWR lib
247envSWR = envavx.Clone() # pick up the arch flag for intrinsic usage
248envSWR.Append(CPPDEFINES = ['HAVE_SWR_AVX', 'HAVE_SWR_AVX2'])
249swr = 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
256Depends(swr, ['swrAVX', 'swrAVX2'])
257
258env.Alias('swr', swr)
259
260env.Prepend(LIBS = [swr])
261
262Export('swr')
263