diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/buffer/clock.c | 5 | ||||
| -rw-r--r-- | src/cache/backings/memory.c | 6 | ||||
| -rw-r--r-- | src/cache/handlers/file.c | 8 | ||||
| -rw-r--r-- | src/cache/meson.build | 8 | ||||
| -rw-r--r-- | src/codec/codec.h | 6 | ||||
| -rw-r--r-- | src/codec/ffmpeg/meson.build | 14 | ||||
| -rw-r--r-- | src/codec/ffmpeg/packet_ext.c | 14 | ||||
| -rw-r--r-- | src/codec/meson.build | 19 | ||||
| -rw-r--r-- | src/codec/stb_image.c | 23 | ||||
| -rw-r--r-- | src/codec/wuffs.c | 2 | ||||
| -rw-r--r-- | src/fruits/cmc/meson.build | 5 | ||||
| -rw-r--r-- | src/fruits/cmsrv/cmsrv.c | 2 | ||||
| -rw-r--r-- | src/fruits/cmv/cmv.c | 19 | ||||
| -rw-r--r-- | src/fruits/meson.build | 24 | ||||
| -rw-r--r-- | src/liana/handlers/codec_client.c | 4 | ||||
| -rw-r--r-- | src/liana/handlers/codec_server.c | 1 | ||||
| -rw-r--r-- | src/portal/src/search.c | 3 | ||||
| -rw-r--r-- | src/render/meson.build | 56 | ||||
| -rw-r--r-- | src/render/shaders/vr_video.h | 16 | ||||
| -rw-r--r-- | src/server/server.c | 2 | ||||
| -rw-r--r-- | src/util/color_palette.h | 14 | ||||
| -rw-r--r-- | src/util/meson.build | 5 |
22 files changed, 161 insertions, 95 deletions
diff --git a/src/buffer/clock.c b/src/buffer/clock.c index 86d6739..fbe7ec5 100644 --- a/src/buffer/clock.c +++ b/src/buffer/clock.c @@ -40,6 +40,7 @@ static inline void offset_tick(struct camu_clock *clock, f64 diff) void camu_clock_set(struct camu_clock *clock, f64 base) { clock->base = base; + clock->offset = 0.0; atomic_store(f64)(&clock->tick, SET, AL_ATOMIC_RELAXED); atomic_store(f64)(&clock->pause, PAUSED, AL_ATOMIC_RELAXED); atomic_store(bool)(&clock->external_pause, false, AL_ATOMIC_RELAXED); @@ -165,7 +166,7 @@ f64 camu_clock_get_pts(struct camu_clock *clock, f64 latency, bool allow_set, bo } } - f64 pts = (clock->base - clock->offset) + (current - tick); + f64 pts = clock->base + (current - tick); bool signal_pause = false; *armed_for_pause = pause != RUNNING || atomic_load(bool)(&clock->external_pause, AL_ATOMIC_RELAXED); @@ -182,7 +183,7 @@ f64 camu_clock_get_pts(struct camu_clock *clock, f64 latency, bool allow_set, bo atomic_store(f64)(&clock->last_pts, pts, AL_ATOMIC_RELAXED); } - return signal_pause ? CAMU_PTS_SIGNAL_PAUSE : pts + latency; + return signal_pause ? CAMU_PTS_SIGNAL_PAUSE : (pts - clock->offset) + latency; } f64 camu_clock_get_last_pts(struct camu_clock *clock) diff --git a/src/cache/backings/memory.c b/src/cache/backings/memory.c index 063c1c5..ba0bb54 100644 --- a/src/cache/backings/memory.c +++ b/src/cache/backings/memory.c @@ -6,7 +6,11 @@ static void ensure_allocated(struct cch_backing_memory *mem, off_t amount) { if (amount > mem->expanse) mem->expanse = amount; if (amount > mem->alloc) { - mem->alloc = al_next_power_of_two(amount); + if (amount < MB(8)) { + mem->alloc = al_next_power_of_two(amount); + } else { + mem->alloc = amount; + } mem->data = (u8 *)al_realloc(mem->data, mem->alloc); } } diff --git a/src/cache/handlers/file.c b/src/cache/handlers/file.c index 1a70350..4ca8f47 100644 --- a/src/cache/handlers/file.c +++ b/src/cache/handlers/file.c @@ -30,11 +30,11 @@ 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_NO_POS) { - str ext = al_str_substr(path, dot, path->length); - return camu_guess_format(NULL, &ext, NULL); + if (dot == AL_STR_NO_POS) { + return CAMU_CODEC_FALLBACK; } - return -1; + str ext = al_str_substr(path, dot, path->length); + return camu_guess_format(NULL, &ext, NULL); } static void handler_file_free(struct cch_handler **handler) diff --git a/src/cache/meson.build b/src/cache/meson.build index 816b101..8243893 100644 --- a/src/cache/meson.build +++ b/src/cache/meson.build @@ -8,7 +8,8 @@ cache_deps = [] cache_args = [] if 'file' in get_option('sources') - if naunet_has_mmap + # @TODO: file mapped vs non-mapped should be selectable at runtime. + if naunet_has_mmap and not is_android cache_src += ['backings/file_mapped.c'] else cache_src += ['backings/file.c'] @@ -22,11 +23,12 @@ if 'http' in get_option('sources') and naunet_has_curl endif if 'cdio' in get_option('sources') + libcdio = dependency('libcdio', allow_fallback: true) libcdio_paranoia = dependency('libcdio_paranoia', allow_fallback: true) libcdio_cdda = dependency('libcdio_cdda', allow_fallback: true) - if libcdio_paranoia.found() and libcdio_cdda.found() + if libcdio.found() and libcdio_paranoia.found() and libcdio_cdda.found() cache_src += ['handlers/cdio.c'] - cache_deps += [libcdio_paranoia, libcdio_cdda] + cache_deps += [libcdio, libcdio_paranoia, libcdio_cdda] cache_args += ['-DCACHE_HAVE_CDIO'] endif endif diff --git a/src/codec/codec.h b/src/codec/codec.h index f1c979b..bb54b3b 100644 --- a/src/codec/codec.h +++ b/src/codec/codec.h @@ -210,7 +210,7 @@ struct camu_demuxer { bool (*seek)(struct camu_demuxer *, u64, bool); void (*free)(struct camu_demuxer **); array(struct camu_codec_stream) streams; - // @TODO: .mkv can probably have more than 64 streams. + // @TODO: .mkv (at least) can probably have more than 64 streams. u64 subscribed; }; @@ -440,7 +440,7 @@ static inline s32 camu_guess_format(str *short_name, str *ext, str *mime_type) char *c_short_name = short_name ? al_str_to_c_str(short_name) : NULL; char *c_ext = ext ? al_str_to_c_str(ext) : NULL; char *c_mime_type = mime_type ? al_str_to_c_str(mime_type) : NULL; - // Empty short_name to attempt avoiding image2 probing. + // Empty short_name to avoid image2 probing. const AVOutputFormat *fmt = av_guess_format(c_short_name ? c_short_name : "", c_ext, c_mime_type); if (c_short_name) al_free(c_short_name); if (c_ext) al_free(c_ext); @@ -448,5 +448,5 @@ static inline s32 camu_guess_format(str *short_name, str *ext, str *mime_type) // In FFmpeg AV_CODEC_ID_MJPEG also means "image2". if (fmt) return (fmt->audio_codec != AV_CODEC_ID_NONE) ? fmt->audio_codec : fmt->video_codec; #endif - return -1; + return CAMU_CODEC_FALLBACK; } diff --git a/src/codec/ffmpeg/meson.build b/src/codec/ffmpeg/meson.build index e34cc92..1691c29 100644 --- a/src/codec/ffmpeg/meson.build +++ b/src/codec/ffmpeg/meson.build @@ -19,15 +19,23 @@ foreach dep: ['ffmpeg', 'libavutil', 'libavformat', 'libavcodec', 'libavdevice', endif endforeach ffmpeg_version_option = get_option('codec-ffmpeg-version') +if ffmpeg_version_option == 'auto' + expect_system = not (is_windows or is_android) + if expect_system + ffmpeg_version_option = 'system' + else # Latest. + ffmpeg_version_option = '9' + endif +endif # 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' } + libavutil_version_map = { '54': '2', '55': '3', '56': '4', '57': '5', '58': '6', '59': '7', '60': '8', '61': '9' } + libavutil_version_rev = { '2': '54', '3': '55', '4': '56', '5': '57', '6': '58', '7': '59', '8': '60', '9': '61' } 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 + if ffmpeg_version_int < 9 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) diff --git a/src/codec/ffmpeg/packet_ext.c b/src/codec/ffmpeg/packet_ext.c index 6934cfe..8f44caa 100644 --- a/src/codec/ffmpeg/packet_ext.c +++ b/src/codec/ffmpeg/packet_ext.c @@ -6,7 +6,9 @@ void nn_packet_write_av_codec_parameters(struct nn_packet *packet, AVCodecParame NNWT_PACKET_WRITE_TYPE(packet, enum AVCodecID, codecpar->codec_id); NNWT_PACKET_WRITE_TYPE(packet, u32, codecpar->codec_tag); NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->extradata_size); - NNWT_PACKET_WRITE_DATA(packet, codecpar->extradata, codecpar->extradata_size); + if (codecpar->extradata_size) { + NNWT_PACKET_WRITE_DATA(packet, codecpar->extradata, codecpar->extradata_size); + } NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->format); NNWT_PACKET_WRITE_TYPE(packet, s64, codecpar->bit_rate); NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->bits_per_coded_sample); @@ -118,10 +120,12 @@ void nn_packet_read_av_codec_parameters(struct nn_packet *packet, AVCodecParamet NNWT_PACKET_READ_TYPE(packet, enum AVCodecID, codecpar->codec_id); NNWT_PACKET_READ_TYPE(packet, u32, codecpar->codec_tag); NNWT_PACKET_READ_TYPE(packet, s32, codecpar->extradata_size); - codecpar->extradata = (u8 *)av_malloc(codecpar->extradata_size); - u8 *extradata; - NNWT_PACKET_READ_DATA(packet, codecpar->extradata_size, extradata); - al_memcpy(codecpar->extradata, extradata, codecpar->extradata_size); + if (codecpar->extradata_size > 0) { + codecpar->extradata = (u8 *)av_malloc(codecpar->extradata_size); + u8 *extradata; + NNWT_PACKET_READ_DATA(packet, codecpar->extradata_size, extradata); + al_memcpy(codecpar->extradata, extradata, codecpar->extradata_size); + } NNWT_PACKET_READ_TYPE(packet, s32, codecpar->format); NNWT_PACKET_READ_TYPE(packet, s64, codecpar->bit_rate); NNWT_PACKET_READ_TYPE(packet, s32, codecpar->bits_per_coded_sample); diff --git a/src/codec/meson.build b/src/codec/meson.build index a92a23d..7dfc668 100644 --- a/src/codec/meson.build +++ b/src/codec/meson.build @@ -10,12 +10,23 @@ endif if 'stb_image' in get_option('codecs') stb = [] stb_args = ['-DCAMU_HAVE_STB_IMAGE'] - if not compiler.check_header('stb/stb_image.h') - stb = [subproject('stb').get_variable('stb')] - stb_args += ['-DCAMU_LOCAL_STB'] + stb_deps = [] + if get_option('codec-stbi-use-wuffs') + stb_args += ['-DCAMU_STBI_USE_WUFFS'] + if not compiler.check_header('wuffs/wuffs-v0.4.c') + wuffs = [subproject('wuffs').get_variable('wuffs')] + stb_deps += [wuffs] + stb_args += ['-DCAMU_LOCAL_WUFFS'] + endif + else + if not compiler.check_header('stb/stb_image.h') + stb = [subproject('stb').get_variable('stb')] + stb_deps += [stb] + stb_args += ['-DCAMU_LOCAL_STB'] + endif endif stb_codec = declare_dependency(sources: ['stb_image.c'], - dependencies: stb, compile_args: stb_args) + dependencies: stb_deps, compile_args: stb_args) codec_server_deps += [stb_codec] codec_client_deps += [stb_codec] endif diff --git a/src/codec/stb_image.c b/src/codec/stb_image.c index b37d6da..39b3a13 100644 --- a/src/codec/stb_image.c +++ b/src/codec/stb_image.c @@ -1,5 +1,27 @@ #define AL_LOG_SECTION "stb_image" #include <al/log.h> + +#ifdef CAMU_STBI_USE_WUFFS +#define WUFFS_IMPLEMENTATION +#define WUFFS_CONFIG__MODULES +#define WUFFS_CONFIG__MODULE__BASE +#define WUFFS_CONFIG__MODULE__ADLER32 +#define WUFFS_CONFIG__MODULE__DEFLATE +#define WUFFS_CONFIG__MODULE__ZLIB +#define WUFFS_CONFIG__MODULE__CRC32 +#define WUFFS_CONFIG__MODULE__PNG +#define WUFFS_CONFIG__MODULE__JPEG +#define WUFFS_CONFIG__MODULE__IMAGE +#define WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST +#define WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_Y +#define WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL +#define WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB +#ifdef CAMU_LOCAL_WUFFS +#include <wuffs-unsupported-snapshot.c> +#else +#include <wuffs/wuffs-v0.4.c> +#endif +#else #include "common.h" #define STBI_MALLOC camu_page_alloc #define STBI_FREE al_free @@ -13,6 +35,7 @@ #else #include <stb/stb_image.h> #endif +#endif #include "stb_image.h" diff --git a/src/codec/wuffs.c b/src/codec/wuffs.c index 7050fb4..53d181b 100644 --- a/src/codec/wuffs.c +++ b/src/codec/wuffs.c @@ -1,3 +1,4 @@ +#define WUFFS_IMPLEMENTATION #define WUFFS_CONFIG__MODULES #define WUFFS_CONFIG__MODULE__BASE #define WUFFS_CONFIG__MODULE__ADLER32 @@ -7,7 +8,6 @@ #define WUFFS_CONFIG__MODULE__PNG #define WUFFS_CONFIG__MODULE__JPEG #define WUFFS_CONFIG__MODULE__IMAGE -#define WUFFS_IMPLEMENTATION #ifdef CAMU_LOCAL_WUFFS #include <wuffs-unsupported-snapshot.c> #else diff --git a/src/fruits/cmc/meson.build b/src/fruits/cmc/meson.build index bb9d38d..0728532 100644 --- a/src/fruits/cmc/meson.build +++ b/src/fruits/cmc/meson.build @@ -19,8 +19,9 @@ if use_tui cmc_deps += [notcurses, notcurses_core, codecs_client] endif +cmc_link_args = [] if is_windows and not is_msvc - cmc_args += ['-static', '-static-libgcc', '-static-libstdc++', '-mwindows', '-municode'] + cmc_link_args += ['-mconsole', '-municode', '-static', '-static-libgcc', '-static-libstdc++'] endif -executable('cmc', cmc_src, dependencies: cmc_deps, c_args: cmc_args, link_args: cmc_args, install: true) +executable('cmc', cmc_src, dependencies: cmc_deps, c_args: cmc_args, link_args: cmc_link_args, install: true) diff --git a/src/fruits/cmsrv/cmsrv.c b/src/fruits/cmsrv/cmsrv.c index 53fbc98..b0793d1 100644 --- a/src/fruits/cmsrv/cmsrv.c +++ b/src/fruits/cmsrv/cmsrv.c @@ -1,7 +1,9 @@ #define AL_LOG_SECTION "cmsrv" #include <al/log.h> #include <nnwt/common.h> +#ifndef NAUNET_ON_WINDOWS #define CMSRV_LOCAL_SOCKET +#endif #ifdef CMSRV_LOCAL_SOCKET #include <nnwt/line_processor.h> #endif diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c index a525377..58c8e32 100644 --- a/src/fruits/cmv/cmv.c +++ b/src/fruits/cmv/cmv.c @@ -109,12 +109,20 @@ s32 window_system_main(u32 argc, str *argv, void *extra) { (void)extra; - bool local = argc > 1; + bool local; #ifdef CAMU_SINK_ONLY + local = argc > 1; if (local) { log_warn("Got arguments in a sink-only configuration."); return EXIT_FAILURE; } +#else + char *SINK_SERVER = getenv("SINK_SERVER"); + if (SINK_SERVER && al_strscmp(SINK_SERVER, "1") == 0) { + local = true; + } else { + local = argc > 1; + } #endif #ifdef CAMU_HAVE_FFMPEG @@ -177,14 +185,7 @@ s32 window_system_main(u32 argc, str *argv, void *extra) } #endif - char *home_env = getenv("HOME"); - if (home_env) { - str color_palette; - al_str_from(&color_palette, home_env); - al_str_cat(&color_palette, &al_str_c("/.config/colors.json")); - camu_colors_maybe_init(&color_palette); - al_str_free(&color_palette); - } + camu_colors_default_init(); str window_name; al_str_from(&window_name, "Sink ("); diff --git a/src/fruits/meson.build b/src/fruits/meson.build index f53a653..b152990 100644 --- a/src/fruits/meson.build +++ b/src/fruits/meson.build @@ -1,6 +1,6 @@ -use_tuis = not is_windows - -if use_tuis and (get_option('server').enabled() or get_option('client').enabled()) +use_tuis = not is_windows and not is_android +use_tuis = use_tuis and ('cmsrv' in get_option('fruits') or 'cmc' in get_option('fruits')) +if use_tuis notcurses = dependency('notcurses', required: false, allow_fallback: false) notcurses_core = dependency('notcurses-core', required: false, allow_fallback: false) if not notcurses.found() or not notcurses_core.found() @@ -26,18 +26,6 @@ if use_tuis and (get_option('server').enabled() or get_option('client').enabled( endif endif -if get_option('server').enabled() - subdir('cmsrv') -endif - -if get_option('client').enabled() - subdir('cmc') -endif - -if get_option('sink').enabled() - if is_android - subdir('ctv') - else - subdir('cmv') - endif -endif +foreach fruit : get_option('fruits') + subdir(fruit) +endforeach diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c index c3dded1..5c8e94d 100644 --- a/src/liana/handlers/codec_client.c +++ b/src/liana/handlers/codec_client.c @@ -84,7 +84,7 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc } // Push packet. - u32 rindex = packet->rindex; + const u32 rindex = packet->rindex; bool success; u8 mode = nn_packet_read_u8(packet); // @TODO: default: shouldn't be a case. We should check for an invalid packet. @@ -138,7 +138,7 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc al_assert_and_return(false); } - // Restore packet rindex in case we resue it. + // Restore packet rindex in case we reuse it. packet->rindex = rindex; if (!success) { diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c index a7fc587..31fbef8 100644 --- a/src/liana/handlers/codec_server.c +++ b/src/liana/handlers/codec_server.c @@ -17,6 +17,7 @@ static bool codec_server_init(struct lia_server_handler *handler, struct cch_han codec->demux = NULL; codec->codec_info = camu_codec_info_by_type(cch_entry_guess_format(handle->entry)); if (!codec->codec_info) { + log_warn("No codec for this format."); return false; } log_info("Selected demuxer: %.*s.", al_str_x(&codec->codec_info->name)); diff --git a/src/portal/src/search.c b/src/portal/src/search.c index d442d94..7af4bea 100644 --- a/src/portal/src/search.c +++ b/src/portal/src/search.c @@ -3,6 +3,8 @@ #include "../../server/common.h" +#undef _XOPEN_SOURCE +#undef _POSIX_C_SOURCE #include "../cpy/portal.c" #include "search.h" @@ -174,6 +176,7 @@ static void results_signal_callback(void *userdata) } // @TODO: Fully defer init. +// - And fix init() -> (no close()) -> free() complications. void camu_portal_init(struct camu_portal_bridge *bridge, struct camu_post_cache *cache, struct nn_event_loop *loop, void *userdata) { diff --git a/src/render/meson.build b/src/render/meson.build index d342312..ee0017a 100644 --- a/src/render/meson.build +++ b/src/render/meson.build @@ -23,15 +23,11 @@ elif get_option('renderer') == 'libplacebo' 'xxhash=auto' ] - if get_option('renderer-api') == 'vulkan' or get_option('renderer-api') == 'dx11' + if renderer_api == 'vulkan' or renderer_api == 'dx11' if get_option('renderer-compiler') == 'shaderc' shaderc_found = false if 'shaderc' not in get_option('force_fallback_for') and get_option('wrap_mode') != 'forcefallback' - if is_windows - shaderc = dependency('shaderc_combined', required: false, allow_fallback: false) - else - shaderc = dependency('shaderc', required: false, allow_fallback: false) - endif + shaderc = dependency('shaderc', required: false, allow_fallback: false) shaderc_found = shaderc.found() endif if shaderc_found @@ -39,30 +35,35 @@ elif get_option('renderer') == 'libplacebo' 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({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype }) + shaderc_opts.add_cmake_defines({ 'BUILD_SHARED_LIBS': false }) 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({ 'SHADERC_ENABLE_HLSL': false }) + # glslang & spirv-tools + shaderc_opts.add_cmake_defines({ 'ENABLE_RTTI': false }) # glslang shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false }) + shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_JS': false }) shaderc_opts.add_cmake_defines({ 'ENABLE_HLSL': false }) - shaderc_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false }) shaderc_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS': false }) spirv_optimizer = true shaderc_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer }) # spirv-tools + shaderc_opts.add_cmake_defines({ 'SPIRV_ALLOW_TIMERS': false }) + shaderc_opts.add_cmake_defines({ 'SPIRV_COLOR_TERMINAL': false }) 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', declare_dependency(dependencies: shaderc, version: '2026.2')) 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('glslang'), shaderc_proj.dependency('SPIRV'), shaderc_proj.dependency('SPIRV-Tools-static') ] @@ -72,17 +73,21 @@ elif get_option('renderer') == 'libplacebo' endif libplacebo_opts += ['shaderc=enabled', 'glslang=disabled'] else - glslang = dependency('glslang', required: false, allow_fallback: false) - if glslang.found() + glslang_found = false + if 'glslang' not in get_option('force_fallback_for') and get_option('wrap_mode') != 'forcefallback' + glslang = dependency('glslang', required: false, allow_fallback: false) + glslang_found = glslang.found() + endif + if glslang_found render_deps += [glslang] else # Currently does not build. - prefer_static = get_option('prefer_static') + spirv_headers_proj = cmake.subproject('SPIRV-Headers') + spirv_headers = spirv_headers_proj.dependency('SPIRV-Headers') spirv_optimizer = false if spirv_optimizer - spirv_headers_proj = cmake.subproject('SPIRV-Headers') - spirv_headers = spirv_headers_proj.dependency('SPIRV-Headers') spirv_tools_opts = cmake.subproject_options() + spirv_tools_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype }) spirv_tools_opts.add_cmake_defines({ 'SPIRV-Headers_SOURCE_DIR': meson.source_root() + '/subprojects/SPIRV-Headers-b824a46' }) spirv_tools_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS_ON_MSVC': false }) spirv_tools_proj = cmake.subproject('SPIRV-Tools', options: spirv_tools_opts) @@ -91,8 +96,7 @@ elif get_option('renderer') == 'libplacebo' endif 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({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype }) glslang_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false }) glslang_opts.add_cmake_defines({ 'ENABLE_HLSL': false }) glslang_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false }) @@ -100,24 +104,25 @@ elif get_option('renderer') == 'libplacebo' glslang_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer }) glslang_opts.add_cmake_defines({ 'ALLOW_EXTERNAL_SPIRV_TOOLS': 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, static: prefer_static) + spirv = glslang_proj.dependency('SPIRV') + prefer_static = get_option('prefer_static') meson.override_dependency('glslang', glslang, static: prefer_static) meson.override_dependency('glslang-default-resource-limits', glslang_default_resource_limits, static: prefer_static) + meson.override_dependency('SPIRV', spirv, static: prefer_static) render_deps += [ glslang_proj.dependency('MachineIndependent'), glslang_proj.dependency('OSDependent'), glslang_proj.dependency('GenericCodeGen'), - spirv, glslang, - glslang_default_resource_limits + glslang_default_resource_limits, + spirv, + spirv_headers ] if spirv_optimizer render_deps += [ spirv_tools, - spirv_headers, spirv_tools_opt ] endif @@ -128,12 +133,11 @@ elif get_option('renderer') == 'libplacebo' libplacebo_opts += ['glslang=disabled', 'shaderc=disabled'] endif - if get_option('renderer-api') == 'vulkan' + if renderer_api == 'vulkan' libplacebo_opts += ['vulkan=enabled', 'd3d11=disabled', 'opengl=disabled'] - elif get_option('renderer-api') == 'dx11' + elif 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({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_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 }) diff --git a/src/render/shaders/vr_video.h b/src/render/shaders/vr_video.h index c892601..2dc54bd 100644 --- a/src/render/shaders/vr_video.h +++ b/src/render/shaders/vr_video.h @@ -33,18 +33,18 @@ static char vr_video_shader[] = \ "vec4 hook() {" " float yaw = M_PI*mouse_x;" " float pitch = M_PI*(-0.5+mouse_y);" -" float roll = M_PI*0.0;" -" float t = tan(fov/2.0);" +" float roll = M_PI*0.;" +" float t = tan(fov/2.);" " float c = cos(pitch);" " float s = sin(pitch);" " float r = target_size.y/target_size.x;" " float sR = sin(roll);" " float cR = cos(roll);" -" mat3 m = mat3(2.0*t*cR, 2.0*sR*t*r, -t*(cR+sR*r), -2.0*sR*t*c, 2.0*cR*t*c*r, t*c*(sR-cR*r)-s, -2.0*sR*t*s, 2.0*cR*t*s*r, t*s*(sR-cR*r)+c);" -" vec3 p = vec3(HOOKED_pos, 1.0)*m;" -" float theta = atan(p.x, p.z)+yaw;" -" float phi = atan(p.y, length(p.xz))+M_PI/2.0;" -" float x = fract(theta/(2.0*M_PI));" +" mat3 m = mat3(2.*t*cR,2.*sR*t*r,-t*(cR+sR*r),-2.*sR*t*c,2.*cR*t*c*r,t*c*(sR-cR*r)-s,-2.*sR*t*s,2.*cR*t*s*r,t*s*(sR-cR*r)+c);" +" vec3 p = vec3(HOOKED_pos,1.)*m;" +" float theta = atan(p.x,p.z)+yaw;" +" float phi = atan(p.y,length(p.xz))+M_PI/2.;" +" float x = fract(theta/(2.*M_PI));" " float y = phi/M_PI;" // Range: [M_PI, 2.0*M_PI] = Right eye 180 degrees. float(max(theta, mode-1.0) > 0.0) = Always true except mode = 0.0 and theta < 0.0. -" return HOOKED_tex(vec2(x, y))*clamp(abs((1.0-mode)-(step(M_PI, theta)-step(2.0*M_PI, theta)))*float(max(theta, mode-1.0)>=0.0), 0.0, 1.0);" +" return HOOKED_tex(vec2(x,y))*clamp(abs((1.-mode)-(step(M_PI,theta)-step(2.*M_PI,theta)))*float(max(theta,mode-1.)>=0.),0.,1.);" "}"; diff --git a/src/server/server.c b/src/server/server.c index 41633d2..c547b5d 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -862,7 +862,7 @@ static bool multiplex_callback(void *userdata, u8 id, struct nn_packet_stream *s void camu_server_init(struct camu_server *server, struct nn_event_loop *loop) { server->loop = loop; - server->addr = al_str_null(); + server->addr = AL_STR_EMPTY; al_array_init(server->users); al_array_init(server->nodes); al_array_init(server->clients); diff --git a/src/util/color_palette.h b/src/util/color_palette.h index 7330135..b0cc9f4 100644 --- a/src/util/color_palette.h +++ b/src/util/color_palette.h @@ -2,6 +2,7 @@ #include <al/types.h> #include <al/str.h> +#include <nnwt/file.h> enum { CAMU_COLOR_BACKGROUND = 0, @@ -33,3 +34,16 @@ struct camu_color_palette { extern struct camu_color_palette global_color_palette; bool camu_colors_maybe_init(str *path); + +static inline void camu_colors_default_init() +{ + char *home_env = getenv("HOME"); + if (home_env) { + str color_palette; + al_str_from(&color_palette, home_env); + nn_path_append(&color_palette, &al_str_c(".config")); + nn_path_append(&color_palette, &al_str_c("colors.json")); + camu_colors_maybe_init(&color_palette); + al_str_free(&color_palette); + } +} diff --git a/src/util/meson.build b/src/util/meson.build index c2c3c3d..2da5b08 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -4,9 +4,8 @@ if get_option('portal').enabled() blake3 = dependency('libblake3', required: false, allow_fallback: false) if not blake3.found() blake3_opts = cmake.subproject_options() - reltype = is_minsize ? 'MinSizeRel' : 'Release' - blake3_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) - blake3_opts.add_cmake_defines({ 'CMAKE_POSITION_INDEPENDENT_CODE': true }) + blake3_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype }) + blake3_opts.add_cmake_defines({ 'CMAKE_POSITION_INDEPENDENT_CODE': is_static_shared_lib }) blake3 = cmake.subproject('BLAKE3', options: blake3_opts).dependency('blake3') endif util_deps += [blake3] |