mesa/src/util/meson.build

388 lines
9.7 KiB
Meson
Raw Normal View History

# Copyright © 2017 Intel Corporation
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
inc_util = include_directories('.')
subdir('format')
files_mesa_util = files(
'anon_file.h',
'anon_file.c',
'bigmath.h',
'bitscan.c',
'bitscan.h',
'bitset.h',
'blob.c',
'blob.h',
'build_id.c',
'build_id.h',
'cnd_monotonic.h',
'compiler.h',
'crc32.c',
'crc32.h',
'dag.c',
'debug.c',
'debug.h',
'disk_cache.c',
'disk_cache.h',
'disk_cache_os.c',
'disk_cache_os.h',
'double.c',
'double.h',
'enum_operators.h',
'fast_idiv_by_const.c',
'fast_idiv_by_const.h',
'format_r11g11b10f.h',
'format_rgb9e5.h',
'format_srgb.h',
'futex.h',
'half_float.c',
'half_float.h',
'hash_table.c',
'hash_table.h',
'u_idalloc.c',
'u_idalloc.h',
'list.h',
mesa: Promote Intel's simple logging façade for Android to util/ I'm bringing up freedreno Vulkan on an Android phone, and my pains are exactly what Chad said when working on Intel's vulkan for Android in aa716db0f64d ("intel: Add simple logging façade for Android (v2)"): On Android, stdio goes to /dev/null. On Android, remote gdb is even more painful than the usual remote gdb. On Android, nothing works like you expect and debugging is hell. I need logging. This patch introduces a small, simple logging API that can easily wrap Android's API. On non-Android platforms, this logger does nothing fancy. It follows the time-honored Unix tradition of spewing everything to stderr with minimal fuss. My goal here is not perfection. My goal is to make a minimal, clean API, that people hate merely a little instead of a lot, and that's good enough to let me bring up Android Vulkan. And it needs to be fast, which means it must be small. No one wants to their game to miss frames while aiming a flaming bow into the jaws of an angry robot t-rex, and thus become t-rex breakfast, because some fool had too much fun desiging a bloated, ideal logging API. Compared to trusty fprintf, _mesa_log[ewi]() is actually usable on Android. Compared to os_log_message(), this has different error levels and supports format arguments. The only code change in the move is wrapping flockfile/funlockfile in !DETECT_OS_WINDOWS, since mingw32 doesn't have it. Windows likely wants different logging code, anyway. Reviewed-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6806>
2020-09-21 20:53:14 +01:00
'log.c',
'macros.h',
'memstream.c',
'memstream.h',
'mesa-sha1.c',
'mesa-sha1.h',
'os_time.c',
'os_time.h',
'os_file.c',
'os_misc.c',
'os_misc.h',
'os_socket.c',
'os_socket.h',
'u_process.c',
'u_process.h',
'rwlock.h',
'sha1/sha1.c',
'sha1/sha1.h',
'ralloc.c',
'ralloc.h',
'rand_xor.c',
'rand_xor.h',
'rb_tree.c',
'rb_tree.h',
'register_allocate.c',
'register_allocate.h',
'rgtc.c',
'rgtc.h',
'rounding.h',
'set.c',
'set.h',
'simple_list.h',
mesa: Add new fast mtx_t mutex type for basic use cases While modern pthread mutexes are very fast, they still incur a call to an external DSO and overhead of the generality and features of pthread mutexes. Most mutexes in mesa only needs lock/unlock, and the idea here is that we can inline the atomic operation and make the fast case just two intructions. Mutexes are subtle and finicky to implement, so we carefully copy the implementation from Ulrich Dreppers well-written and well-reviewed paper: "Futexes Are Tricky" http://www.akkadia.org/drepper/futex.pdf We implement "mutex3", which gives us a mutex that has no syscalls on uncontended lock or unlock. Further, the uncontended case boils down to a cmpxchg and an untaken branch and the uncontended unlock is just a locked decr and an untaken branch. We use __builtin_expect() to indicate that contention is unlikely so that gcc will put the contention code out of the main code flow. A fast mutex only supports lock/unlock, can't be recursive or used with condition variables. We keep the pthread mutex implementation around as for the few places where we use condition variables or recursive locking. For platforms or compilers where futex and atomics aren't available, simple_mtx_t falls back to the pthread mutex. The pthread mutex lock/unlock overhead shows up on benchmarks for CPU bound applications. Most CPU bound cases are helped and some of our internal bind_buffer_object heavy benchmarks gain up to 10%. Signed-off-by: Kristian Høgsberg <krh@bitplanet.net> Signed-off-by: Timothy Arceri <tarceri@itsqueeze.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
2017-10-16 08:06:49 +01:00
'simple_mtx.h',
'slab.c',
'slab.h',
'softfloat.c',
'softfloat.h',
'sparse_array.c',
'sparse_array.h',
'string_buffer.c',
'string_buffer.h',
'strndup.h',
'strtod.c',
'strtod.h',
'texcompress_rgtc_tmp.h',
'timespec.h',
'u_atomic.c',
'u_atomic.h',
'u_dynarray.h',
'u_endian.h',
'u_queue.c',
'u_queue.h',
'u_string.h',
'u_thread.h',
'u_vector.c',
'u_vector.h',
'u_math.c',
'u_math.h',
'u_memset.h',
'u_mm.c',
'u_mm.h',
'u_debug.c',
'u_debug.h',
'u_debug_memory.c',
'u_cpu_detect.c',
'u_cpu_detect.h',
'u_printf.cpp',
'u_printf.h',
'vma.c',
'vma.h',
'xxhash.h',
)
files_drirc = files('00-mesa-defaults.conf')
install_data(files_drirc, install_dir : join_paths(get_option('datadir'), 'drirc.d'))
if with_tests
prog_xmllint = find_program('xmllint', required : false, native : true)
if prog_xmllint.found()
test(
'drirc xml validation',
prog_xmllint,
args : ['--noout', '--valid', files_drirc],
suite : ['util'],
)
endif
endif
files_xmlconfig = files(
'xmlconfig.c',
'xmlconfig.h',
)
format_srgb = custom_target(
'format_srgb',
input : ['format_srgb.py'],
output : 'format_srgb.c',
command : [prog_python, '@INPUT0@'],
capture : true,
)
deps_for_libmesa_util = [
dep_zlib,
dep_clock,
dep_thread,
dep_atomic,
dep_m,
dep_valgrind,
dep_zstd,
dep_dl,
dep_unwind,
]
if with_platform_android
deps_for_libmesa_util += dep_android
files_debug_stack = files('u_debug_stack_android.cpp')
else
files_debug_stack = files(
'u_debug_stack.c',
'u_debug_symbol.c',
'u_debug_symbol.h',
)
endif
if with_platform_haiku
deps_for_libmesa_util += dep_network
endif
_libmesa_util = static_library(
'mesa_util',
[files_mesa_util, files_debug_stack, format_srgb],
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
dependencies : deps_for_libmesa_util,
link_with: libmesa_format,
c_args : [c_msvc_compat_args],
gnu_symbol_visibility : 'hidden',
build_by_default : false
)
idep_mesautil = declare_dependency(
link_with : _libmesa_util,
include_directories : inc_util,
dependencies : [dep_zlib, dep_clock, dep_thread, dep_atomic, dep_m, dep_valgrind],
)
xmlconfig_deps = []
if not (with_platform_android or with_platform_windows)
xmlconfig_deps += dep_expat
endif
_libxmlconfig = static_library(
'xmlconfig',
files_xmlconfig,
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
dependencies : [idep_mesautil, dep_m, xmlconfig_deps],
c_args : [
c_msvc_compat_args,
'-DSYSCONFDIR="@0@"'.format(
join_paths(get_option('prefix'), get_option('sysconfdir'))
),
'-DDATADIR="@0@"'.format(
join_paths(get_option('prefix'), get_option('datadir'))
),
],
gnu_symbol_visibility : 'hidden',
build_by_default : false,
)
idep_xmlconfig = declare_dependency(
dependencies : xmlconfig_deps,
link_with : _libxmlconfig,
)
files_xxd = files('xxd.py')
if with_tests
# DRI_CONF macros use designated initializers (required for union
# initializaiton), so we need c++2a since gtest forces us to use c++
if host_machine.system() != 'windows' and cpp.has_argument('-std=c++2a')
test('xmlconfig',
executable('xmlconfig_test',
files('tests/xmlconfig.cpp'),
include_directories : [inc_include, inc_src],
dependencies : [idep_mesautil, idep_xmlconfig, idep_gtest],
override_options : ['cpp_std=c++2a'],
cpp_args: ['-Wno-write-strings']
),
suite : ['util'],
env: ['HOME=' + join_paths(meson.current_source_dir(),
'tests', 'drirc_home'),
'DRIRC_CONFIGDIR=' + join_paths(meson.current_source_dir(),
'tests', 'drirc_configdir')]
)
endif
test(
'u_atomic',
executable(
'u_atomic_test',
files('u_atomic_test.c'),
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
dependencies : idep_mesautil,
c_args : [c_msvc_compat_args],
),
suite : ['util'],
)
test(
'blob',
executable(
'blob_test',
files('blob_test.c'),
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
dependencies : idep_mesautil,
c_args : [c_msvc_compat_args],
),
suite : ['util'],
)
test(
'rb_tree',
executable(
'rb_tree_test',
files('rb_tree_test.c'),
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
dependencies : idep_mesautil,
c_args : [c_msvc_compat_args],
),
suite : ['util'],
)
test(
'roundeven',
executable(
'roundeven_test',
files('roundeven_test.c'),
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
c_args : [c_msvc_compat_args],
dependencies : [dep_m],
),
suite : ['util'],
should_fail : meson.get_cross_property('xfail', '').contains('roundeven'),
)
# FIXME: this test crashes on windows
if host_machine.system() != 'windows'
test(
'mesa-sha1',
executable(
'mesa-sha1_test',
files('mesa-sha1_test.c'),
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
link_with : _libmesa_util,
c_args : [c_msvc_compat_args],
),
suite : ['util'],
)
endif
test(
'bitset',
executable(
'bitset_test',
files('bitset_test.cpp'),
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
dependencies : [idep_mesautil, idep_gtest],
),
suite : ['util'],
)
test(
'u_debug_stack',
executable(
'u_debug_stack_test',
files('u_debug_stack_test.cpp'),
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
dependencies : [idep_mesautil, idep_gtest],
c_args : [c_msvc_compat_args],
),
suite : ['util'],
)
process_test_exe = executable(
'process_test',
files('process_test.c'),
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
dependencies : idep_mesautil,
c_args : [c_msvc_compat_args],
)
if (host_machine.system() == 'windows' and build_machine.system() != 'windows')
# This conversion is only required on mingw crosscompilers, otherwise we hit at least one of these issues
# https://gitlab.freedesktop.org/mesa/mesa/-/issues/2690
# https://gitlab.freedesktop.org/mesa/mesa/-/issues/2788
prog_winepath = find_program('winepath')
process_test_exe_full_path = run_command(
prog_winepath, '-w', process_test_exe.full_path()
).stdout().strip()
else
process_test_exe_full_path = process_test_exe.full_path()
endif
test(
'process',
process_test_exe,
suite : ['util'],
env: ['BUILD_FULL_PATH='+process_test_exe_full_path]
)
subdir('tests/fast_idiv_by_const')
subdir('tests/fast_urem_by_const')
subdir('tests/hash_table')
if not (host_machine.system() == 'windows' and cc.get_id() == 'gcc')
# FIXME: These tests fail with mingw, but not with msvc.
subdir('tests/string_buffer')
endif
if cc.has_header('sys/time.h') # MinGW has this, but Vanilla windows doesn't
subdir('tests/timespec')
endif
subdir('tests/vma')
subdir('tests/set')
subdir('tests/sparse_array')
subdir('tests/format')
subdir('tests/vector')
endif