1gstvulkan_dep = dependency('', required: false) 2gstvulkanxcb_dep = dependency('', required: false) 3gstvulkanwyland_dep = dependency('', required: false) 4if get_option('vulkan').disabled() 5 subdir_done() 6endif 7 8vulkan_sources = files( 9 'gstvkbuffermemory.c', 10 'gstvkbufferpool.c', 11 'gstvkcommandbuffer.c', 12 'gstvkcommandpool.c', 13 'gstvkdescriptorcache.c', 14 'gstvkdescriptorset.c', 15 'gstvkdescriptorpool.c', 16 'gstvkdevice.c', 17 'gstvkdebug.c', 18 'gstvkdisplay.c', 19 'gstvkerror.c', 20 'gstvkfence.c', 21 'gstvkformat.c', 22 'gstvkfullscreenquad.c', 23 'gstvkhandle.c', 24 'gstvkhandlepool.c', 25 'gstvkimagememory.c', 26 'gstvkimagebufferpool.c', 27 'gstvkimageview.c', 28 'gstvkinstance.c', 29 'gstvkmemory.c', 30 'gstvkphysicaldevice.c', 31 'gstvkqueue.c', 32 'gstvkswapper.c', 33 'gstvktrash.c', 34 'gstvkvideofilter.c', 35 'gstvkutils.c', 36 'gstvkwindow.c', 37) 38 39vulkan_headers = files( 40 'gstvkapi.h', 41 'gstvkbarrier.h', 42 'gstvkbuffermemory.h', 43 'gstvkbufferpool.h', 44 'gstvkcommandbuffer.h', 45 'gstvkcommandpool.h', 46 'gstvkdescriptorcache.h', 47 'gstvkdescriptorset.h', 48 'gstvkdescriptorpool.h', 49 'gstvkdebug.h', 50 'gstvkdevice.h', 51 'gstvkdisplay.h', 52 'gstvkerror.h', 53 'gstvkfence.h', 54 'gstvkformat.h', 55 'gstvkfullscreenquad.h', 56 'gstvkhandle.h', 57 'gstvkhandlepool.h', 58 'gstvkimagememory.h', 59 'gstvkimagebufferpool.h', 60 'gstvkimageview.h', 61 'gstvkinstance.h', 62 'gstvkmemory.h', 63 'gstvkphysicaldevice.h', 64 'gstvkqueue.h', 65 'gstvkswapper.h', 66 'gstvktrash.h', 67 'gstvkutils.h', 68 'gstvkvideofilter.h', 69 'gstvkwindow.h', 70 'vulkan-prelude.h', 71 'vulkan_fwd.h', 72 'vulkan.h', 73) 74 75vulkan_priv_sources = [] 76vulkan_xcb_sources = [] 77vulkan_xcb_headers = [] 78vulkan_wayland_sources = [] 79vulkan_wayland_headers = [] 80 81vulkan_windowing = false 82vulkan_objc_args = [] 83vulkan_defines = [] 84optional_deps = [] 85has_vulkan_header = false 86vulkan_dep = dependency('', required: false) 87vulkan_inc_dir = '' 88enabled_vulkan_winsys = [] 89 90vulkan_conf = configuration_data() 91vulkan_conf_options = [ 92 'GST_VULKAN_HAVE_WINDOW_XCB', 93 'GST_VULKAN_HAVE_WINDOW_WAYLAND', 94 'GST_VULKAN_HAVE_WINDOW_COCOA', 95 'GST_VULKAN_HAVE_WINDOW_IOS', 96 'GST_VULKAN_HAVE_WINDOW_WIN32', 97 'GST_VULKAN_HAVE_WINDOW_ANDROID', 98] 99 100foreach option : vulkan_conf_options 101 vulkan_conf.set(option, 0) 102endforeach 103 104if ['ios', 'darwin'].contains(host_system) 105 # - ios does not support the loader/validation layers 106 # - We need to link directly to MoltenVK to be able to use 107 # MoltenVK-specific functions that use dispatchable handles (like 108 # retrieving the metal device from the VkDevice) which is currently waiting 109 # on implementing a proper Metal extension for Vulkan 110 # https://github.com/KhronosGroup/MoltenVK/issues/492 111 vulkan_dep = cc.find_library('MoltenVK', required : get_option('vulkan')) 112elif host_system == 'windows' 113 vulkan_root = run_command(python3, '-c', 'import os; print(os.environ.get("VK_SDK_PATH"))', check: false).stdout().strip() 114 if vulkan_root != '' and vulkan_root != 'None' 115 vulkan_lib_dir = '' 116 if build_machine.cpu_family() == 'x86_64' 117 vulkan_lib_dir = join_paths(vulkan_root, 'Lib') 118 else 119 vulkan_lib_dir = join_paths(vulkan_root, 'Lib32') 120 endif 121 122 vulkan_lib = cc.find_library('vulkan-1', dirs: vulkan_lib_dir, 123 required : get_option('vulkan')) 124 125 vulkan_inc_dir = join_paths(vulkan_root, 'Include') 126 has_vulkan_header = cc.has_header('vulkan/vulkan_core.h', 127 args: '-I' + vulkan_inc_dir) 128 129 if vulkan_lib.found() and has_vulkan_header 130 vulkan_dep = declare_dependency(include_directories: include_directories(vulkan_inc_dir), 131 dependencies: vulkan_lib) 132 endif 133 endif 134else 135 vulkan_dep = dependency('vulkan', method: 'pkg-config', required : false) 136 if not vulkan_dep.found() 137 vulkan_dep = cc.find_library('vulkan', required : false) 138 endif 139endif 140 141if host_system != 'windows' 142 has_vulkan_header = cc.has_header('vulkan/vulkan_core.h') 143endif 144 145if not has_vulkan_header and get_option('vulkan').enabled() 146 error('vulkan plugin enabled, but vulkan.h not found') 147endif 148if not vulkan_dep.found() and get_option('vulkan').enabled() 149 error('vulkan plugin enabled, but could not find vulkan library') 150endif 151 152xcb_dep = dependency('xcb', version : '>=1.10', required : get_option('x11')) 153xkbcommon_dep = dependency('xkbcommon', required : get_option('x11')) 154xkbcommon_x11_dep = dependency('xkbcommon-x11', required : get_option('x11')) 155 156if xcb_dep.found() and xkbcommon_dep.found() and xkbcommon_x11_dep.found() and cc.has_header('vulkan/vulkan_xcb.h', dependencies : vulkan_dep) 157 vulkan_priv_sources += files( 158 'xcb/gstvkwindow_xcb.c', 159 'xcb/xcb_event_source.c', 160 ) 161 vulkan_xcb_sources += files( 162 'xcb/gstvkdisplay_xcb.c', 163 ) 164 vulkan_xcb_headers += files( 165 'xcb/xcb.h', 166 'xcb/gstvkdisplay_xcb.h' 167 ) 168 169 optional_deps += [xcb_dep, xkbcommon_dep, xkbcommon_x11_dep] 170 vulkan_windowing = true 171 vulkan_conf.set('GST_VULKAN_HAVE_WINDOW_XCB', 1) 172 enabled_vulkan_winsys += ['xcb'] 173endif 174 175wayland_client_dep = dependency('wayland-client', version : '>=1.4', required : get_option('wayland')) 176if wayland_client_dep.found() and cc.has_header('vulkan/vulkan_wayland.h', dependencies : vulkan_dep) 177 vulkan_priv_sources += files( 178 'wayland/gstvkdisplay_wayland.c', 179 'wayland/gstvkwindow_wayland.c', 180 'wayland/wayland_event_source.c', 181 ) 182 vulkan_wayland_sources += files( 183 'wayland/gstvkdisplay_wayland.c', 184 ) 185 vulkan_wayland_headers += files( 186 'wayland/wayland.h', 187 'wayland/gstvkdisplay_wayland.h' 188 ) 189 190 optional_deps += wayland_client_dep 191 vulkan_windowing = true 192 vulkan_conf.set('GST_VULKAN_HAVE_WINDOW_WAYLAND', 1) 193 enabled_vulkan_winsys += ['wayland'] 194endif 195 196if ['darwin', 'ios'].contains(host_system) 197 objc = meson.get_compiler('objc') 198 if not objc.has_argument('-fobjc-arc') 199 error('ARC is required for building') 200 endif 201 202 vulkan_objc_args += ['-fobjc-arc'] 203 204 foundation_dep = dependency('appleframeworks', modules : ['Foundation'], required : get_option('vulkan')) 205 quartzcore_dep = dependency('appleframeworks', modules : ['QuartzCore'], required : get_option('vulkan')) 206 corefoundation_dep = dependency('appleframeworks', modules : ['CoreFoundation'], required : get_option('vulkan')) 207 if foundation_dep.found() and quartzcore_dep.found() and corefoundation_dep.found() 208 optional_deps += [foundation_dep, corefoundation_dep, quartzcore_dep] 209 endif 210endif 211 212if host_system == 'darwin' 213 cocoa_dep = dependency('appleframeworks', modules : ['Cocoa'], required : get_option('vulkan')) 214 215 if cocoa_dep.found() and cc.has_header('vulkan/vulkan_macos.h', dependencies : vulkan_dep) 216 vulkan_priv_sources += files( 217 'cocoa/gstvkdisplay_cocoa.m', 218 'cocoa/gstvkwindow_cocoa.m', 219 ) 220 optional_deps += [cocoa_dep] 221 vulkan_windowing = true 222 vulkan_conf.set('GST_VULKAN_HAVE_WINDOW_COCOA', 1) 223 enabled_vulkan_winsys += ['cocoa'] 224 endif 225endif 226 227if host_system == 'ios' 228 uikit_dep = dependency('appleframeworks', modules : ['UIKit'], required : get_option('vulkan')) 229 230 if uikit_dep.found() and cc.has_header('vulkan/vulkan_ios.h', dependencies : vulkan_dep) 231 vulkan_priv_sources += files( 232 'ios/gstvkdisplay_ios.m', 233 'ios/gstvkwindow_ios.m', 234 ) 235 optional_deps += [uikit_dep] 236 vulkan_windowing = true 237 vulkan_conf.set('GST_VULKAN_HAVE_WINDOW_IOS', 1) 238 enabled_vulkan_winsys += ['ios'] 239 endif 240endif 241 242if host_system == 'windows' 243 gdi_dep = cc.find_library('gdi32', required : get_option('vulkan')) 244 245 # Cannot use internal dependency object with cc.has_header() 246 if gdi_dep.found() and cc.has_header('vulkan/vulkan_win32.h', args: '-I' + vulkan_inc_dir) 247 vulkan_priv_sources += ['win32/gstvkwindow_win32.c'] 248 optional_deps += [gdi_dep] 249 vulkan_windowing = true 250 vulkan_conf.set('GST_VULKAN_HAVE_WINDOW_WIN32', 1) 251 enabled_vulkan_winsys += ['win32'] 252 endif 253endif 254 255if host_system == 'android' 256 if cc.has_header('vulkan/vulkan_android.h', dependencies : vulkan_dep) 257 vulkan_priv_sources += files( 258 'android/gstvkdisplay_android.c', 259 'android/gstvkwindow_android.c', 260 ) 261 vulkan_windowing = true 262 vulkan_conf.set('GST_VULKAN_HAVE_WINDOW_ANDROID', 1) 263 enabled_vulkan_winsys += ['android'] 264 endif 265endif 266 267if not vulkan_windowing 268 if get_option('vulkan').enabled() 269 error('No Windowing system found. vulkansink will not work') 270 else 271 message('No Windowing system found. vulkansink will not work') 272 endif 273endif 274 275# Only needed for the vulkan plugin, but doesn't make sense to build 276# anything else vulkan related if we are not going to build the plugin 277glslc = find_program('glslc', required: get_option('vulkan')) 278 279if not vulkan_dep.found() or not has_vulkan_header or not glslc.found() 280 if get_option('vulkan').enabled() 281 error('GStreamer Vulkan integration required via options, but needed dependencies not found.') 282 else 283 subdir_done() 284 endif 285endif 286 287gen_sources = [] 288 289install_headers(vulkan_headers, subdir : 'gstreamer-1.0/gst/vulkan') 290 291configure_file(input : 'gstvkconfig.h.meson', 292 output : 'gstvkconfig.h', 293 install_dir : join_paths(get_option('includedir'), 'gstreamer-1.0/gst/vulkan'), 294 configuration : vulkan_conf) 295 296glib_mkenums = find_program('glib-mkenums') 297mkenums = find_program('vulkan_mkenum.py') 298vulkan_enumtypes_h = custom_target('gstvulkanenum_h', 299 output : 'vulkan-enumtypes.h', 300 input : vulkan_headers, 301 install : true, 302 install_dir : join_paths(get_option('includedir'), 'gstreamer-1.0/gst/vulkan/'), 303 command : [mkenums, glib_mkenums, '@OUTPUT@', '@INPUT@']) 304 305vulkan_enumtypes_c = custom_target('gstvulkanenum_c', 306 output : 'vulkan-enumtypes.c', 307 input : vulkan_headers, 308 depends : [vulkan_enumtypes_h], 309 command : [mkenums, glib_mkenums, '@OUTPUT@', '@INPUT@']) 310gen_sources += [vulkan_enumtypes_h] 311 312gstvulkan = library('gstvulkan-' + api_version, 313 vulkan_sources, vulkan_priv_sources, vulkan_wayland_sources, vulkan_xcb_sources, vulkan_enumtypes_c, vulkan_enumtypes_h, 314 c_args : gst_plugins_bad_args + vulkan_defines + ['-DBUILDING_GST_VULKAN', '-DG_LOG_DOMAIN="GStreamer-Vulkan"'], 315 objc_args : gst_plugins_bad_args + vulkan_defines + vulkan_objc_args + ['-DBUILDING_GST_VULKAN', '-DG_LOG_DOMAIN="GStreamer-Vulkan"'], 316 include_directories : [configinc, libsinc], 317 version : libversion, 318 soversion : soversion, 319 darwin_versions : osxversion, 320 install : true, 321 dependencies : [gstbase_dep, gstvideo_dep, vulkan_dep] + optional_deps, 322 # don't confuse gst/vulkan/xcb/xcb.h with xcb/xcb.h 323 implicit_include_directories : false) 324 325library_def = {'lib': gstvulkan} 326pkg_name = 'gstreamer-vulkan-1.0' 327pkgconfig.generate(gstvulkan, 328 libraries : [gst_dep, gstbase_dep, gstvideo_dep], 329 variables : pkgconfig_variables, 330 subdirs : pkgconfig_subdirs, 331 name : pkg_name, 332 description : 'GStreamer Vulkan support', 333) 334 335if build_gir 336 extra_gir_includes = [] 337 gobject_introspection_dep = dependency('gobject-introspection-1.0') 338 if gobject_introspection_dep.version().version_compare('>=1.61.1') 339 # This is the first version that contains Vulkan-1.0.gir 340 extra_gir_includes += ['Vulkan-1.0'] 341 endif 342 343 gir = { 344 'sources' : vulkan_sources + vulkan_headers + [vulkan_enumtypes_h, vulkan_enumtypes_c], 345 'namespace' : 'GstVulkan', 346 'nsversion' : api_version, 347 'identifier_prefix' : 'Gst', 348 'symbol_prefix' : 'gst', 349 'export_packages' : pkg_name, 350 'includes' : ['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0'] + extra_gir_includes, 351 'install' : true, 352 'extra_args' : gir_init_section + ['--c-include=gst/vulkan/vulkan.h'], 353 'dependencies' : [gstvideo_dep, gst_dep, gstbase_dep] + optional_deps 354 } 355 356 library_def += {'gir': [gir]} 357 if not static_build 358 vulkan_gir = gnome.generate_gir(gstvulkan, kwargs: gir) 359 gen_sources += vulkan_gir 360 endif 361endif 362libraries += [[pkg_name, library_def]] 363 364gstvulkan_dep = declare_dependency(link_with : gstvulkan, 365 include_directories : [libsinc], 366 sources: gen_sources, 367 dependencies : [gstvideo_dep, gstbase_dep, vulkan_dep] + optional_deps) 368 369meson.override_dependency(pkg_name, gstvulkan_dep) 370 371if enabled_vulkan_winsys.contains('xcb') 372 install_headers(vulkan_xcb_headers, subdir : 'gstreamer-1.0/gst/vulkan/xcb') 373 pkgconfig.generate( 374 libraries : [gstvulkan], 375 requires : ['xcb'], 376 subdirs : pkgconfig_subdirs, 377 name : 'gstreamer-vulkan-xcb-1.0', 378 description : 'GStreamer Vulkan support (XCB Specifics)', 379 ) 380 vulkan_xcb_gir = [] 381 if build_gir 382 gir = { 383 'sources' : vulkan_xcb_sources + vulkan_xcb_headers, 384 'namespace' : 'GstVulkanXCB', 385 'nsversion' : api_version, 386 'identifier_prefix' : 'Gst', 387 'symbol_prefix' : 'gst', 388 'export_packages' : 'gstreamer-vulkan-xcb-1.0', 389 'install' : true, 390 'extra_args' : gir_init_section + ['--c-include=gst/vulkan/xcb/xcb.h'], 391 'dependencies' : [gstvideo_dep, gst_dep, gstbase_dep] + optional_deps 392 } 393 394 if not static_build 395 gir += {'includes' : ['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0', vulkan_gir[0]] + extra_gir_includes} 396 vulkan_xcb_gir = gnome.generate_gir(gstvulkan, kwargs: gir) 397 endif 398 399 gir += {'includes' :['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0', 'GstVulkan-1.0'] + extra_gir_includes} 400 library_def += {'gir': library_def['gir'] + [gir]} 401 endif 402 gstvulkanxcb_dep = declare_dependency(dependencies : [gstvulkan_dep], 403 sources : vulkan_xcb_gir) 404 meson.override_dependency('gstreamer-vulkan-xcb-1.0', gstvulkanxcb_dep) 405endif 406 407if enabled_vulkan_winsys.contains('wayland') 408 install_headers(vulkan_wayland_headers, subdir : 'gstreamer-1.0/gst/vulkan/wayland') 409 pkgconfig.generate( 410 libraries : [gstvulkan], 411 requires : ['wayland-client'], 412 subdirs : pkgconfig_subdirs, 413 name : 'gstreamer-vulkan-wayland-1.0', 414 description : 'GStreamer Vulkan support (Wayland Specifics)', 415 ) 416 vulkan_wayland_gir = [] 417 if build_gir 418 gir = { 419 'sources' : vulkan_wayland_sources + vulkan_wayland_headers, 420 'namespace' : 'GstVulkanWayland', 421 'nsversion' : api_version, 422 'identifier_prefix' : 'Gst', 423 'symbol_prefix' : 'gst', 424 'export_packages' : 'gstreamer-vulkan-wayland-1.0', 425 'install' : true, 426 'extra_args' : gir_init_section + ['--c-include=gst/vulkan/wayland/wayland.h'], 427 'dependencies' : [gstvideo_dep, gst_dep, gstbase_dep] + optional_deps 428 } 429 if not static_build 430 gir += {'includes' : ['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0', vulkan_gir[0]] + extra_gir_includes} 431 vulkan_wayland_gir += gnome.generate_gir(gstvulkan, kwargs: gir) 432 endif 433 gir += {'includes' :['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0', 'GstVulkan-1.0'] + extra_gir_includes} 434 library_def += {'gir': library_def['gir'] + [gir]} 435 endif 436 gstvulkanwayland_dep = declare_dependency(dependencies : [gstvulkan_dep], 437 sources : vulkan_wayland_gir) 438 meson.override_dependency('gstreamer-vulkan-wayland-1.0', gstvulkanwayland_dep) 439endif 440 441