diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cache/handlers/file.c | 2 | ||||
| -rw-r--r-- | src/codec/codec.h | 2 | ||||
| -rw-r--r-- | src/codec/ffmpeg/common.c | 16 | ||||
| -rw-r--r-- | src/codec/ffmpeg/decoder.c | 17 | ||||
| -rw-r--r-- | src/codec/ffmpeg/decoder.h | 2 | ||||
| -rw-r--r-- | src/codec/ffmpeg/demuxer.c | 12 | ||||
| -rw-r--r-- | src/codec/ffmpeg/meson.build | 157 | ||||
| -rw-r--r-- | src/codec/ffmpeg/packet_ext.c | 8 | ||||
| -rw-r--r-- | src/fruits/cmsrv/ui.c | 2 | ||||
| -rw-r--r-- | src/fruits/cmv/cmv.c | 12 | ||||
| -rw-r--r-- | src/liana/list_cmp.h | 6 | ||||
| -rw-r--r-- | src/libsink/desktop.c | 4 | ||||
| -rw-r--r-- | src/mixer/audio_miniaudio.c | 3 | ||||
| -rw-r--r-- | src/mixer/meson.build | 20 | ||||
| -rw-r--r-- | src/render/meson.build | 215 |
15 files changed, 261 insertions, 217 deletions
diff --git a/src/cache/handlers/file.c b/src/cache/handlers/file.c index dba5649..1a70350 100644 --- a/src/cache/handlers/file.c +++ b/src/cache/handlers/file.c @@ -30,7 +30,7 @@ static s32 handler_file_guess_format(struct cch_handler *handler) struct cch_backing_file *backing = (struct cch_backing_file *)file->backing; str *path = &backing->file.path; u32 dot = al_str_rfind(path, '.'); - if (dot != AL_STR_NPOS) { + if (dot != AL_STR_NO_POS) { str ext = al_str_substr(path, dot, path->length); return camu_guess_format(NULL, &ext, NULL); } diff --git a/src/codec/codec.h b/src/codec/codec.h index 701ef16..9820316 100644 --- a/src/codec/codec.h +++ b/src/codec/codec.h @@ -56,8 +56,10 @@ enum { CAMU_SAMPLE_FORMAT_S32P = AV_SAMPLE_FMT_S32P, CAMU_SAMPLE_FORMAT_FLTP = AV_SAMPLE_FMT_FLTP, CAMU_SAMPLE_FORMAT_DBLP = AV_SAMPLE_FMT_DBLP, +#ifndef CAMU_OLD_FFMPEG CAMU_SAMPLE_FORMAT_S64 = AV_SAMPLE_FMT_S64, CAMU_SAMPLE_FORMAT_S64P = AV_SAMPLE_FMT_S64P +#endif }; enum { diff --git a/src/codec/ffmpeg/common.c b/src/codec/ffmpeg/common.c index 5226df6..e697a00 100644 --- a/src/codec/ffmpeg/common.c +++ b/src/codec/ffmpeg/common.c @@ -1,4 +1,5 @@ #define AL_LOG_SECTION "ff" +//#define AL_LOG_ENABLE_TRACE #include <al/log.h> #include <al/lib.h> #include <libavutil/log.h> @@ -27,10 +28,6 @@ static void av_log_callback(void *userdata, s32 level, const char *fmt, va_list { (void)userdata; - if (level >= AV_LOG_DEBUG) { - return; - } - char *offset = log_context.buf + log_context.pos; s32 ret = al_vsnprintf(offset, AV_LOG_MAX_CHUNK, fmt, args); al_assert(ret > 0); @@ -41,8 +38,10 @@ static void av_log_callback(void *userdata, s32 level, const char *fmt, va_list if ((log_context.pos > 0 && *(offset - 1) == '\n') || log_context.pos >= AV_LOG_MAX_CHUNK) { if (level < AV_LOG_WARNING) { log_info(log_context.buf); - } else { + } else if (level < AL_LOG_DEBUG) { log_debug(log_context.buf); + } else { + log_trace(log_context.buf); } log_context.pos = 0; } @@ -55,9 +54,14 @@ void camu_ff_set_log_callback(void (*callback)(void *, s32, const char *, va_lis void camu_ff_common_init(void) { - log_info("Using FFmpeg version "FFMPEG_VERSION"."); + #ifdef CAMU_OLD_FFMPEG + log_info("Using FFmpeg version "FFMPEG_VERSION" (old)."); + AL_IGNORE_WARNING("-Wdeprecated-declarations") av_register_all(); + AL_IGNORE_WARNING_END +#else + log_info("Using FFmpeg version "FFMPEG_VERSION"."); #endif camu_ff_set_log_callback(av_log_callback); } diff --git a/src/codec/ffmpeg/decoder.c b/src/codec/ffmpeg/decoder.c index 7be21a2..47bab44 100644 --- a/src/codec/ffmpeg/decoder.c +++ b/src/codec/ffmpeg/decoder.c @@ -5,17 +5,20 @@ #include "decoder.h" -#if !defined CAMU_SINK_NO_VIDEO && defined CAMU_FF_DECODER_HWACCEL +#ifdef CAMU_FF_DECODER_HWACCEL #include "../../render/renderer.h" static const char *hwdevces[] = { -#if defined STELA_API_VULKAN +#ifdef CAMU_HAVE_VULKAN_DECODE "vulkan", -#else -#if defined NAUNET_ON_WINDOWS - "d3d11va", -#else +#endif +#ifdef CAMU_HAVE_VAAPI "vaapi", #endif +#ifdef CAMU_HAVE_D3D11VA + "d3d11va", +#endif +#ifdef CAMU_HAVE_DXVA2 + "dxva2", #endif }; #endif @@ -179,6 +182,8 @@ static bool get_hwdevice_config(struct camu_ff_decoder *av, const AVCodec *codec return true; } } + const char *hwdevice_name = av_hwdevice_get_type_name(hw_device_type); + log_warn("No hw_config for device type %s (type: %d).", hwdevice_name, hw_device_type); return false; } diff --git a/src/codec/ffmpeg/decoder.h b/src/codec/ffmpeg/decoder.h index 85b88dc..ff513b9 100644 --- a/src/codec/ffmpeg/decoder.h +++ b/src/codec/ffmpeg/decoder.h @@ -4,7 +4,7 @@ #include "../codec.h" -#ifdef CAMU_USE_HWACCEL +#if defined CAMU_TRY_HWACCEL && !defined CAMU_SINK_NO_VIDEO #define CAMU_FF_DECODER_HWACCEL #endif diff --git a/src/codec/ffmpeg/demuxer.c b/src/codec/ffmpeg/demuxer.c index f05cfa9..a8f1df7 100644 --- a/src/codec/ffmpeg/demuxer.c +++ b/src/codec/ffmpeg/demuxer.c @@ -1,4 +1,5 @@ #define AL_LOG_SECTION "ff_demuxer" +//#define AL_LOG_ENABLE_TRACE #include <al/log.h> #include <al/lib.h> @@ -9,7 +10,12 @@ static void close_internal(struct camu_ff_demuxer *av) { if (av->io_context) { av_free(av->io_context->buffer); +#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 80, 100) avio_context_free(&av->io_context); +#else + av_free(av->io_context); + av->io_context = NULL; +#endif } if (av->format_context) { avformat_flush(av->format_context); @@ -126,9 +132,13 @@ static bool ff_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handl })); } +#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(60, 30, 100) av_format_inject_global_side_data(av->format_context); +#endif - //av_dump_format(av->format_context, 0, "", 0); +#ifdef AL_LOG_ENABLE_TRACE + av_dump_format(av->format_context, 0, "", 0); +#endif av->eof = false; diff --git a/src/codec/ffmpeg/meson.build b/src/codec/ffmpeg/meson.build index 56a75b2..6482426 100644 --- a/src/codec/ffmpeg/meson.build +++ b/src/codec/ffmpeg/meson.build @@ -1,97 +1,88 @@ -ffmpeg_src = [ - 'common.c', - 'packet_ext.c', -] +ffmpeg_src = ['common.c', 'packet_ext.c'] ffmpeg_args = ['-DCAMU_HAVE_FFMPEG'] -if get_option('codec-hwaccel').enabled() - ffmpeg_args += ['-DCAMU_USE_HWACCEL'] -endif -ffmpeg_deps = [] - -ffmpeg_server_src = [ - ffmpeg_src, - 'demuxer.c', - 'avio.c' -] -ffmpeg_server_deps = [] - -ffmpeg_client_src = [ - ffmpeg_src, - 'decoder.c', - 'resampler.c', - 'scaler.c' -] -ffmpeg_client_deps = [] +ffmpeg_server_src = [ffmpeg_src, 'demuxer.c', 'avio.c'] server_transcode = not get_option('sink-only') if server_transcode - ffmpeg_server_src += [ - 'decoder.c', - 'resampler.c', - 'scaler.c', - 'encoder.c' - ] + ffmpeg_server_src += ['decoder.c', 'resampler.c', 'scaler.c', 'encoder.c'] endif +ffmpeg_server_deps = [] + +ffmpeg_client_src = [ffmpeg_src, 'decoder.c', 'resampler.c', 'scaler.c'] +ffmpeg_client_deps = [] -libavutil = dependency('libavutil', required: false) -libavformat = dependency('libavformat', required: false) -libavcodec = dependency('libavcodec', required: false) -#libavdevice = dependency('libavdevice', required: false) -libswresample = dependency('libswresample', required: false) -libswscale = dependency('libswscale', required: false) -if not (libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found()) - if get_option('win32-compat') - ffmpeg_proj = subproject('ffmpeg-compat', required: false) - ffmpeg_args += ['-DCAMU_OLD_FFMPEG'] +ffmpeg_force_fallback = false +foreach dep: ['ffmpeg', 'libavutil', 'libavformat', 'libavcodec', 'libavdevice', 'libswresample', 'libswscale'] + if dep in get_option('force_fallback_for') + ffmpeg_force_fallback = true + break + endif +endforeach +ffmpeg_version_option = get_option('codec-ffmpeg-version') +# Check for FFmpeg version in the environment. +if not ffmpeg_force_fallback + libavutil_version_map = { '54': '2', '55': '3', '56': '4', '57': '5', '58': '6', '59': '7', '60': '8' } + libavutil_version_rev = { '2': '54', '3': '55', '4': '56', '5': '57', '6': '58', '7': '59', '8': '60' } + if ffmpeg_version_option != 'system' + ffmpeg_version_int = ffmpeg_version_option.to_int() + # Overriding a found dependency will error but overriding a found dependency of the wrong version is allowed. + libavutil_version_request = ['>=' + libavutil_version_rev[(ffmpeg_version_int).to_string()] + '.0.0'] + if ffmpeg_version_int < 8 + libavutil_version_request += ['<' + libavutil_version_rev[(ffmpeg_version_int + 1).to_string()] + '.0.0'] + endif + libavutil = dependency('libavutil', required: false, allow_fallback: false, version: libavutil_version_request) else - ffmpeg_proj = subproject('ffmpeg', required: false) + libavutil = dependency('libavutil', required: false, allow_fallback: false) endif - if ffmpeg_proj.found() - libavutil = ffmpeg_proj.get_variable('avutil') - libavformat = ffmpeg_proj.get_variable('avformat') - libavcodec = ffmpeg_proj.get_variable('avcodec') - #libavdevice = ffmpeg_proj.get_variable('avdevice') - libswresample = ffmpeg_proj.get_variable('swresample') - libswscale = ffmpeg_proj.get_variable('swscale') - # Only used to set include dirs for FFmpeg. - ffmpeg_deps += [ffmpeg_proj.get_variable('ffmpeg_include')] - # We explicitly enable zlib and maybe bzlib in the FFmpeg build. - ffmpeg_deps += [dependency('zlib')] - if not get_option('sink-only') - ffmpeg_deps += [dependency('bzip2')] + if libavutil.found() + ffmpeg_version_string = run_command('sh', join_paths(meson.current_source_dir(), 'version.sh'), check: true).stdout().strip() + if ffmpeg_version_string == '(unknown)' + ffmpeg_version_string = libavutil_version_map[libavutil.version().split('.')[0]] + '.x' endif - if is_windows and not get_option('win32-compat') - # Extra static dependencies for Windows. - ffmpeg_client_deps += [compiler.find_library('bcrypt')] - elif is_android - # Android MediaCodec HW decoding. - ffmpeg_client_deps += [compiler.find_library('mediandk')] + ffmpeg_args += ['-DFFMPEG_VERSION="' + ffmpeg_version_string + '"'] + if get_option('codec-hwaccels').length() > 0 + hwaccel_map = { + 'vulkan': '-DCAMU_HAVE_VULKAN_DECODE', + 'vaapi': '-DCAMU_HAVE_VAAPI', + 'd3d11va': '-DCAMU_HAVE_D3D11VA', + 'dxva2': '-DCAMU_HAVE_DXVA2', + 'mediacodec': '-DCAMU_HAVE_MEDIACODEC', + } + foreach hwaccel: get_option('codec-hwaccels') + if hwaccel in hwaccel_map + ffmpeg_args += hwaccel_map[hwaccel] + endif + endforeach + ffmpeg_args += ['-DCAMU_TRY_HWACCEL'] endif - ffmpeg_version_string = ffmpeg_proj.get_variable('ffmpeg_version_string') + elif ffmpeg_version_option == 'system' + error('System FFmpeg requested but not found. Add \'--force-fallback-for=ffmpeg\' or \'-Dcodec-ffmpeg-version=[8,7,6,...]\'.') endif -else - ffmpeg_version_string = run_command('sh', join_paths(meson.current_source_dir(), 'version.sh'), check: true).stdout().strip() endif - -if libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found() - # This is probably meaningless compared to libav* versions, it's just something I wanted. - ffmpeg_args += ['-DFFMPEG_VERSION="' + ffmpeg_version_string + '"'] - ffmpeg_server_deps += [libavutil, libavformat, libavcodec] - if server_transcode - ffmpeg_server_deps += [libswresample, libswscale] - endif - ffmpeg_client_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale] - soxr = compiler.find_library('soxr', required: false) - if soxr.found() - ffmpeg_client_deps += [soxr] - ffmpeg_args += ['-DCAMU_HAVE_SOXR'] +# Fallback if requested or necessary. +if ffmpeg_force_fallback or not libavutil.found() + if ffmpeg_version_option == 'system' + ffmpeg_version_option = '8' # Default to current latest. endif - codec_server_deps += [ - declare_dependency(sources: ffmpeg_server_src, - dependencies: [ffmpeg_deps, ffmpeg_server_deps], compile_args: ffmpeg_args) - ] - codec_client_deps += [ - declare_dependency(sources: ffmpeg_client_src, - dependencies: [ffmpeg_deps, ffmpeg_client_deps], compile_args: ffmpeg_args) - ] + subproject('ffmpeg' + ffmpeg_version_option) # Override libav dependencies. +endif + +libavutil = dependency('libavutil') +libavutil_version = libavutil.version().split('.')[0].to_int() +if libavutil_version <= 54 + error('FFmpeg version 2.x and lower currently unsupported.') +elif libavutil_version <= 56 + ffmpeg_args += ['-DCAMU_OLD_FFMPEG'] +endif +libavformat = dependency('libavformat') +libavcodec = dependency('libavcodec') +libavdevice = dependency('libavdevice') +libswresample = dependency('libswresample') +libswscale = dependency('libswscale') +ffmpeg_server_deps += [libavutil, libavformat, libavcodec] +if server_transcode + ffmpeg_server_deps += [libswresample, libswscale] endif +ffmpeg_client_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale] +codec_server_deps += [declare_dependency(sources: ffmpeg_server_src, dependencies: ffmpeg_server_deps, compile_args: ffmpeg_args)] +codec_client_deps += [declare_dependency(sources: ffmpeg_client_src, dependencies: ffmpeg_client_deps, compile_args: ffmpeg_args)] diff --git a/src/codec/ffmpeg/packet_ext.c b/src/codec/ffmpeg/packet_ext.c index 7dcda88..6b66dd1 100644 --- a/src/codec/ffmpeg/packet_ext.c +++ b/src/codec/ffmpeg/packet_ext.c @@ -16,7 +16,7 @@ void nn_packet_write_av_codec_parameters(struct nn_packet *packet, AVCodecParame NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->width); NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->height); NNWT_PACKET_WRITE_TYPE(packet, AVRational, codecpar->sample_aspect_ratio); -#if !defined CAMU_OLD_FFMPEG && LIBAVCODEC_VERSION_INT >= 60 +#if !defined CAMU_OLD_FFMPEG && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60, 11, 100) NNWT_PACKET_WRITE_TYPE(packet, AVRational, codecpar->framerate); #endif NNWT_PACKET_WRITE_TYPE(packet, enum AVFieldOrder, codecpar->field_order); @@ -108,6 +108,10 @@ void nn_packet_write_av_packet(struct nn_packet *packet, AVPacket *pkt) #endif } +// @TODO: coded_side_data +// https://github.com/FFmpeg/FFmpeg/blob/f62d8789116fef8d8cd7f20062b16ccd93f7ce23/doc/APIchanges#L537 +// https://ffmpeg.org/doxygen/8.0/structAVCodecParameters.html#ad54da9241deabb3601e6e0e8fa832c19 +// #if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(60, 30, 100) void nn_packet_read_av_codec_parameters(struct nn_packet *packet, AVCodecParameters *codecpar) { NNWT_PACKET_READ_TYPE(packet, enum AVMediaType, codecpar->codec_type); @@ -127,7 +131,7 @@ void nn_packet_read_av_codec_parameters(struct nn_packet *packet, AVCodecParamet NNWT_PACKET_READ_TYPE(packet, s32, codecpar->width); NNWT_PACKET_READ_TYPE(packet, s32, codecpar->height); NNWT_PACKET_READ_TYPE(packet, AVRational, codecpar->sample_aspect_ratio); -#if !defined CAMU_OLD_FFMPEG && LIBAVCODEC_VERSION_INT >= 60 +#if !defined CAMU_OLD_FFMPEG && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60, 11, 100) NNWT_PACKET_READ_TYPE(packet, AVRational, codecpar->framerate); #endif NNWT_PACKET_READ_TYPE(packet, enum AVFieldOrder, codecpar->field_order); diff --git a/src/fruits/cmsrv/ui.c b/src/fruits/cmsrv/ui.c index 4f1ece4..1dd5fa2 100644 --- a/src/fruits/cmsrv/ui.c +++ b/src/fruits/cmsrv/ui.c @@ -158,9 +158,11 @@ static void render_lists(struct cmsrv_ui *ui) if (resource->type == CAMU_RESOURCE_PORTAL) { putnwstr_maxwidth_yx(n, y, x, max_width - x, &resource->post->title); } else { +#endif char *c_str = al_str_to_c_str(&entry->brief); ncplane_putstr_yx(n, y, x, c_str); al_free(c_str); +#ifdef CAMU_HAVE_PORTAL } #endif if (++current_line >= max_height) break; diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c index 6875dd1..63e035d 100644 --- a/src/fruits/cmv/cmv.c +++ b/src/fruits/cmv/cmv.c @@ -49,9 +49,9 @@ static nn_thread_result NNWT_THREADCALL event_loop_thread(void *userdata) static bool parse_exe_name_params(str *exe_name, str *addr, struct lia_prefs *prefs) { u32 index = al_str_rfind(exe_name, '/'); - if (index == AL_STR_NPOS) { + if (index == AL_STR_NO_POS) { index = al_str_rfind(exe_name, '\\'); - if (index == AL_STR_NPOS) goto def; + if (index == AL_STR_NO_POS) goto def; } str sub = al_str_substr(exe_name, index + 1, exe_name->length); @@ -62,19 +62,19 @@ static bool parse_exe_name_params(str *exe_name, str *addr, struct lia_prefs *pr // Skip version. index = al_str_find(&sub, '-'); - if (index == AL_STR_NPOS) goto def; + if (index == AL_STR_NO_POS) goto def; sub = al_str_substr(&sub, index + 1, sub.length); index = al_str_find(&sub, '-'); - if (index == AL_STR_NPOS) goto def; + if (index == AL_STR_NO_POS) goto def; *addr = al_str_substr(&sub, 0, index); for (;;) { sub = al_str_substr(&sub, index + 1, sub.length); index = al_str_find(&sub, '-'); - if (index == AL_STR_NPOS) { + if (index == AL_STR_NO_POS) { index = al_str_find(&sub, '.'); - if (index == AL_STR_NPOS) { + if (index == AL_STR_NO_POS) { index = sub.length; } else { sub.length = index; diff --git a/src/liana/list_cmp.h b/src/liana/list_cmp.h index ee9b3f8..30f6e7d 100644 --- a/src/liana/list_cmp.h +++ b/src/liana/list_cmp.h @@ -9,7 +9,7 @@ AL_IGNORE_WARNING("-Wunused-function") static void camu_db_num_from_path(str *path, s64 *id, s64 *index) { u32 last_slash = al_str_rfind(path, '/'); - if (last_slash == AL_WSTR_NPOS) { + if (last_slash == AL_WSTR_NO_POS) { return; } str sub = al_str_substr(path, last_slash + 1, path->length); @@ -20,7 +20,7 @@ static void camu_db_num_from_path(str *path, s64 *id, s64 *index) } u32 target = al_str_find(&sub, '_'); - if (target == AL_WSTR_NPOS) { + if (target == AL_WSTR_NO_POS) { return; } sub = al_str_substr(&sub, 0, target); @@ -32,7 +32,7 @@ static void camu_db_num_from_path(str *path, s64 *id, s64 *index) u32 ext_dot = al_str_rfind(path, '.'); u32 a_of_media = al_str_rfind(path, 'a'); - if (ext_dot == AL_WSTR_NPOS || a_of_media == AL_WSTR_NPOS) { + if (ext_dot == AL_WSTR_NO_POS || a_of_media == AL_WSTR_NO_POS) { return; } sub = al_str_substr(path, a_of_media + 1, ext_dot); diff --git a/src/libsink/desktop.c b/src/libsink/desktop.c index 6dee662..35c0b1b 100644 --- a/src/libsink/desktop.c +++ b/src/libsink/desktop.c @@ -1,7 +1,9 @@ #define AL_LOG_SECTION "desktop" #include <al/log.h> -//#define DESKTOP_NULL_AUDIO +#ifdef CAMU_NO_MINIAUDIO_BACKENDS +#define DESKTOP_NULL_AUDIO +#endif #ifdef DESKTOP_NULL_AUDIO #include "../mixer/audio_null.h" diff --git a/src/mixer/audio_miniaudio.c b/src/mixer/audio_miniaudio.c index bc2da0d..9355f35 100644 --- a/src/mixer/audio_miniaudio.c +++ b/src/mixer/audio_miniaudio.c @@ -74,6 +74,9 @@ static void miniaudio_log_callback(void *userdata, u32 level, const char *messag static bool audio_miniaudio_init(struct camu_audio *audio, str *name) { struct camu_audio_miniaudio *ma = (struct camu_audio_miniaudio *)audio; +#ifdef CAMU_NO_MINIAUDIO_BACKENDS + al_assert_and_return(false); +#endif ma_log_init(&alloc_callbacks, &ma->log); ma_log_register_callback(&ma->log, ma_log_callback_init(miniaudio_log_callback, NULL)); ma->context_config = ma_context_config_init(); diff --git a/src/mixer/meson.build b/src/mixer/meson.build index e4840c1..f65d624 100644 --- a/src/mixer/meson.build +++ b/src/mixer/meson.build @@ -17,10 +17,20 @@ if use_miniaudio '-DMA_NO_GENERATION', ] if is_linux - libpulse = dependency('libpulse') - alsa = dependency('alsa') - mixer_deps += [libpulse, alsa] - mixer_args += ['-DMA_ENABLE_ALSA', '-DMA_ENABLE_PULSEAUDIO', '-DMA_NO_RUNTIME_LINKING'] + mixer_args += ['-DMA_NO_RUNTIME_LINKING'] + libpulse = dependency('libpulse', required: false) + if libpulse.found() + mixer_deps += [libpulse] + mixer_args += ['-DMA_ENABLE_PULSEAUDIO'] + endif + alsa = dependency('alsa', required: false) + if alsa.found() + mixer_deps += [alsa] + mixer_args += ['-DMA_ENABLE_ALSA'] + endif + if not (libpulse.found() or alsa.found()) + mixer_args += ['-DCAMU_NO_MINIAUDIO_BACKENDS'] + endif elif is_windows if get_option('win32-compat') mixer_args += ['-DMA_ENABLE_DSOUND'] @@ -29,6 +39,8 @@ if use_miniaudio endif elif is_android mixer_args += ['-DMA_ENABLE_AAUDIO'] + else + mixer_args += ['-DCAMU_NO_MINIAUDIO_BACKENDS'] endif endif diff --git a/src/render/meson.build b/src/render/meson.build index b567a03..4274758 100644 --- a/src/render/meson.build +++ b/src/render/meson.build @@ -8,118 +8,127 @@ if get_option('renderer') == 'momo' render_deps += [momo] render_args += ['-DCAMU_RENDERER_MOMO'] elif get_option('renderer') == 'libplacebo' - libplacebo_opts = ['warning_level=2', 'demos=false', 'tests=false', 'bench=false', 'fuzz=false', - 'glslang=disabled', - 'gl-proc-addr=disabled', - 'vk-proc-addr=disabled', - 'lcms=auto', - 'dovi=auto', - 'libdovi=auto', - 'xxhash=auto' - ] + libplacebo_found = false + if 'libplacebo' not in get_option('force_fallback_for') + libplacebo = dependency('libplacebo', required: false, allow_fallback: false) + if libplacebo.found() + libplacebo_found = true + endif + endif + if not libplacebo_found + libplacebo_opts = ['warning_level=2', 'demos=false', 'tests=false', 'bench=false', 'fuzz=false', + 'gl-proc-addr=disabled', + 'vk-proc-addr=disabled', + 'lcms=auto', + 'dovi=auto', + 'libdovi=auto', + 'xxhash=auto' + ] - if get_option('renderer-api') == 'vulkan' or get_option('renderer-api') == 'dx11' - if is_windows - shaderc = dependency('shaderc_combined', required: false, allow_fallback: false) + if get_option('renderer-api') == 'vulkan' or get_option('renderer-api') == 'dx11' + if get_option('renderer-compiler') == 'shaderc' + if is_windows + shaderc = dependency('shaderc_combined', required: false, allow_fallback: false) + else + shaderc = dependency('shaderc', required: false, allow_fallback: false) + endif + if shaderc.found() + render_deps += [shaderc] + else + shaderc_opts = cmake.subproject_options() + shaderc_opts.set_override_option('warning_level', '0') # Doesn't work. + reltype = is_minsize ? 'MinSizeRel' : 'Release' + shaderc_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) + shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_INSTALL': true }) + shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_TESTS': true }) + shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_EXAMPLES': true }) + shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_COPYRIGHT_CHECK': true }) + shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false }) + shaderc_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false }) + shaderc_opts.add_cmake_defines({ 'ENABLE_HLSL': false }) + spirv_optimizer = true + shaderc_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer }) + shaderc_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS_ON_MSVC': false }) + shaderc_proj = cmake.subproject('shaderc', options: shaderc_opts) + shaderc = shaderc_proj.dependency('shaderc') + meson.override_dependency('shaderc', shaderc) + render_deps += [ + shaderc_proj.dependency('shaderc_util'), + shaderc_proj.dependency('glslang'), + shaderc_proj.dependency('MachineIndependent'), + shaderc_proj.dependency('OSDependent'), + shaderc_proj.dependency('GenericCodeGen'), + shaderc_proj.dependency('SPIRV'), + shaderc_proj.dependency('SPIRV-Tools-static') + ] + if spirv_optimizer + render_deps += [ + shaderc_proj.dependency('SPIRV-Tools-opt'), + ] + endif + endif + libplacebo_opts += ['shaderc=enabled', 'glslang=disabled'] + else + glslang = dependency('glslang', required: false, allow_fallback: false) + if glslang.found() + render_deps += [glslang] + else + glslang_opts = cmake.subproject_options() + glslang_opts.set_override_option('warning_level', '0') + reltype = is_minsize ? 'MinSizeRel' : 'Release' + glslang_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) + spirv_optimizer = false + glslang_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer }) + glslang_proj = cmake.subproject('glslang', options: glslang_opts) + spirv = glslang_proj.dependency('SPIRV') + glslang = glslang_proj.dependency('glslang') + glslang_default_resource_limits = glslang_proj.dependency('glslang-default-resource-limits') + meson.override_dependency('SPIRV', spirv) + meson.override_dependency('glslang', glslang) + meson.override_dependency('glslang-default-resource-limits', glslang_default_resource_limits) + render_deps += [ + glslang_proj.dependency('MachineIndependent'), + glslang_proj.dependency('OSDependent'), + glslang_proj.dependency('GenericCodeGen'), + spirv, + glslang, + glslang_default_resource_limits + ] + endif + libplacebo_opts += ['glslang=enabled', 'shaderc=disabled'] + endif else - shaderc = dependency('shaderc', required: false, allow_fallback: false) + libplacebo_opts += ['glslang=disabled', 'shaderc=disabled'] endif - if shaderc.found() - render_deps += [shaderc] - else - shaderc_opts = cmake.subproject_options() - shaderc_opts.set_override_option('warning_level', '0') # Doesn't work. + + if get_option('renderer-api') == 'vulkan' + libplacebo_opts += ['vulkan=enabled', 'd3d11=disabled', 'opengl=disabled'] + elif get_option('renderer-api') == 'dx11' + spirv_cross_opts = cmake.subproject_options() reltype = is_minsize ? 'MinSizeRel' : 'Release' - shaderc_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) - shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_INSTALL': true }) - shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_TESTS': true }) - shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_EXAMPLES': true }) - shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_COPYRIGHT_CHECK': true }) - shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false }) - shaderc_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false }) - shaderc_opts.add_cmake_defines({ 'ENABLE_HLSL': false }) - spirv_optimizer = true - shaderc_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer }) - shaderc_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS_ON_MSVC': false }) - shaderc_proj = cmake.subproject('shaderc', options: shaderc_opts) - shaderc = shaderc_proj.dependency('shaderc') - meson.override_dependency('shaderc', shaderc) + spirv_cross_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) + spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_CLI': false }) + spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_TESTS': false }) + spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_MSL': false }) + spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_CPP': false }) + spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_REFLECT': false }) + spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_UTIL': false }) + spirv_cross_proj = cmake.subproject('SPIRV-Cross', options: spirv_cross_opts) + spirv_cross_c_shared = spirv_cross_proj.dependency('spirv-cross-c') render_deps += [ - shaderc_proj.dependency('shaderc_util'), - shaderc_proj.dependency('glslang'), - shaderc_proj.dependency('MachineIndependent'), - shaderc_proj.dependency('OSDependent'), - shaderc_proj.dependency('GenericCodeGen'), - shaderc_proj.dependency('SPIRV'), - shaderc_proj.dependency('SPIRV-Tools-static') + spirv_cross_proj.dependency('spirv-cross-glsl'), + spirv_cross_proj.dependency('spirv-cross-hlsl'), + spirv_cross_proj.dependency('spirv-cross-core'), + spirv_cross_c_shared ] - if spirv_optimizer - render_deps += [ - shaderc_proj.dependency('SPIRV-Tools-opt'), - ] - endif + meson.override_dependency('spirv-cross-c-shared', spirv_cross_c_shared) + libplacebo_opts += ['d3d11=enabled', 'vulkan=disabled', 'opengl=disabled'] + else + libplacebo_opts += ['opengl=enabled', 'vulkan=disabled', 'd3d11=disabled'] endif - #glslang = dependency('glslang', required: false, allow_fallback: false) - #if glslang.found() - # render_deps += [glslang] - #else - # #spirv_tools_opts = cmake.subproject_options() - # #spirv_tools_opts.set_override_option('warning_level', '0') - # #reltype = is_minsize ? 'MinSizeRel' : 'Release' - # #spirv_tools_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) - # #spirv_tools_proj = cmake.subproject('SPIRV-Tools', options: spirv_tools_opts) - # glslang_opts = cmake.subproject_options() - # glslang_opts.set_override_option('warning_level', '0') - # reltype = is_minsize ? 'MinSizeRel' : 'Release' - # glslang_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) - # #glslang_opts.add_cmake_defines({ 'ALLOW_EXTERNAL_SPIRV_TOOLS': true }) - # glslang_opts.add_cmake_defines({ 'ENABLE_OPT': '0' }) - # glslang_proj = cmake.subproject('glslang', options: glslang_opts) - # #message('CMake targets:\n - ' + '\n - '.join(glslang_proj.target_list())) - # glslang = glslang_proj.dependency('glslang') - # spirv = glslang_proj.dependency('SPIRV') - # glslang_default_resource_limits = glslang_proj.dependency('glslang-default-resource-limits') - # meson.override_dependency('glslang', glslang) - # meson.override_dependency('SPIRV', spirv) - # meson.override_dependency('glslang-default-resource-limits', glslang_default_resource_limits) - # render_deps += [ - # glslang_proj.dependency('MachineIndependent'), - # glslang_proj.dependency('OSDependent'), - # glslang_proj.dependency('GenericCodeGen'), - # glslang, - # spirv, - # glslang_default_resource_limits - # ] - #endif - endif - if get_option('renderer-api') == 'vulkan' - libplacebo_opts += ['shaderc=enabled', 'vulkan=enabled', 'd3d11=disabled', 'opengl=disabled'] - elif get_option('renderer-api') == 'dx11' - spirv_cross_opts = cmake.subproject_options() - reltype = is_minsize ? 'MinSizeRel' : 'Release' - spirv_cross_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) - spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_CLI': false }) - spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_TESTS': false }) - spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_MSL': false }) - spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_CPP': false }) - spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_REFLECT': false }) - spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_UTIL': false }) - spirv_cross_proj = cmake.subproject('SPIRV-Cross', options: spirv_cross_opts) - spirv_cross_c_shared = spirv_cross_proj.dependency('spirv-cross-c') - render_deps += [ - spirv_cross_proj.dependency('spirv-cross-glsl'), - spirv_cross_proj.dependency('spirv-cross-hlsl'), - spirv_cross_proj.dependency('spirv-cross-core'), - spirv_cross_c_shared - ] - meson.override_dependency('spirv-cross-c-shared', spirv_cross_c_shared) - libplacebo_opts += ['shaderc=enabled', 'd3d11=enabled', 'vulkan=disabled', 'opengl=disabled'] - else - libplacebo_opts += ['shaderc=disabled', 'opengl=enabled', 'vulkan=disabled', 'd3d11=disabled'] + libplacebo = dependency('libplacebo', default_options: libplacebo_opts) endif - - libplacebo = dependency('libplacebo', default_options: libplacebo_opts) render_src += ['renderer_libplacebo.c', 'queue_libplacebo.c'] render_deps += [libplacebo] render_args += ['-DCAMU_RENDERER_LIBPLACEBO'] |