summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buffer/clock.c5
-rw-r--r--src/cache/backings/memory.c6
-rw-r--r--src/cache/handlers/file.c8
-rw-r--r--src/cache/meson.build8
-rw-r--r--src/codec/codec.h6
-rw-r--r--src/codec/ffmpeg/meson.build14
-rw-r--r--src/codec/ffmpeg/packet_ext.c14
-rw-r--r--src/codec/meson.build19
-rw-r--r--src/codec/stb_image.c23
-rw-r--r--src/codec/wuffs.c2
-rw-r--r--src/fruits/cmc/meson.build5
-rw-r--r--src/fruits/cmsrv/cmsrv.c2
-rw-r--r--src/fruits/cmv/cmv.c19
-rw-r--r--src/fruits/meson.build24
-rw-r--r--src/liana/handlers/codec_client.c4
-rw-r--r--src/liana/handlers/codec_server.c1
-rw-r--r--src/portal/src/search.c3
-rw-r--r--src/render/meson.build56
-rw-r--r--src/render/shaders/vr_video.h16
-rw-r--r--src/server/server.c2
-rw-r--r--src/util/color_palette.h14
-rw-r--r--src/util/meson.build5
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]