gstreamer/gst-libs/gst/vulkan/meson.build
Matthew Waters 32b3387ae6 vulkan: implement proper descriptor set handling
The major functionality gain this provides is proper reference counting
for a descriptor set.  Overall this allows us to create descriptor sets
when they are needed (or reused from a cache) without violating any of
vulkan's object synchronisation requirements.

As there are a fixed number of sets available in a pool, the number of
descriptors in elements is currently hardcoded to 32.  This can be extended
in a future change to create pools on the fly if that limit is ever overrun.
2019-11-07 20:01:57 +00:00

293 lines
9.1 KiB
Meson

if get_option('vulkan').disabled()
gstvulkan_dep = dependency('', required: false)
subdir_done()
endif
vulkan_sources = [
'gstvkbuffermemory.c',
'gstvkbufferpool.c',
'gstvkcommandbuffer.c',
'gstvkcommandpool.c',
'gstvkdescriptorcache.c',
'gstvkdescriptorset.c',
'gstvkdescriptorpool.c',
'gstvkdevice.c',
'gstvkdebug.c',
'gstvkdisplay.c',
'gstvkerror.c',
'gstvkfence.c',
'gstvkformat.c',
'gstvkhandle.c',
'gstvkimagememory.c',
'gstvkimagebufferpool.c',
'gstvkimageview.c',
'gstvkinstance.c',
'gstvkmemory.c',
'gstvkphysicaldevice.c',
'gstvkqueue.c',
'gstvkswapper.c',
'gstvktrash.c',
'gstvkutils.c',
'gstvkwindow.c',
]
vulkan_headers = [
'gstvkapi.h',
'gstvkbarrier.h',
'gstvkbuffermemory.h',
'gstvkbufferpool.h',
'gstvkcommandbuffer.h',
'gstvkcommandpool.h',
'gstvkdescriptorcache.h',
'gstvkdescriptorset.h',
'gstvkdescriptorpool.h',
'gstvkdebug.h',
'gstvkdevice.h',
'gstvkdisplay.h',
'gstvkerror.h',
'gstvkfence.h',
'gstvkformat.h',
'gstvkhandle.h',
'gstvkimagememory.h',
'gstvkimagebufferpool.h',
'gstvkimageview.h',
'gstvkinstance.h',
'gstvkmemory.h',
'gstvkphysicaldevice.h',
'gstvkqueue.h',
'gstvkswapper.h',
'gstvktrash.h',
'gstvkutils.h',
'gstvkwindow.h',
'vulkan-prelude.h',
'vulkan_fwd.h',
'vulkan.h',
]
vulkan_xcb_headers = []
vulkan_wayland_headers = []
vulkan_windowing = false
vulkan_objc_args = []
vulkan_defines = []
optional_deps = []
has_vulkan_header = false
vulkan_dep = dependency('', required: false)
vulkan_inc_dir = ''
vulkan_conf = configuration_data()
vulkan_conf_options = [
'GST_VULKAN_HAVE_WINDOW_XCB',
'GST_VULKAN_HAVE_WINDOW_WAYLAND',
'GST_VULKAN_HAVE_WINDOW_COCOA',
'GST_VULKAN_HAVE_WINDOW_IOS',
'GST_VULKAN_HAVE_WINDOW_WIN32',
]
foreach option : vulkan_conf_options
vulkan_conf.set10(option, false)
endforeach
if host_system == 'ios'
vulkan_dep = cc.find_library('MoltenVK', required : get_option('vulkan'))
elif host_system == 'windows'
vulkan_root = run_command(python3, '-c', 'import os; print(os.environ.get("VK_SDK_PATH"))').stdout().strip()
if vulkan_root != '' and vulkan_root != 'None'
vulkan_lib_dir = ''
if build_machine.cpu_family() == 'x86_64'
vulkan_lib_dir = join_paths(vulkan_root, 'Lib')
else
vulkan_lib_dir = join_paths(vulkan_root, 'Lib32')
endif
vulkan_lib = cc.find_library('vulkan-1', dirs: vulkan_lib_dir,
required : get_option('vulkan'))
vulkan_inc_dir = join_paths(vulkan_root, 'Include')
has_vulkan_header = cc.has_header('vulkan/vulkan_core.h',
args: '-I' + vulkan_inc_dir)
if vulkan_lib.found() and has_vulkan_header
vulkan_dep = declare_dependency(include_directories: include_directories(vulkan_inc_dir),
dependencies: vulkan_lib)
endif
endif
else
vulkan_dep = dependency('vulkan', method: 'pkg-config', required : false)
if not vulkan_dep.found()
vulkan_dep = cc.find_library('vulkan', required : false)
endif
endif
if host_system != 'windows'
has_vulkan_header = cc.has_header('vulkan/vulkan_core.h')
endif
if not has_vulkan_header and get_option('vulkan').enabled()
error('vulkan plugin enabled, but vulkan.h not found')
endif
if not vulkan_dep.found() and get_option('vulkan').enabled()
error('vulkan plugin enabled, but could not find vulkan library')
endif
xcb_dep = dependency('xcb', version : '>=1.10', required : get_option('x11'))
if xcb_dep.found() and cc.has_header('vulkan/vulkan_xcb.h', dependencies : vulkan_dep)
vulkan_sources += [
'xcb/gstvkdisplay_xcb.c',
'xcb/gstvkwindow_xcb.c',
'xcb/xcb_event_source.c',
]
vulkan_xcb_headers += [
'xcb/gstvkdisplay_xcb.h'
]
optional_deps += xcb_dep
vulkan_windowing = true
vulkan_conf.set10('GST_VULKAN_HAVE_WINDOW_XCB', 1)
endif
wayland_client_dep = dependency('wayland-client', version : '>=1.4', required : get_option('wayland'))
if wayland_client_dep.found() and cc.has_header('vulkan/vulkan_wayland.h', dependencies : vulkan_dep)
vulkan_sources += [
'wayland/gstvkdisplay_wayland.c',
'wayland/gstvkwindow_wayland.c',
'wayland/wayland_event_source.c',
]
vulkan_wayland_headers += [
'wayland/gstvkdisplay_wayland.h'
]
optional_deps += wayland_client_dep
vulkan_windowing = true
vulkan_conf.set10('GST_VULKAN_HAVE_WINDOW_WAYLAND', 1)
endif
if ['darwin', 'ios'].contains(host_system)
objc = meson.get_compiler('objc')
if not objc.has_argument('-fobjc-arc')
error('ARC is required for building')
endif
vulkan_objc_args += ['-fobjc-arc']
foundation_dep = dependency('appleframeworks', modules : ['Foundation'], required : get_option('vulkan'))
quartzcore_dep = dependency('appleframeworks', modules : ['QuartzCore'], required : get_option('vulkan'))
corefoundation_dep = dependency('appleframeworks', modules : ['CoreFoundation'], required : get_option('vulkan'))
if foundation_dep.found() and quartzcore_dep.found() and corefoundation_dep.found()
optional_deps += [foundation_dep, corefoundation_dep, quartzcore_dep]
endif
endif
if host_system == 'darwin'
cocoa_dep = dependency('appleframeworks', modules : ['Cocoa'], required : get_option('vulkan'))
if cocoa_dep.found() and cc.has_header('vulkan/vulkan_macos.h', dependencies : vulkan_dep)
vulkan_sources += [
'cocoa/gstvkdisplay_cocoa.m',
'cocoa/gstvkwindow_cocoa.m',
]
optional_deps += [cocoa_dep]
vulkan_windowing = true
vulkan_conf.set10('GST_VULKAN_HAVE_WINDOW_COCOA', 1)
endif
endif
if host_system == 'ios'
uikit_dep = dependency('appleframeworks', modules : ['UIKit'], required : get_option('vulkan'))
if uikit_dep.found() and cc.has_header('vulkan/vulkan_ios.h', dependencies : vulkan_dep)
vulkan_sources += [
'ios/gstvkdisplay_ios.m',
'ios/gstvkwindow_ios.m',
]
optional_deps += [uikit_dep]
vulkan_windowing = true
vulkan_conf.set10('GST_VULKAN_HAVE_WINDOW_IOS', 1)
endif
endif
if host_system == 'windows'
gdi_dep = cc.find_library('gdi32', required : get_option('vulkan'))
# Cannot use internal dependency object with cc.has_header()
if gdi_dep.found() and cc.has_header('vulkan/vulkan_win32.h', args: '-I' + vulkan_inc_dir)
vulkan_sources += ['win32/gstvkwindow_win32.c']
optional_deps += [gdi_dep]
vulkan_windowing = true
vulkan_conf.set10('GST_VULKAN_HAVE_WINDOW_WIN32', 1)
endif
endif
if not vulkan_windowing
warning('No Windowing system found. vulkansink will not work')
endif
if not vulkan_dep.found() or not has_vulkan_header
if get_option('vulkan').enabled()
error('GStreamer Vulkan integration required via options, but needed dependencies not found.')
else
gstvulkan_dep = dependency('', required : false)
subdir_done()
endif
endif
gen_sources = []
install_headers(vulkan_headers, subdir : 'gstreamer-1.0/gst/vulkan')
install_headers(vulkan_xcb_headers, subdir : 'gstreamer-1.0/gst/vulkan/xcb')
install_headers(vulkan_wayland_headers, subdir : 'gstreamer-1.0/gst/vulkan/wayland')
configure_file(input : 'gstvkconfig.h.meson',
output : 'gstvkconfig.h',
install_dir : join_paths(get_option('includedir'), 'gstreamer-1.0/gst/vulkan'),
configuration : vulkan_conf)
vulkan_enums = gnome.mkenums_simple('vulkan-enumtypes',
sources : vulkan_headers,
body_prefix : '#ifdef HAVE_CONFIG_H\n#include "config.h"\n#endif',
header_prefix : '#include <gst/vulkan/vulkan-prelude.h>',
decorator : 'GST_VULKAN_API',
install_header: true,
install_dir : join_paths(get_option('includedir'), 'gstreamer-1.0/gst/vulkan'))
vulkan_enumtypes_c = vulkan_enums[0]
vulkan_enumtypes_h = vulkan_enums[1]
gen_sources += [vulkan_enumtypes_h]
gstvulkan = library('gstvulkan-' + api_version,
vulkan_sources, vulkan_enumtypes_c, vulkan_enumtypes_h,
c_args : gst_plugins_bad_args + vulkan_defines + ['-DBUILDING_GST_VULKAN'],
objc_args : gst_plugins_bad_args + vulkan_defines + vulkan_objc_args + ['-DBUILDING_GST_VULKAN'],
include_directories : [configinc, libsinc],
version : libversion,
soversion : soversion,
darwin_versions : osxversion,
install : true,
dependencies : [gstbase_dep, gstvideo_dep, vulkan_dep] + optional_deps)
if build_gir
extra_gir_includes = []
gobject_introspection_dep = dependency('gobject-introspection-1.0')
if gobject_introspection_dep.version().version_compare('>=1.61.1')
# This is the first version that contains Vulkan-1.0.gir
extra_gir_includes += ['Vulkan-1.0']
endif
vulkan_gir = gnome.generate_gir(gstvulkan,
sources : vulkan_sources + vulkan_headers + [vulkan_enumtypes_h, vulkan_enumtypes_c],
namespace : 'GstVulkan',
nsversion : api_version,
identifier_prefix : 'Gst',
symbol_prefix : 'gst',
export_packages : 'gstreamer-vulkan-1.0',
includes : ['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0'] + extra_gir_includes,
install : true,
extra_args : gir_init_section + ['--c-include=gst/vulkan/vulkan.h'],
dependencies : [gstvideo_dep, gst_dep, gstbase_dep] + optional_deps
)
gen_sources += vulkan_gir
endif
gstvulkan_dep = declare_dependency(link_with : gstvulkan,
include_directories : [libsinc],
sources: gen_sources,
dependencies : [gstvideo_dep, gstbase_dep, vulkan_dep] + optional_deps)