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