1*61046927SAndroid Build Coastguard Worker# Copyright © Microsoft Corporation 2*61046927SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT 3*61046927SAndroid Build Coastguard Worker 4*61046927SAndroid Build Coastguard Workerfiles_libmesaclc = files( 5*61046927SAndroid Build Coastguard Worker 'clc.c', 6*61046927SAndroid Build Coastguard Worker 'clc_helpers.cpp', 7*61046927SAndroid Build Coastguard Worker 'nir_load_libclc.c', 8*61046927SAndroid Build Coastguard Worker) 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker_libmesaclc_c_args = [] 11*61046927SAndroid Build Coastguard Worker_libmesaclc_cpp_args = ['-DLLVM_LIB_DIR="@0@"'.format(llvm_libdir)] 12*61046927SAndroid Build Coastguard Worker_libmesaclc_sources = [] 13*61046927SAndroid Build Coastguard Worker 14*61046927SAndroid Build Coastguard Workerif not _shared_llvm 15*61046927SAndroid Build Coastguard Worker # LLVM 16 moved clang header path from using full version to only major version 16*61046927SAndroid Build Coastguard Worker if dep_llvm.version().version_compare('< 16') 17*61046927SAndroid Build Coastguard Worker # Prior to LLVM 16, this path used a full version 18*61046927SAndroid Build Coastguard Worker clang_version_dir = dep_llvm.version() 19*61046927SAndroid Build Coastguard Worker else 20*61046927SAndroid Build Coastguard Worker # LLVM 16 changed to only using a major version 21*61046927SAndroid Build Coastguard Worker clang_version_dir = dep_llvm.version().split('.')[0] 22*61046927SAndroid Build Coastguard Worker endif 23*61046927SAndroid Build Coastguard Worker clang_resource_dir = join_paths(llvm_libdir, 'clang', clang_version_dir, 'include') 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker opencl_c_base_h = custom_target( 26*61046927SAndroid Build Coastguard Worker 'opencl-c-base.h', 27*61046927SAndroid Build Coastguard Worker input : [files_xxd, join_paths(clang_resource_dir, 'opencl-c-base.h')], 28*61046927SAndroid Build Coastguard Worker output : 'opencl-c-base.h.h', 29*61046927SAndroid Build Coastguard Worker command : [prog_python, '@INPUT@', '@OUTPUT@', '-n', 'opencl_c_base_source'], 30*61046927SAndroid Build Coastguard Worker ) 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker opencl_c_h = custom_target( 33*61046927SAndroid Build Coastguard Worker 'opencl-c.h', 34*61046927SAndroid Build Coastguard Worker input : [files_xxd, join_paths(clang_resource_dir, 'opencl-c.h')], 35*61046927SAndroid Build Coastguard Worker output : 'opencl-c.h.h', 36*61046927SAndroid Build Coastguard Worker command : [prog_python, '@INPUT@', '@OUTPUT@', '-n', 'opencl_c_source'], 37*61046927SAndroid Build Coastguard Worker ) 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Worker _libmesaclc_sources += [opencl_c_base_h, opencl_c_h] 40*61046927SAndroid Build Coastguard Worker _libmesaclc_cpp_args += ['-DUSE_STATIC_OPENCL_C_H=1'] 41*61046927SAndroid Build Coastguard Workerendif 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker_basedir = dep_clc.get_variable(pkgconfig : 'libexecdir') 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard Worker_static_libclc = get_option('static-libclc') 46*61046927SAndroid Build Coastguard Workerif _static_libclc.length() > 0 47*61046927SAndroid Build Coastguard Worker if _static_libclc.contains('all') 48*61046927SAndroid Build Coastguard Worker _static_libclc = ['spirv', 'spirv64'] 49*61046927SAndroid Build Coastguard Worker endif 50*61046927SAndroid Build Coastguard Worker prog_zstd = find_program('zstd', required : false, native : true) 51*61046927SAndroid Build Coastguard Worker _zstd_static_libclc = dep_zstd.found() and prog_zstd.found() 52*61046927SAndroid Build Coastguard Worker if _zstd_static_libclc 53*61046927SAndroid Build Coastguard Worker _libmesaclc_c_args += '-DHAVE_STATIC_LIBCLC_ZSTD' 54*61046927SAndroid Build Coastguard Worker endif 55*61046927SAndroid Build Coastguard Worker foreach s : _static_libclc 56*61046927SAndroid Build Coastguard Worker _libmesaclc_c_args += '-DHAVE_STATIC_LIBCLC_@0@'.format(s.to_upper()) 57*61046927SAndroid Build Coastguard Worker f = '@[email protected]'.format(s) 58*61046927SAndroid Build Coastguard Worker _libclc_file = _basedir / f 59*61046927SAndroid Build Coastguard Worker if _zstd_static_libclc 60*61046927SAndroid Build Coastguard Worker _libclc_file = custom_target( 61*61046927SAndroid Build Coastguard Worker '@[email protected]'.format(f), 62*61046927SAndroid Build Coastguard Worker command : [prog_zstd, '-f', '@INPUT@', '-o', '@OUTPUT@'], 63*61046927SAndroid Build Coastguard Worker input : [_libclc_file], 64*61046927SAndroid Build Coastguard Worker output : '@[email protected]'.format(f), 65*61046927SAndroid Build Coastguard Worker ) 66*61046927SAndroid Build Coastguard Worker endif 67*61046927SAndroid Build Coastguard Worker files_libmesaclc += custom_target( 68*61046927SAndroid Build Coastguard Worker '@[email protected]'.format(f), 69*61046927SAndroid Build Coastguard Worker command : [ 70*61046927SAndroid Build Coastguard Worker prog_python, files_xxd, '-b', '@INPUT@', '@OUTPUT@', 71*61046927SAndroid Build Coastguard Worker '-n', 'libclc_@0@_mesa3d_spv'.format(s), 72*61046927SAndroid Build Coastguard Worker ], 73*61046927SAndroid Build Coastguard Worker input : [_libclc_file], 74*61046927SAndroid Build Coastguard Worker output : '@[email protected]'.format(f), 75*61046927SAndroid Build Coastguard Worker depend_files : files_xxd, 76*61046927SAndroid Build Coastguard Worker ) 77*61046927SAndroid Build Coastguard Worker endforeach 78*61046927SAndroid Build Coastguard Workerelse 79*61046927SAndroid Build Coastguard Worker _libmesaclc_c_args += ['-DDYNAMIC_LIBCLC_PATH="@0@/"'.format(_basedir)] 80*61046927SAndroid Build Coastguard Worker if not cc.has_function('mmap') 81*61046927SAndroid Build Coastguard Worker error('mmap required for dynamic libCLC loading') 82*61046927SAndroid Build Coastguard Worker endif 83*61046927SAndroid Build Coastguard Workerendif 84*61046927SAndroid Build Coastguard Worker 85*61046927SAndroid Build Coastguard Workerhas_spirv_link_workaround = cpp.has_member( 86*61046927SAndroid Build Coastguard Worker 'spvtools::LinkerOptions', 87*61046927SAndroid Build Coastguard Worker 'SetAllowPtrTypeMismatch(true)', 88*61046927SAndroid Build Coastguard Worker prefix : [ 89*61046927SAndroid Build Coastguard Worker '#include <spirv-tools/linker.hpp>', 90*61046927SAndroid Build Coastguard Worker ], 91*61046927SAndroid Build Coastguard Worker dependencies : dep_spirv_tools, 92*61046927SAndroid Build Coastguard Worker) 93*61046927SAndroid Build Coastguard Worker 94*61046927SAndroid Build Coastguard Workerif has_spirv_link_workaround 95*61046927SAndroid Build Coastguard Worker _libmesaclc_c_args += ['-DHAS_SPIRV_LINK_LLVM_WORKAROUND=1'] 96*61046927SAndroid Build Coastguard Workerendif 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Worker_libmesaclc = static_library( 99*61046927SAndroid Build Coastguard Worker 'libmesaclc', 100*61046927SAndroid Build Coastguard Worker files_libmesaclc, 101*61046927SAndroid Build Coastguard Worker sources: _libmesaclc_sources, 102*61046927SAndroid Build Coastguard Worker include_directories : [inc_include, inc_src, inc_spirv], 103*61046927SAndroid Build Coastguard Worker c_args : _libmesaclc_c_args, 104*61046927SAndroid Build Coastguard Worker cpp_args : [_libmesaclc_cpp_args, _libmesaclc_c_args], 105*61046927SAndroid Build Coastguard Worker dependencies: [idep_nir, dep_clang, dep_llvm, dep_llvmspirvlib, 106*61046927SAndroid Build Coastguard Worker idep_mesautil, dep_spirv_tools, idep_vtn] 107*61046927SAndroid Build Coastguard Worker) 108*61046927SAndroid Build Coastguard Worker 109*61046927SAndroid Build Coastguard Worker_idep_mesaclc_link_args = [] 110*61046927SAndroid Build Coastguard Workerif _shared_llvm 111*61046927SAndroid Build Coastguard Worker _idep_mesaclc_link_args += cc.get_supported_link_arguments('-fPIC') 112*61046927SAndroid Build Coastguard Workerendif 113*61046927SAndroid Build Coastguard Worker 114*61046927SAndroid Build Coastguard Workeridep_mesaclc = declare_dependency( 115*61046927SAndroid Build Coastguard Worker link_with : _libmesaclc, 116*61046927SAndroid Build Coastguard Worker include_directories : include_directories('.'), 117*61046927SAndroid Build Coastguard Worker link_args : _idep_mesaclc_link_args, 118*61046927SAndroid Build Coastguard Worker) 119