
Hardcode split to four files currently. Decreases swr build time on KNL by over 50%. Reviewed-by: Bruce Cherniak <bruce.cherniak at intel.com>
262 lines
8.3 KiB
Python
262 lines
8.3 KiB
Python
Import('*')
|
|
|
|
from sys import executable as python_cmd
|
|
import os.path
|
|
import distutils.version
|
|
|
|
if not env['swr']:
|
|
Return()
|
|
|
|
if not env['llvm']:
|
|
print 'warning: LLVM disabled: not building swr'
|
|
env['swr'] = False
|
|
Return()
|
|
|
|
if env['LLVM_VERSION'] < distutils.version.LooseVersion('3.9'):
|
|
print "warning: swr requires LLVM >= 3.9: not building swr"
|
|
env['swr'] = False
|
|
Return()
|
|
|
|
env.MSVC2013Compat()
|
|
|
|
env = env.Clone()
|
|
|
|
# construct llvm include dir
|
|
if env['platform'] == 'windows':
|
|
# on windows there is no llvm-config, so LLVM is defined
|
|
llvm_includedir = os.path.join(os.environ['LLVM'], 'include')
|
|
else:
|
|
llvm_config = os.environ.get('LLVM_CONFIG', 'llvm-config')
|
|
llvm_includedir = env.backtick('%s --includedir' % llvm_config).rstrip()
|
|
print "llvm include dir %s" % llvm_includedir
|
|
|
|
# the loader is included in the mesa lib itself
|
|
# All the remaining files are in loadable modules
|
|
loadersource = env.ParseSourceList('Makefile.sources', [
|
|
'LOADER_SOURCES'
|
|
])
|
|
|
|
if not env['msvc'] :
|
|
env.Append(CCFLAGS = [
|
|
'-std=c++11',
|
|
])
|
|
|
|
swrroot = '#src/gallium/drivers/swr/'
|
|
bldroot = Dir('.').abspath
|
|
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/codegen/gen_knobs.cpp',
|
|
script = swrroot + 'rasterizer/codegen/gen_knobs.py',
|
|
source = '',
|
|
command = python_cmd + ' $SCRIPT --output $TARGET --gen_cpp'
|
|
)
|
|
Depends('rasterizer/codegen/gen_knobs.cpp',
|
|
swrroot + 'rasterizer/codegen/templates/gen_knobs.cpp')
|
|
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/codegen/gen_knobs.h',
|
|
script = swrroot + 'rasterizer/codegen/gen_knobs.py',
|
|
source = '',
|
|
command = python_cmd + ' $SCRIPT --output $TARGET --gen_h'
|
|
)
|
|
Depends('rasterizer/codegen/gen_knobs.cpp',
|
|
swrroot + 'rasterizer/codegen/templates/gen_knobs.cpp')
|
|
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/jitter/gen_state_llvm.h',
|
|
script = swrroot + 'rasterizer/codegen/gen_llvm_types.py',
|
|
source = 'rasterizer/core/state.h',
|
|
command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET'
|
|
)
|
|
Depends('rasterizer/jitter/gen_state_llvm.h',
|
|
swrroot + 'rasterizer/codegen/templates/gen_llvm.hpp')
|
|
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/jitter/gen_builder.hpp',
|
|
script = swrroot + 'rasterizer/codegen/gen_llvm_ir_macros.py',
|
|
source = os.path.join(llvm_includedir, 'llvm/IR/IRBuilder.h'),
|
|
command = python_cmd + ' $SCRIPT --input $SOURCE --output ' + bldroot + '/rasterizer/jitter --gen_h'
|
|
)
|
|
Depends('rasterizer/jitter/gen_builder.hpp',
|
|
swrroot + 'rasterizer/codegen/templates/gen_builder.hpp')
|
|
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/jitter/gen_builder_x86.hpp',
|
|
script = swrroot + 'rasterizer/codegen/gen_llvm_ir_macros.py',
|
|
source = '',
|
|
command = python_cmd + ' $SCRIPT --output ' + bldroot + '/rasterizer/jitter --gen_x86_h'
|
|
)
|
|
Depends('rasterizer/jitter/gen_builder.hpp',
|
|
swrroot + 'rasterizer/codegen/templates/gen_builder.hpp')
|
|
|
|
env.CodeGenerate(
|
|
target = './gen_swr_context_llvm.h',
|
|
script = swrroot + 'rasterizer/codegen/gen_llvm_types.py',
|
|
source = 'swr_context.h',
|
|
command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET'
|
|
)
|
|
Depends('rasterizer/jitter/gen_state_llvm.h',
|
|
swrroot + 'rasterizer/codegen/templates/gen_llvm.hpp')
|
|
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/archrast/gen_ar_event.hpp',
|
|
script = swrroot + 'rasterizer/codegen/gen_archrast.py',
|
|
source = 'rasterizer/archrast/events.proto',
|
|
command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_event_h'
|
|
)
|
|
Depends('rasterizer/jitter/gen_state_llvm.h',
|
|
swrroot + 'rasterizer/codegen/templates/gen_ar_event.hpp')
|
|
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/archrast/gen_ar_event.cpp',
|
|
script = swrroot + 'rasterizer/codegen/gen_archrast.py',
|
|
source = 'rasterizer/archrast/events.proto',
|
|
command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_event_cpp'
|
|
)
|
|
Depends('rasterizer/jitter/gen_state_llvm.h',
|
|
swrroot + 'rasterizer/codegen/templates/gen_ar_event.cpp')
|
|
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/archrast/gen_ar_eventhandler.hpp',
|
|
script = swrroot + 'rasterizer/codegen/gen_archrast.py',
|
|
source = 'rasterizer/archrast/events.proto',
|
|
command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_eventhandler_h'
|
|
)
|
|
Depends('rasterizer/jitter/gen_state_llvm.h',
|
|
swrroot + 'rasterizer/codegen/templates/gen_ar_eventhandler.hpp')
|
|
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/archrast/gen_ar_eventhandlerfile.hpp',
|
|
script = swrroot + 'rasterizer/codegen/gen_archrast.py',
|
|
source = 'rasterizer/archrast/events.proto',
|
|
command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_eventhandlerfile_h'
|
|
)
|
|
Depends('rasterizer/jitter/gen_state_llvm.h',
|
|
swrroot + 'rasterizer/codegen/templates/gen_ar_eventhandlerfile.hpp')
|
|
|
|
# 5 SWR_MULTISAMPLE_TYPE_COUNT
|
|
# 2 SWR_MSAA_SAMPLE_PATTERN_COUNT
|
|
# 3 SWR_INPUT_COVERAGE_COUNT
|
|
# 2 centroid
|
|
# 2 forcedSampleCount
|
|
# 2 canEarlyZ
|
|
backendPixelRateFileCount = 4
|
|
backendPixelRateFilePat = "rasterizer/core/backends/gen_BackendPixelRate%s.cpp"
|
|
backendPixelRateFiles = map(lambda x: backendPixelRateFilePat % x,
|
|
range(0, backendPixelRateFileCount))
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/core/backends/gen_BackendPixelRate.hpp',
|
|
script = swrroot + 'rasterizer/codegen/gen_backends.py',
|
|
source = '',
|
|
command = python_cmd + ' $SCRIPT --outdir ' + bldroot + '/rasterizer/core/backends --dim 5 2 3 2 2 2 --numfiles ' + str(backendPixelRateFileCount) + ' --cpp --hpp'
|
|
)
|
|
Depends(backendPixelRateFiles,
|
|
['rasterizer/core/backends/gen_BackendPixelRate.hpp',
|
|
'rasterizer/archrast/gen_ar_event.hpp',
|
|
'rasterizer/codegen/gen_knobs.h']
|
|
)
|
|
|
|
# 5 SWR_MULTISAMPLE_TYPE_COUNT
|
|
# 2 CenterPattern
|
|
# 2 Conservative
|
|
# 3 SWR_INPUT_COVERAGE_COUNT
|
|
# 5 STATE_VALID_TRI_EDGE_COUNT
|
|
# 2 RasterScissorEdges
|
|
genRasterizerFileCount = 4
|
|
genRasterizerFilePat = "rasterizer/core/backends/gen_rasterizer%s.cpp"
|
|
genRasterizerFiles = map(lambda x: genRasterizerFilePat % x,
|
|
range(0, genRasterizerFileCount))
|
|
env.CodeGenerate(
|
|
target = 'rasterizer/core/backends/gen_rasterizer.hpp',
|
|
script = swrroot + 'rasterizer/codegen/gen_backends.py',
|
|
source = '',
|
|
command = python_cmd + ' $SCRIPT --outdir ' + bldroot + '/rasterizer/core/backends --rast --dim 5 2 2 3 5 2 --numfiles ' + str(genRasterizerFileCount) + ' --cpp --hpp'
|
|
)
|
|
Depends(genRasterizerFiles,
|
|
['rasterizer/core/backends/gen_rasterizer.hpp',
|
|
'rasterizer/archrast/gen_ar_event.hpp',
|
|
'rasterizer/codegen/gen_knobs.h']
|
|
)
|
|
|
|
Depends('rasterizer/jitter/gen_state_llvm.h',
|
|
swrroot + 'rasterizer/codegen/templates/gen_backend.cpp')
|
|
|
|
# Auto-generated .cpp files (that need to generate object files)
|
|
built_sources = [
|
|
'rasterizer/codegen/gen_knobs.cpp',
|
|
'rasterizer/archrast/gen_ar_event.cpp',
|
|
]
|
|
|
|
built_sources += [backendPixelRateFiles, genRasterizerFiles]
|
|
|
|
source = built_sources
|
|
source += env.ParseSourceList(swrroot + 'Makefile.sources', [
|
|
'CXX_SOURCES',
|
|
'ARCHRAST_CXX_SOURCES',
|
|
'COMMON_CXX_SOURCES',
|
|
'CORE_CXX_SOURCES',
|
|
'JITTER_CXX_SOURCES',
|
|
'MEMORY_CXX_SOURCES'
|
|
])
|
|
|
|
env.Prepend(LIBS = [ mesautil, mesa, gallium ])
|
|
|
|
env.Prepend(CPPPATH = [
|
|
'.',
|
|
'rasterizer',
|
|
'rasterizer/codegen',
|
|
'rasterizer/core',
|
|
'rasterizer/jitter',
|
|
'rasterizer/archrast',
|
|
])
|
|
|
|
# AVX lib
|
|
envavx = env.Clone()
|
|
|
|
envavx.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX'])
|
|
if env['platform'] == 'windows':
|
|
envavx.Append(CCFLAGS = ['/arch:AVX'])
|
|
else:
|
|
envavx.Append(CCFLAGS = ['-mavx'])
|
|
|
|
swrAVX = envavx.SharedLibrary(
|
|
target = 'swrAVX',
|
|
source = source,
|
|
OBJPREFIX = 'avx_'
|
|
)
|
|
env.Alias('swrAVX', swrAVX)
|
|
|
|
# AVX2 lib
|
|
envavx2 = env.Clone()
|
|
|
|
envavx2.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX2'])
|
|
if env['platform'] == 'windows':
|
|
envavx2.Append(CCFLAGS = ['/arch:AVX2'])
|
|
else:
|
|
envavx2.Append(CCFLAGS = ['-mavx2', '-mfma', '-mbmi2', '-mf16c'])
|
|
|
|
swrAVX2 = envavx2.SharedLibrary(
|
|
target = 'swrAVX2',
|
|
source = source,
|
|
OBJPREFIX = 'avx2_'
|
|
)
|
|
env.Alias('swrAVX2', swrAVX2)
|
|
|
|
|
|
# main SWR lib
|
|
swr = env.ConvenienceLibrary(
|
|
target = 'swr',
|
|
source = loadersource,
|
|
)
|
|
|
|
|
|
# treat arch libs as dependencies, even though they are not linked
|
|
# into swr, so we don't have to build them separately
|
|
Depends(swr, ['swrAVX', 'swrAVX2'])
|
|
|
|
env.Alias('swr', swr)
|
|
|
|
env.Prepend(LIBS = [swr])
|
|
|
|
Export('swr')
|