diff options
| author | 2024-01-16 21:01:49 -0500 | |
|---|---|---|
| committer | 2024-01-16 21:01:49 -0500 | |
| commit | 9065d8778e63ea919506fd0d4a0692042fb503fb (patch) | |
| tree | 09de40e56ac924e60c4f3c080ac74a5064049e90 | |
| parent | 863eda6c45a0ed0bf5f460dde6177c257d57cff8 (diff) | |
| download | camu-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>
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | cross/x86_64-w64-mingw32.txt | 6 | ||||
| -rw-r--r-- | flake.lock | 6 | ||||
| -rw-r--r-- | flake.nix | 7 | ||||
| -rw-r--r-- | meson.build | 6 | ||||
| -rw-r--r-- | src/buffer/meson.build | 6 | ||||
| -rw-r--r-- | src/codec/meson.build | 31 | ||||
| -rw-r--r-- | src/fruits/sink/meson.build | 10 | ||||
| -rw-r--r-- | src/fruits/sink/sink.c | 4 | ||||
| -rw-r--r-- | src/mixer/audio_miniaudio.c | 1 | ||||
| -rw-r--r-- | src/mixer/meson.build | 9 | ||||
| -rw-r--r-- | src/render/meson.build | 60 | ||||
| -rw-r--r-- | src/screen/meson.build | 5 | ||||
| -rw-r--r-- | src/screen/screen.c | 9 | ||||
| -rw-r--r-- | src/tree/meson.build | 2 | ||||
| -rw-r--r-- | subprojects/shaderc.wrap | 5 | ||||
| -rw-r--r-- | subprojects/shaderc/meson.build | 12 |
17 files changed, 110 insertions, 72 deletions
@@ -29,8 +29,7 @@ subprojects/linmath.h/ subprojects/miniaudio/ subprojects/packagecache/ subprojects/sekihi -subprojects/shaderc/include/ -subprojects/shaderc/lib/ +subprojects/shaderc/ subprojects/shoki subprojects/stb/ subprojects/vulkan/ diff --git a/cross/x86_64-w64-mingw32.txt b/cross/x86_64-w64-mingw32.txt index bc95ac2..5aeeadd 100644 --- a/cross/x86_64-w64-mingw32.txt +++ b/cross/x86_64-w64-mingw32.txt @@ -3,13 +3,13 @@ [binaries] c = 'x86_64-w64-mingw32-gcc' cpp = 'x86_64-w64-mingw32-g++' -ar = 'x86_64-w64-mingw32-ar' +ar = 'x86_64-w64-mingw32-gcc-ar' strip = 'x86_64-w64-mingw32-strip' exe_wrapper = 'wine64' [properties] -nm = 'x86_64-w64-mingw32-nm' -ar = 'x86_64-w64-mingw32-ar' +nm = 'x86_64-w64-mingw32-gcc-nm' +ar = 'x86_64-w64-mingw32-gcc-ar' [host_machine] system = 'windows' @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1705133751, - "narHash": "sha256-rCIsyE80jgiOU78gCWN3A0wE0tR2GI5nH6MlS+HaaSQ=", + "lastModified": 1705316053, + "narHash": "sha256-J2Ey5mPFT8gdfL2XC0JTZvKaBw/b2pnyudEXFvl+dQM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9b19f5e77dd906cb52dade0b7bd280339d2a1f3d", + "rev": "c3e128f3c0ecc1fb04aef9f72b3dcc2f6cecf370", "type": "github" }, "original": { @@ -86,13 +86,13 @@ }; devShells.mingw64 = let - gcc = pkgsCross.mingwW64.buildPackages.wrapCC (pkgsCross.mingwW64.buildPackages.gcc-unwrapped.override ({ + gcc = pkgsCross.ucrt64.buildPackages.wrapCC (pkgsCross.ucrt64.buildPackages.gcc-unwrapped.override ({ threadsCross = { model = "win32"; package = null; }; })); - gccWin32Stdenv = overrideCC pkgsCross.mingwW64.stdenv gcc; + gccWin32Stdenv = overrideCC pkgsCross.ucrt64.stdenv gcc; in mkShell.override { stdenv = gccWin32Stdenv; } { NIX_HARDENING_ENABLE = ""; nativeBuildInputs = [ @@ -105,8 +105,9 @@ cmake python3 ]; - buildInputs = with pkgsCross.mingwW64; [ + buildInputs = with pkgsCross.ucrt64; [ (zlib.override { shared = false; static = true; }) + xxHash ]; shellHook = '' export NIX_SHELL="mingw64" diff --git a/meson.build b/meson.build index 30887a0..ae3f7c4 100644 --- a/meson.build +++ b/meson.build @@ -22,12 +22,12 @@ subdir('src/util') common_deps += [util] -subdir('src/screen') -subdir('src/buffer') -subdir('src/codec') subdir('src/cache') +subdir('src/codec') +subdir('src/buffer') subdir('src/mixer') subdir('src/render') +subdir('src/screen') subdir('src/bimu') subdir('src/libsink') subdir('src/fruits/sink') 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) diff --git a/subprojects/shaderc.wrap b/subprojects/shaderc.wrap new file mode 100644 index 0000000..37d2e23 --- /dev/null +++ b/subprojects/shaderc.wrap @@ -0,0 +1,5 @@ +[wrap-git] +url = https://github.com/google/shaderc.git +revision = e6edd6d48fa5bdd9d176794c6810fae7f8e938e1 +depth = 1 +method = cmake diff --git a/subprojects/shaderc/meson.build b/subprojects/shaderc/meson.build deleted file mode 100644 index ce02aa8..0000000 --- a/subprojects/shaderc/meson.build +++ /dev/null @@ -1,12 +0,0 @@ -project('shaderc', 'cpp', version: '2023.8') - -compiler = meson.get_compiler('c') - -shaderc = dependency('shaderc', required: false) -if not shaderc.found() - shaderc_combined = compiler.find_library( - 'shaderc_combined', dirs: [meson.project_source_root() + '/lib']) - shaderc = declare_dependency(dependencies: [shaderc_combined], - include_directories: include_directories('./include')) -endif -meson.override_dependency('shaderc', shaderc) |