From 45238d78cd9535b33bfbeeaaac4645af1bd93834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Tue, 18 Jan 2022 23:35:14 +0100 Subject: [PATCH] Mesonize JPEG Quant Smooth Now SIMD works on amd64, although the build remains questionable, because it assumes that all of its compiler flags will work. This way we lose an uncomfortable git submodule. Also, add Meson subprojects to .gitignore. --- .gitignore | 3 ++ .gitmodules | 3 -- fiv-io.c | 5 +-- jpeg-quantsmooth | 1 - meson.build | 11 +++-- meson_options.txt | 2 +- subprojects/libjpegqs.wrap | 9 ++++ .../packagefiles/libjpegqs/meson.build | 41 +++++++++++++++++++ 8 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 .gitignore delete mode 160000 jpeg-quantsmooth create mode 100644 subprojects/libjpegqs.wrap create mode 100644 subprojects/packagefiles/libjpegqs/meson.build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e22552 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/subprojects/* +!/subprojects/*.wrap +!/subprojects/packagefiles diff --git a/.gitmodules b/.gitmodules index e8c4d71..c6b083b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "wuffs-mirror-release-c"] path = wuffs-mirror-release-c url = https://github.com/google/wuffs-mirror-release-c -[submodule "jpeg-quantsmooth"] - path = jpeg-quantsmooth - url = https://github.com/ilyakurdyukov/jpeg-quantsmooth.git diff --git a/fiv-io.c b/fiv-io.c index a666230..48f862c 100644 --- a/fiv-io.c +++ b/fiv-io.c @@ -32,10 +32,7 @@ #include #include -// This library is tricky to build, simply make it work at all. -#define NO_SIMD -#include -#undef NO_SIMD +#include #endif // HAVE_JPEG_QS // Colour management must be handled before RGB conversions. diff --git a/jpeg-quantsmooth b/jpeg-quantsmooth deleted file mode 160000 index c86c641..0000000 --- a/jpeg-quantsmooth +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c86c6418ea6c827513d206694847033f9ca50151 diff --git a/meson.build b/meson.build index cab46ad..0ccc8cd 100644 --- a/meson.build +++ b/meson.build @@ -17,6 +17,12 @@ add_project_arguments( # add_project_link_arguments(flags, language : ['c']) #endif +# The likelihood of this being installed is nearly zero. Enable the wrap. +libjpegqs = dependency('libjpegqs', + required : get_option('libjpegqs'), + allow_fallback : true, +) + lcms2 = dependency('lcms2', required : get_option('lcms2')) # Note that only libraw_r is thread-safe, but we'll just run it out-of process. libraw = dependency('libraw', required : get_option('libraw')) @@ -30,7 +36,6 @@ dependencies = [ dependency('pixman-1'), dependency('libturbojpeg'), - dependency('libjpeg', required : get_option('jpeg-qs')), dependency('libwebp'), dependency('libwebpdemux'), dependency('libwebpdecoder', required : false), @@ -42,6 +47,7 @@ dependencies = [ ), lcms2, + libjpegqs, libraw, librsvg, xcursor, @@ -54,8 +60,7 @@ dependencies = [ conf = configuration_data() conf.set_quoted('PROJECT_NAME', meson.project_name()) conf.set_quoted('PROJECT_VERSION', meson.project_version()) -# TODO(p): Wrap it in a Meson subproject, try to enable SIMD. -conf.set('HAVE_JPEG_QS', get_option('jpeg-qs').enabled()) +conf.set('HAVE_JPEG_QS', libjpegqs.found()) conf.set('HAVE_LCMS2', lcms2.found()) conf.set('HAVE_LIBRAW', libraw.found()) conf.set('HAVE_LIBRSVG', librsvg.found()) diff --git a/meson_options.txt b/meson_options.txt index 1ecc87b..d59a568 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,6 +1,6 @@ option('lcms2', type : 'feature', value : 'auto', description : 'Build with Little CMS colour management') -option('jpeg-qs', type : 'feature', value : 'enabled', +option('libjpegqs', type : 'feature', value : 'auto', description : 'Build with JPEG Quant Smooth integration') option('libraw', type : 'feature', value : 'auto', description : 'Build with raw photo support, requires LibRaw') diff --git a/subprojects/libjpegqs.wrap b/subprojects/libjpegqs.wrap new file mode 100644 index 0000000..c6a8f6f --- /dev/null +++ b/subprojects/libjpegqs.wrap @@ -0,0 +1,9 @@ +[wrap-file] +directory = jpeg-quantsmooth-1.20210408 +source_url = https://github.com/ilyakurdyukov/jpeg-quantsmooth/archive/refs/tags/1.20210408.tar.gz +source_filename = jpeg-quantsmooth-1.20210408.tar.gz +source_hash = 5937ca26db33888cab8638c1a8dc7a367a953bd0857ceb1290d5abc6febf3116 +patch_directory = libjpegqs + +[provide] +libjpegqs = jpegqs_dep diff --git a/subprojects/packagefiles/libjpegqs/meson.build b/subprojects/packagefiles/libjpegqs/meson.build new file mode 100644 index 0000000..9755f59 --- /dev/null +++ b/subprojects/packagefiles/libjpegqs/meson.build @@ -0,0 +1,41 @@ +# vim: noet ts=4 sts=4 sw=4: +project('jpeg-qs', 'c') +add_project_arguments(meson.get_compiler('c') + .get_supported_arguments('-Wno-misleading-indentation'), + '-DWITH_LOG', language : 'c') + +deps = [ + dependency('libjpeg'), + meson.get_compiler('c').find_library('m', required : false), +] + +if host_machine.cpu_family() == 'x86_64' + jpegqs_avx512 = static_library('jpegqs-avx512', 'libjpegqs.c', + c_args : ['-DSIMD_SELECT', '-DSIMD_NAME=avx512', + '-mavx512f', '-mfma', '-DSIMD_AVX512'], + dependencies : deps) + jpegqs_avx2 = static_library('jpegqs-avx2', 'libjpegqs.c', + c_args : ['-DSIMD_SELECT', '-DSIMD_NAME=avx2', + '-mavx2', '-mfma', '-DSIMD_AVX2'], + dependencies : deps) + jpegqs_sse2 = static_library('jpegqs-sse2', 'libjpegqs.c', + c_args : ['-DSIMD_SELECT', '-DSIMD_NAME=sse2', '-msse2', '-DSIMD_SSE2'], + dependencies : deps) + jpegqs_base = static_library('jpegqs-base', 'libjpegqs.c', + c_args : ['-DSIMD_SELECT', '-DSIMD_NAME=base', '-DSIMD_BASE'], + dependencies : deps) + + jpegqs_lib = static_library('jpegqs', 'libjpegqs.c', + c_args : ['-DSIMD_SELECT'], + dependencies : deps, + link_with : [jpegqs_base, jpegqs_sse2, jpegqs_avx2, jpegqs_avx512]) +else + jpegqs_lib = static_library('jpegqs', 'libjpegqs.c', + c_args : ['-DNO_SIMD'], + dependencies : deps) +endif + +jpegqs_dep = declare_dependency( + link_with : jpegqs_lib, + include_directories : include_directories('.'), +)