From 9065d8778e63ea919506fd0d4a0692042fb503fb Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Tue, 16 Jan 2024 21:01:49 -0500 Subject: Improve windows build - Support using libplacebo vulkan backend on windows Signed-off-by: Andrew Opalach --- src/buffer/meson.build | 6 +---- src/codec/meson.build | 31 +++++++++++++++-------- src/fruits/sink/meson.build | 10 ++++---- src/fruits/sink/sink.c | 4 +++ src/mixer/audio_miniaudio.c | 1 - src/mixer/meson.build | 9 ++++--- src/render/meson.build | 60 +++++++++++++++++++++++++++++++-------------- src/screen/meson.build | 5 ++-- src/screen/screen.c | 9 +++++++ src/tree/meson.build | 2 +- 10 files changed, 91 insertions(+), 46 deletions(-) (limited to 'src') 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) -- cgit v1.2.3-101-g0448