summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-01-16 21:01:49 -0500
committerAndrew Opalach <andrew@akon.city> 2024-01-16 21:01:49 -0500
commit9065d8778e63ea919506fd0d4a0692042fb503fb (patch)
tree09de40e56ac924e60c4f3c080ac74a5064049e90 /src
parent863eda6c45a0ed0bf5f460dde6177c257d57cff8 (diff)
downloadcamu-9065d8778e63ea919506fd0d4a0692042fb503fb.tar.gz
camu-9065d8778e63ea919506fd0d4a0692042fb503fb.tar.bz2
camu-9065d8778e63ea919506fd0d4a0692042fb503fb.zip
Improve windows build
- Support using libplacebo vulkan backend on windows Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src')
-rw-r--r--src/buffer/meson.build6
-rw-r--r--src/codec/meson.build31
-rw-r--r--src/fruits/sink/meson.build10
-rw-r--r--src/fruits/sink/sink.c4
-rw-r--r--src/mixer/audio_miniaudio.c1
-rw-r--r--src/mixer/meson.build9
-rw-r--r--src/render/meson.build60
-rw-r--r--src/screen/meson.build5
-rw-r--r--src/screen/screen.c9
-rw-r--r--src/tree/meson.build2
10 files changed, 91 insertions, 46 deletions
diff --git a/src/buffer/meson.build b/src/buffer/meson.build
index 1fb3cfa..dce16de 100644
--- a/src/buffer/meson.build
+++ b/src/buffer/meson.build
@@ -1,8 +1,4 @@
-if meson.is_subproject() # TMP
- buffer_src = ['audio.c', 'clock.c', 'peak_buffer.c']
-else
- buffer_src = ['video.c', 'audio.c', 'clock.c', 'peak_buffer.c']
-endif
+buffer_src = ['video.c', 'audio.c', 'clock.c', 'peak_buffer.c']
buffer_deps = [common_deps]
buffer = declare_dependency(sources: buffer_src,
dependencies: buffer_deps)
diff --git a/src/codec/meson.build b/src/codec/meson.build
index 676be1c..0946a17 100644
--- a/src/codec/meson.build
+++ b/src/codec/meson.build
@@ -1,16 +1,23 @@
av_src = [
'libav/common.c',
+ 'libav/packet_ext.c'
+]
+av_server_src = [
+ av_src,
'libav/demuxer.c',
- 'libav/decoder.c',
- 'libav/resampler.c',
- 'libav/scaler.c',
'libav/encoder.c',
- 'libav/packet_ext.c',
'libav/avio.c'
]
+av_client_src = [
+ av_src,
+ 'libav/decoder.c',
+ 'libav/resampler.c',
+ 'libav/scaler.c'
+]
av_inc = []
av_ldflags = []
-av_deps = []
+av_server_deps = []
+av_client_deps = []
libavutil = dependency('libavutil', required: false)
libavformat = dependency('libavformat', required: false)
@@ -27,18 +34,22 @@ if not (libavutil.found() and libavformat.found() and libavcodec.found() and lib
libswscale = av_proj.get_variable('swscale')
av_inc += [av_proj.get_variable('inc')]
av_ldflags += ['-L' + av_proj.get_variable('libdir')]
- av_deps += [dependency('zlib')]
+ av_client_deps += [dependency('zlib')]
soxr = compiler.find_library('soxr', required: false)
if soxr.found()
- av_deps += [soxr]
+ av_client_deps += [soxr]
endif
- av_deps += [compiler.find_library('bcrypt')]
+ av_client_deps += [compiler.find_library('bcrypt')]
endif
endif
if libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found()
- av_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale]
- av = declare_dependency(sources: av_src, dependencies: av_deps, include_directories: av_inc, link_args: av_ldflags)
+ av_server_deps += [libavutil, libavformat, libavcodec]
+ av_client_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale]
+ av_server = declare_dependency(sources: av_server_src, dependencies: av_server_deps,
+ include_directories: av_inc, link_args: av_ldflags)
+ av_client = declare_dependency(sources: av_client_src, dependencies: av_client_deps,
+ include_directories: av_inc, link_args: av_ldflags)
add_project_arguments('-DHAVE_FFMPEG', language: ['c', 'cpp'])
endif
diff --git a/src/fruits/sink/meson.build b/src/fruits/sink/meson.build
index 8879937..e4f00e6 100644
--- a/src/fruits/sink/meson.build
+++ b/src/fruits/sink/meson.build
@@ -1,16 +1,16 @@
sink_src = ['sink.c']
-sink_deps = [common_deps, buffer, cache, av, screen, render, mixer, libsink]
+sink_deps = [common_deps, av_client, buffer, render, screen, mixer, libsink]
sink_args = []
-if meson.is_cross_build()
- sink_args += ['-static', '-static-libgcc', '-static-libstdc++']
-endif
-
use_tui = false
if use_tui
sink_src += []
sink_deps += [dependency('notcurses')]
endif
+if meson.is_cross_build()
+ sink_args += ['-static', '-static-libgcc', '-static-libstdc++', '-municode', '-mwindows']
+endif
+
executable('sink', sink_src, dependencies: sink_deps,
c_args: sink_args, cpp_args: sink_args, link_args: sink_args)
diff --git a/src/fruits/sink/sink.c b/src/fruits/sink/sink.c
index d0455a4..939e0af 100644
--- a/src/fruits/sink/sink.c
+++ b/src/fruits/sink/sink.c
@@ -142,7 +142,11 @@ static void sigint_handler(s32 signum)
c.quit = 1;
}
+#ifndef _WIN32
s32 main(s32 argc, char *argv[])
+#else
+s32 wmain(s32 argc, wchar_t **argv)
+#endif
{
if (!aki_common_init()) return EXIT_FAILURE;
diff --git a/src/mixer/audio_miniaudio.c b/src/mixer/audio_miniaudio.c
index b77323a..3d6f54b 100644
--- a/src/mixer/audio_miniaudio.c
+++ b/src/mixer/audio_miniaudio.c
@@ -135,7 +135,6 @@ static u64 audio_miniaudio_get_latency(struct camu_audio *audio)
struct camu_audio_miniaudio *ma = (struct camu_audio_miniaudio *)audio;
// Latency is one period on PulseAudio even if periods is >1. On WASAPI, latency is periods
// times period size.
- // This is a hack, should be possible to determine at runtime.
#ifdef _WIN32
return ((ma->device.playback.internalPeriodSizeInFrames * ma->device.playback.internalPeriods) /
#else
diff --git a/src/mixer/meson.build b/src/mixer/meson.build
index 52125ce..71c003b 100644
--- a/src/mixer/meson.build
+++ b/src/mixer/meson.build
@@ -6,20 +6,21 @@ mixer_src += ['audio_miniaudio.c']
mixer_deps += [miniaudio]
miniaudio_args = [
- '-DMA_NO_JACK',
- '-DMA_NO_ALSA',
+ '-DMA_ENABLE_ONLY_SPECIFIC_BACKENDS',
'-DMA_NO_DECODING',
'-DMA_NO_ENCODING',
- '-DMA_NO_GENERATION',
'-DMA_NO_RESOURCE_MANAGER',
'-DMA_NO_NODE_GRAPH',
'-DMA_NO_ENGINE',
+ '-DMA_NO_GENERATION',
]
if not is_windows
libpulse = dependency('libpulse')
mixer_deps += [libpulse]
- miniaudio_args += ['-DMA_NO_RUNTIME_LINKING']
+ miniaudio_args += ['-DMA_ENABLE_PULSEAUDIO', '-DMA_NO_RUNTIME_LINKING']
+else
+ miniaudio_args += ['-DMA_ENABLE_WASAPI']
endif
mixer = declare_dependency(sources: mixer_src, dependencies: mixer_deps,
diff --git a/src/render/meson.build b/src/render/meson.build
index e9c093a..2d9c02f 100644
--- a/src/render/meson.build
+++ b/src/render/meson.build
@@ -9,24 +9,48 @@ render_deps = [common_deps]
#render_src += ['renderer_tiger.c', 'queue_tiger.c']
#render_deps += [linmath]
-libplacebo = dependency('libplacebo',
- default_options: [
- 'warning_level=2',
- 'demos=false',
- 'tests=false',
- 'bench=false',
- 'fuzz=false',
- 'shaderc=enabled',
- 'glslang=disabled',
- 'opengl=enabled',
- 'vulkan=disabled',
- 'd3d11=disabled',
- 'gl-proc-addr=disabled',
- 'vk-proc-addr=disabled',
- 'lcms=enabled',
- 'dovi=disabled',
- 'libdovi=disabled'
- ], required: false, allow_fallback: true)
+libplacebo_opts = [
+ 'warning_level=2',
+ 'demos=false',
+ 'tests=false',
+ 'bench=false',
+ 'fuzz=false',
+ 'glslang=disabled',
+ 'd3d11=disabled',
+ 'gl-proc-addr=disabled',
+ 'vk-proc-addr=disabled',
+ 'lcms=disabled',
+ 'dovi=disabled',
+ 'libdovi=disabled'
+]
+
+use_vulkan = false
+if use_vulkan
+ shaderc_opts = cmake.subproject_options()
+ shaderc_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : 'Release' })
+ shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_INSTALL': false })
+ 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_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-opt'),
+ shaderc_proj.dependency('SPIRV-Tools-static')
+ ]
+ libplacebo_opts += ['shaderc=enabled', 'vulkan=enabled', 'opengl=disabled']
+else
+ libplacebo_opts += ['shaderc=disabled', 'opengl=enabled', 'vulkan=disabled']
+endif
+
+libplacebo = dependency('libplacebo', default_options: libplacebo_opts)
if libplacebo.found()
render_src += ['renderer_libplacebo.c', 'queue_libplacebo.c']
render_deps += [libplacebo]
diff --git a/src/screen/meson.build b/src/screen/meson.build
index d0bbd50..063b11a 100644
--- a/src/screen/meson.build
+++ b/src/screen/meson.build
@@ -1,8 +1,9 @@
screen_src = ['screen.c', 'view.c']
+use_vulkan = false
sekihi = subproject('sekihi',
default_options: [
- 'api=opengl',
- 'window=wayland',
+ use_vulkan ? 'api=vulkan' : 'api=opengl',
+ 'window=glfw',
'poll=inline',
'event-buffer=false',
'pause=true'
diff --git a/src/screen/screen.c b/src/screen/screen.c
index 94b5d8c..0baaef3 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -39,6 +39,14 @@ static void resize_callback(void *userdata, s32 width, s32 height)
}
}
+static void refresh_callback(void *userdata)
+{
+ struct camu_screen *scr = (struct camu_screen *)userdata;
+ if (scr->renderer) {
+ scr->renderer->render(scr->renderer, scr);
+ }
+}
+
static bool pointer_pos_callback(void *userdata, f64 x, f64 y)
{
struct camu_screen *scr = (struct camu_screen *)userdata;
@@ -200,6 +208,7 @@ bool camu_screen_init(struct camu_screen *scr)
scr->window->key_callback = key_callback;
scr->window->key_immediate_callback = key_immediate_callback;
scr->window->resize_callback = resize_callback;
+ scr->window->refresh_callback = refresh_callback;
scr->window->should_close_callback = should_close_callback;
scr->window->userdata = scr;
#ifdef CAMU_SCREEN_THREADED
diff --git a/src/tree/meson.build b/src/tree/meson.build
index e566687..bb049cb 100644
--- a/src/tree/meson.build
+++ b/src/tree/meson.build
@@ -3,5 +3,5 @@ tree_src = [
'resource_manager.c',
'list.c'
]
-tree_deps = [common_deps, shoki, cache, bimu_server, av]
+tree_deps = [common_deps, shoki, cache, av_server, bimu_server]
executable('tree', sources: tree_src, dependencies: tree_deps)