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