From 8c216e637c089c3f7b31c37b00cb39aeb249cdb9 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Tue, 23 Jun 2020 01:47:41 +0100 Subject: [PATCH] build: Add Meson build system Signed-off-by: Joshua Ashton --- .gitignore | 3 ++ build-win32.txt | 19 ++++++++ build-win64.txt | 17 +++++++ demos/demo.h | 8 ---- demos/meson.build | 31 +++++++++++++ include/meson.build | 14 ++++++ include/vkd3d_windows.h | 1 - libs/meson.build | 4 ++ libs/vkd3d-common/meson.build | 13 ++++++ libs/vkd3d-shader/meson.build | 19 ++++++++ libs/vkd3d-shader/vkd3d_shader.def | 13 ++++++ libs/vkd3d-utils/meson.build | 14 ++++++ libs/vkd3d-utils/vkd3d_utils.def | 13 ++++++ libs/vkd3d/meson.build | 23 ++++++++++ libs/vkd3d/vkd3d.def | 23 ++++++++++ meson.build | 72 ++++++++++++++++++++++++++++++ meson_options.txt | 2 + programs/meson.build | 1 + tests/d3d12_crosstest.h | 16 ------- tests/meson.build | 31 +++++++++++++ vkd3d_version.c.in | 1 + 21 files changed, 313 insertions(+), 25 deletions(-) create mode 100644 build-win32.txt create mode 100644 build-win64.txt create mode 100644 demos/meson.build create mode 100644 include/meson.build create mode 100644 libs/meson.build create mode 100644 libs/vkd3d-common/meson.build create mode 100644 libs/vkd3d-shader/meson.build create mode 100644 libs/vkd3d-shader/vkd3d_shader.def create mode 100644 libs/vkd3d-utils/meson.build create mode 100644 libs/vkd3d-utils/vkd3d_utils.def create mode 100644 libs/vkd3d/meson.build create mode 100644 libs/vkd3d/vkd3d.def create mode 100644 meson.build create mode 100644 meson_options.txt create mode 100644 programs/meson.build create mode 100644 tests/meson.build create mode 100644 vkd3d_version.c.in diff --git a/.gitignore b/.gitignore index 72037ddb..567c1693 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,6 @@ vkd3d-*.tar.xz .deps .dirstamp .libs +build +build.native +build.cross diff --git a/build-win32.txt b/build-win32.txt new file mode 100644 index 00000000..2807a24f --- /dev/null +++ b/build-win32.txt @@ -0,0 +1,19 @@ +[binaries] +c = 'i686-w64-mingw32-gcc' +cpp = 'i686-w64-mingw32-g++' +ar = 'i686-w64-mingw32-ar' +strip = 'i686-w64-mingw32-strip' +cmake = 'i686-w64-mingw32-cmake' + +[properties] +c_args=['-msse', '-msse2'] +cpp_args=['-msse', '-msse2'] +c_link_args = ['-static', '-static-libgcc'] +cpp_link_args = ['-static', '-static-libgcc', '-static-libstdc++'] +needs_exe_wrapper = true + +[host_machine] +system = 'windows' +cpu_family = 'x86' +cpu = 'x86' +endian = 'little' diff --git a/build-win64.txt b/build-win64.txt new file mode 100644 index 00000000..16e3d44b --- /dev/null +++ b/build-win64.txt @@ -0,0 +1,17 @@ +[binaries] +c = 'x86_64-w64-mingw32-gcc' +cpp = 'x86_64-w64-mingw32-g++' +ar = 'x86_64-w64-mingw32-ar' +strip = 'x86_64-w64-mingw32-strip' +cmake = 'x86_64-w64-mingw32-cmake' + +[properties] +c_link_args = ['-static', '-static-libgcc'] +cpp_link_args = ['-static', '-static-libgcc', '-static-libstdc++'] +needs_exe_wrapper = true + +[host_machine] +system = 'windows' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' diff --git a/demos/demo.h b/demos/demo.h index b2b93172..39ac025b 100644 --- a/demos/demo.h +++ b/demos/demo.h @@ -25,14 +25,6 @@ * which leads to the "multiple storage classes in declaration * specifiers" compiler error. */ -#ifdef __MINGW32__ -#include <_mingw.h> -# ifdef __MINGW64_VERSION_MAJOR -# undef __forceinline -# define __forceinline __inline__ __attribute__((__always_inline__,__gnu_inline__)) -# endif -#endif - #include #define WIDL_C_INLINE_WRAPPERS #define COBJMACROS diff --git a/demos/meson.build b/demos/meson.build new file mode 100644 index 00000000..805ae5f9 --- /dev/null +++ b/demos/meson.build @@ -0,0 +1,31 @@ +demo_vkd3d_deps = [ + threads_dep +] + +if vkd3d_platform != 'windows' + demo_vkd3d_deps += [ + lib_m, + lib_xcb, + lib_xcbkeysyms, + + vkd3d_dep, + vkd3d_utils_dep, + ] +else + demo_vkd3d_deps += [ + lib_dxgi, + lib_d3d12 + ] +endif + +executable('gears', 'gears.c', vkd3d_headers, + dependencies : demo_vkd3d_deps, + install : true, + gui_app : true, + override_options : [ 'c_std='+vkd3d_c_std ]) + +executable('triangle', 'triangle.c', vkd3d_headers, + dependencies : demo_vkd3d_deps, + install : true, + gui_app : true, + override_options : [ 'c_std='+vkd3d_c_std ]) \ No newline at end of file diff --git a/include/meson.build b/include/meson.build new file mode 100644 index 00000000..18847f2d --- /dev/null +++ b/include/meson.build @@ -0,0 +1,14 @@ +vkd3d_idl = [ + 'vkd3d_d3d12.idl', + 'vkd3d_d3d12sdklayers.idl', + 'vkd3d_d3dcommon.idl', + 'vkd3d_dxgi.idl', + 'vkd3d_dxgi1_2.idl', + 'vkd3d_dxgi1_3.idl', + 'vkd3d_dxgi1_4.idl', + 'vkd3d_dxgibase.idl', + 'vkd3d_dxgiformat.idl', + 'vkd3d_dxgitype.idl', +] + +vkd3d_headers = idl_generator.process(vkd3d_idl) \ No newline at end of file diff --git a/include/vkd3d_windows.h b/include/vkd3d_windows.h index 0840109e..928f5b87 100644 --- a/include/vkd3d_windows.h +++ b/include/vkd3d_windows.h @@ -155,7 +155,6 @@ extern "C++" typedef struct SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES; #endif /* !defined(_WIN32) || defined(__WIDL__) */ - #ifndef _WIN32 # include # include diff --git a/libs/meson.build b/libs/meson.build new file mode 100644 index 00000000..39152a8a --- /dev/null +++ b/libs/meson.build @@ -0,0 +1,4 @@ +subdir('vkd3d-common') +subdir('vkd3d-shader') +subdir('vkd3d') +subdir('vkd3d-utils') \ No newline at end of file diff --git a/libs/vkd3d-common/meson.build b/libs/vkd3d-common/meson.build new file mode 100644 index 00000000..80fdb0e5 --- /dev/null +++ b/libs/vkd3d-common/meson.build @@ -0,0 +1,13 @@ +vkd3d_common_src = [ + 'debug.c', + 'memory.c', + 'utf8.c', +] + +vkd3d_common_lib = static_library('vkd3d_common', vkd3d_common_src, + include_directories : vkd3d_private_includes, + override_options : [ 'c_std='+vkd3d_c_std ]) + +vkd3d_common_dep = declare_dependency( + link_with : vkd3d_common_lib, + include_directories : vkd3d_public_includes) \ No newline at end of file diff --git a/libs/vkd3d-shader/meson.build b/libs/vkd3d-shader/meson.build new file mode 100644 index 00000000..3af49a36 --- /dev/null +++ b/libs/vkd3d-shader/meson.build @@ -0,0 +1,19 @@ +vkd3d_shader_src = [ + 'checksum.c', + 'dxil.c', + 'dxbc.c', + 'spirv.c', + 'trace.c', + 'vkd3d_shader_main.c', +] + +vkd3d_shader_lib = shared_library('vkd3d-shader', vkd3d_shader_src, vkd3d_headers, + dependencies : [ vkd3d_common_dep, dxil_spirv_lib ], + include_directories : vkd3d_private_includes, + install : true, + vs_module_defs : 'vkd3d_shader.def', + override_options : [ 'c_std='+vkd3d_c_std ]) + +vkd3d_shader_dep = declare_dependency( + link_with : vkd3d_shader_lib, + include_directories : vkd3d_public_includes) \ No newline at end of file diff --git a/libs/vkd3d-shader/vkd3d_shader.def b/libs/vkd3d-shader/vkd3d_shader.def new file mode 100644 index 00000000..2d45d131 --- /dev/null +++ b/libs/vkd3d-shader/vkd3d_shader.def @@ -0,0 +1,13 @@ +LIBRARY vkd3d-shader +EXPORTS + vkd3d_shader_compile_dxbc + vkd3d_shader_convert_root_signature + vkd3d_shader_find_signature_element + vkd3d_shader_free_root_signature + vkd3d_shader_free_shader_code + vkd3d_shader_free_shader_signature + vkd3d_shader_parse_input_signature + vkd3d_shader_parse_root_signature + vkd3d_shader_scan_dxbc + vkd3d_shader_serialize_root_signature + vkd3d_shader_supports_dxil diff --git a/libs/vkd3d-utils/meson.build b/libs/vkd3d-utils/meson.build new file mode 100644 index 00000000..6d0f96a1 --- /dev/null +++ b/libs/vkd3d-utils/meson.build @@ -0,0 +1,14 @@ +vkd3d_utils_src = [ + 'vkd3d_utils_main.c', +] + +vkd3d_utils_lib = shared_library('vkd3d-utils', vkd3d_utils_src, vkd3d_headers, + dependencies : vkd3d_dep, + include_directories : vkd3d_private_includes, + install : true, + vs_module_defs : 'vkd3d_utils.def', + override_options : [ 'c_std='+vkd3d_c_std ]) + +vkd3d_utils_dep = declare_dependency( + link_with : vkd3d_utils_lib, + include_directories : vkd3d_public_includes) \ No newline at end of file diff --git a/libs/vkd3d-utils/vkd3d_utils.def b/libs/vkd3d-utils/vkd3d_utils.def new file mode 100644 index 00000000..0c4e261b --- /dev/null +++ b/libs/vkd3d-utils/vkd3d_utils.def @@ -0,0 +1,13 @@ +LIBRARY vkd3d-utils +EXPORTS + D3D12CreateDevice + D3D12CreateRootSignatureDeserializer + D3D12CreateVersionedRootSignatureDeserializer + D3D12GetDebugInterface + D3D12SerializeRootSignature + D3D12SerializeVersionedRootSignature + vkd3d_create_event + vkd3d_destroy_event + vkd3d_signal_event + vkd3d_wait_event + diff --git a/libs/vkd3d/meson.build b/libs/vkd3d/meson.build new file mode 100644 index 00000000..b34b6913 --- /dev/null +++ b/libs/vkd3d/meson.build @@ -0,0 +1,23 @@ +vkd3d_src = [ + 'command.c', + 'device.c', + 'meta.c', + 'platform.c', + 'resource.c', + 'state.c', + 'utils.c', + 'vkd3d_main.c', +] + +vkd3d_lib = shared_library('vkd3d', vkd3d_src, vkd3d_version, vkd3d_headers, + dependencies : [ vkd3d_common_dep, vkd3d_shader_dep ] + vkd3d_extra_libs, + include_directories : vkd3d_private_includes, + install : true, + vs_module_defs : 'vkd3d.def', + version : '1.1.0', + override_options : [ 'c_std='+vkd3d_c_std ]) + +vkd3d_dep = declare_dependency( + link_with : [ vkd3d_lib, vkd3d_common_lib ], + dependencies : vkd3d_extra_libs, + include_directories : vkd3d_public_includes) diff --git a/libs/vkd3d/vkd3d.def b/libs/vkd3d/vkd3d.def new file mode 100644 index 00000000..0697ef2c --- /dev/null +++ b/libs/vkd3d/vkd3d.def @@ -0,0 +1,23 @@ +LIBRARY vkd3d +EXPORTS + vkd3d_acquire_vk_queue + vkd3d_create_device + vkd3d_create_image_resource + vkd3d_create_instance + vkd3d_create_root_signature_deserializer + vkd3d_create_versioned_root_signature_deserializer + vkd3d_get_device_parent + vkd3d_get_dxgi_format + vkd3d_get_vk_device + vkd3d_get_vk_format + vkd3d_get_vk_physical_device + vkd3d_get_vk_queue_family_index + vkd3d_instance_decref + vkd3d_instance_from_device + vkd3d_instance_get_vk_instance + vkd3d_instance_incref + vkd3d_release_vk_queue + vkd3d_resource_decref + vkd3d_resource_incref + vkd3d_serialize_root_signature + vkd3d_serialize_versioned_root_signature diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..12e4de46 --- /dev/null +++ b/meson.build @@ -0,0 +1,72 @@ +project('vkd3d', ['c'], version : '1.1', meson_version : '>= 0.51') + +cpu_family = target_machine.cpu_family() + +add_project_arguments('-DHAVE_DXIL_SPV', language : 'c') +add_project_arguments('-D_GNU_SOURCE', language : 'c') +add_project_arguments('-DPACKAGE_VERSION="' + meson.project_version() + '"', language : 'c') + +vkd3d_compiler = meson.get_compiler('c') +vkd3d_c_std = 'c99' + +vkd3d_external_includes = [ './subprojects/Vulkan-Headers/include', './subprojects/SPIRV-Headers/include' ] +vkd3d_public_includes = [ './include' ] + vkd3d_external_includes +vkd3d_private_includes = [ './include/private' ] + vkd3d_public_includes + +vkd3d_external_includes = include_directories(vkd3d_external_includes) +vkd3d_public_includes = include_directories(vkd3d_public_includes) +vkd3d_private_includes = include_directories(vkd3d_private_includes) + +idl_compiler = find_program('widl') +idl_generator = generator(idl_compiler, + output : [ '@BASENAME@.h' ], + arguments : [ '-h', '-o', '@OUTPUT@', '@INPUT@' ]) + +threads_dep = dependency('threads') + +vkd3d_platform = target_machine.system() +if vkd3d_platform == 'linux' + lib_dl = vkd3d_compiler.find_library('dl') + # For the demos... + lib_m = vkd3d_compiler.find_library('m') + lib_xcb = vkd3d_compiler.find_library('xcb') + lib_xcbkeysyms = vkd3d_compiler.find_library('xcb-keysyms') + vkd3d_extra_libs = [ lib_dl, threads_dep ] +elif vkd3d_platform == 'windows' + lib_dxgi = vkd3d_compiler.find_library('dxgi') + lib_d3d12 = vkd3d_compiler.find_library('d3d12') + vkd3d_extra_libs = [ threads_dep ] +else + error('Unknown platform') +endif + +add_project_arguments(vkd3d_compiler.get_supported_arguments([ + '-Wno-format', + '-Wno-discarded-qualifiers', + '-Wno-incompatible-pointer-types', + '-Wno-missing-braces']), + language : 'c') + +vkd3d_version = vcs_tag( + command : ['git', 'describe', '--dirty=+'], + input : 'vkd3d_version.c.in', + output : 'vkd3d_version.c') + +cmake = import('cmake') +dxil_spirv = cmake.subproject('dxil-spirv', cmake_options: ['-DDXIL_SPIRV_CLI=OFF'] ) +dxil_spirv_lib = dxil_spirv.dependency('dxil-spirv-c-shared') + +subdir('include') +subdir('libs') + +enable_tests = get_option('enable_tests') +enable_extras = get_option('enable_extras') + +if enable_tests + subdir('tests') +endif + +if enable_extras + subdir('demos') + subdir('programs') +endif \ No newline at end of file diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 00000000..61a693c8 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,2 @@ +option('enable_tests', type : 'boolean', value : false) +option('enable_extras', type : 'boolean', value : false) \ No newline at end of file diff --git a/programs/meson.build b/programs/meson.build new file mode 100644 index 00000000..fce6741d --- /dev/null +++ b/programs/meson.build @@ -0,0 +1 @@ +subdir('vkd3d-compiler') diff --git a/tests/d3d12_crosstest.h b/tests/d3d12_crosstest.h index 38f3eec6..981c04bf 100644 --- a/tests/d3d12_crosstest.h +++ b/tests/d3d12_crosstest.h @@ -19,22 +19,6 @@ #ifndef __VKD3D_D3D12_CROSSTEST_H #define __VKD3D_D3D12_CROSSTEST_H -/* Hack for MinGW-w64 headers. - * - * We want to use WIDL C inline wrappers because some methods - * in D3D12 interfaces return aggregate objects. Unfortunately, - * WIDL C inline wrappers are broken when used with MinGW-w64 - * headers because FORCEINLINE expands to extern inline - * which leads to the "multiple storage classes in declaration - * specifiers" compiler error. - */ -#ifdef __MINGW32__ -# include <_mingw.h> -# ifdef __MINGW64_VERSION_MAJOR -# undef __forceinline -# define __forceinline __inline__ __attribute__((__always_inline__,__gnu_inline__)) -# endif - # define _HRESULT_DEFINED typedef int HRESULT; #endif diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 00000000..ef71b080 --- /dev/null +++ b/tests/meson.build @@ -0,0 +1,31 @@ +vkd3d_test_deps = [ vkd3d_dep, vkd3d_utils_dep ] + +executable('vkd3d_api', 'vkd3d_api.c', vkd3d_headers, + dependencies : vkd3d_test_deps, + include_directories : vkd3d_private_includes, + install : true, + override_options : [ 'c_std='+vkd3d_c_std ]) + +executable('vkd3d_common', 'vkd3d_common.c', vkd3d_headers, + dependencies : vkd3d_test_deps, + include_directories : vkd3d_private_includes, + install : true, + override_options : [ 'c_std='+vkd3d_c_std ]) + +executable('vkd3d_shader_api', 'vkd3d_shader_api.c', vkd3d_headers, + dependencies : vkd3d_test_deps + [ vkd3d_shader_dep ], + include_directories : vkd3d_private_includes, + install : true, + override_options : [ 'c_std='+vkd3d_c_std ]) + +executable('d3d12', 'd3d12.c', vkd3d_headers, + dependencies : vkd3d_test_deps + [ vkd3d_shader_dep ], + include_directories : vkd3d_private_includes, + install : true, + override_options : [ 'c_std='+vkd3d_c_std ]) + +executable('d3d12_invalid_usage', 'd3d12_invalid_usage.c', vkd3d_headers, + dependencies : vkd3d_test_deps + [ vkd3d_shader_dep ], + include_directories : vkd3d_private_includes, + install : true, + override_options : [ 'c_std='+vkd3d_c_std ]) \ No newline at end of file diff --git a/vkd3d_version.c.in b/vkd3d_version.c.in new file mode 100644 index 00000000..33202103 --- /dev/null +++ b/vkd3d_version.c.in @@ -0,0 +1 @@ +const char vkd3d_build[] = "@VCS_TAG@";