Merge pull request #2113 from nyorain/vulkan

Vulkan dependency module
pull/1968/head
Jussi Pakkanen 7 years ago committed by GitHub
commit e95ba1ada5
  1. 5
      docs/markdown/Release-notes-for-0.42.0.md
  2. 3
      mesonbuild/dependencies/__init__.py
  3. 78
      mesonbuild/dependencies/ui.py
  4. 7
      test cases/frameworks/17 vulkan/meson.build
  5. 26
      test cases/frameworks/17 vulkan/vulkanprog.c

@ -83,3 +83,8 @@ flag manually, e.g. via `link_args` to a target. This is not
recommended because having multiple rpath causes them to stomp on each recommended because having multiple rpath causes them to stomp on each
other. This warning will become a hard error in some future release. other. This warning will become a hard error in some future release.
## Vulkan dependency module
Vulkan can now be used as native dependency. The dependency module will detect
the VULKAN_SDK environment variable or otherwise try to receive the vulkan
library and header via pkgconfig or from the system.

@ -19,7 +19,7 @@ from .base import ( # noqa: F401
from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDependency from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDependency
from .misc import BoostDependency, Python3Dependency, ThreadDependency from .misc import BoostDependency, Python3Dependency, ThreadDependency
from .platform import AppleFrameworks from .platform import AppleFrameworks
from .ui import GLDependency, GnuStepDependency, Qt4Dependency, Qt5Dependency, SDL2Dependency, WxDependency from .ui import GLDependency, GnuStepDependency, Qt4Dependency, Qt5Dependency, SDL2Dependency, WxDependency, VulkanDependency
packages.update({ packages.update({
@ -44,4 +44,5 @@ packages.update({
'qt5': Qt5Dependency, 'qt5': Qt5Dependency,
'sdl2': SDL2Dependency, 'sdl2': SDL2Dependency,
'wxwidgets': WxDependency, 'wxwidgets': WxDependency,
'vulkan': VulkanDependency,
}) })

@ -24,7 +24,7 @@ from collections import OrderedDict
from .. import mlog from .. import mlog
from .. import mesonlib from .. import mesonlib
from ..mesonlib import MesonException, Popen_safe, version_compare from ..mesonlib import MesonException, Popen_safe, version_compare
from ..environment import for_windows from ..environment import for_windows, detect_cpu
from .base import DependencyException, DependencyMethods from .base import DependencyException, DependencyMethods
from .base import ExternalDependency, ExternalProgram from .base import ExternalDependency, ExternalProgram
@ -493,3 +493,79 @@ class WxDependency(ExternalDependency):
pass pass
WxDependency.wxconfig_found = False WxDependency.wxconfig_found = False
mlog.log('Found wx-config:', mlog.red('NO')) mlog.log('Found wx-config:', mlog.red('NO'))
class VulkanDependency(ExternalDependency):
def __init__(self, environment, kwargs):
super().__init__('vulkan', environment, None, kwargs)
if DependencyMethods.PKGCONFIG in self.methods:
try:
pcdep = PkgConfigDependency('vulkan', environment, kwargs)
if pcdep.found():
self.type_name = 'pkgconfig'
self.is_found = True
self.compile_args = pcdep.get_compile_args()
self.link_args = pcdep.get_link_args()
self.version = pcdep.get_version()
return
except Exception:
pass
if DependencyMethods.SYSTEM in self.methods:
try:
self.vulkan_sdk = os.environ['VULKAN_SDK']
if not os.path.isabs(self.vulkan_sdk):
raise DependencyException('VULKAN_SDK must be an absolute path.')
except KeyError:
self.vulkan_sdk = None
if self.vulkan_sdk:
# TODO: this config might not work on some platforms, fix bugs as reported
# we should at least detect other 64-bit platforms (e.g. armv8)
lib_name = 'vulkan'
if mesonlib.is_windows():
lib_name = 'vulkan-1'
lib_dir = 'Lib32'
inc_dir = 'Include'
if detect_cpu({}) == 'x86_64':
lib_dir = 'Lib'
else:
lib_name = 'vulkan'
lib_dir = 'lib'
inc_dir = 'include'
# make sure header and lib are valid
inc_path = os.path.join(self.vulkan_sdk, inc_dir)
header = os.path.join(inc_path, 'vulkan', 'vulkan.h')
lib_path = os.path.join(self.vulkan_sdk, lib_dir)
find_lib = self.compiler.find_library(lib_name, environment, lib_path)
if not find_lib:
raise DependencyException('VULKAN_SDK point to invalid directory (no lib)')
if not os.path.isfile(header):
raise DependencyException('VULKAN_SDK point to invalid directory (no include)')
self.type_name = 'vulkan_sdk'
self.is_found = True
self.compile_args.append('-I' + inc_path)
self.link_args.append('-L' + lib_path)
self.link_args.append('-l' + lib_name)
# TODO: find a way to retrieve the version from the sdk?
# Usually it is a part of the path to it (but does not have to be)
self.version = '1'
return
else:
# simply try to guess it, usually works on linux
libs = self.compiler.find_library('vulkan', environment, [])
if libs is not None and self.compiler.has_header('vulkan/vulkan.h', '', environment):
self.type_name = 'system'
self.is_found = True
self.version = 1 # TODO
for lib in libs:
self.link_args.append(lib)
return
def get_methods(self):
return [DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM]

@ -0,0 +1,7 @@
project('vulkan test', 'c')
vulkan_dep = dependency('vulkan')
e = executable('vulkanprog', 'vulkanprog.c', dependencies : vulkan_dep)
test('vulkantest', e)

@ -0,0 +1,26 @@
#include <vulkan/vulkan.h>
#include <stdio.h>
int main()
{
VkInstanceCreateInfo instance_create_info = {
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
NULL,
0,
NULL,
0,
NULL,
0,
NULL,
};
// we don't actually require instance creation to succeed since
// we cannot expect test environments to have a vulkan driver installed.
// As long as this does not produce as segmentation fault or similar,
// everything's alright.
VkInstance instance;
if(vkCreateInstance(&instance_create_info, NULL, &instance) == VK_SUCCESS)
vkDestroyInstance(instance, NULL);
return 0;
}
Loading…
Cancel
Save