1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4#[=======================================================================[.rst:
5FindVulkan
6----------
7
8.. versionadded:: 3.7
9
10Find Vulkan, which is a low-overhead, cross-platform 3D graphics
11and computing API.
12
13IMPORTED Targets
14^^^^^^^^^^^^^^^^
15
16This module defines :prop_tgt:`IMPORTED` targets if Vulkan has been found:
17
18``Vulkan::Vulkan``
19  The main Vulkan library.
20
21``Vulkan::glslc``
22  .. versionadded:: 3.19
23
24  The GLSLC SPIR-V compiler, if it has been found.
25
26``Vulkan::Headers``
27  .. versionadded:: 3.21
28
29  Provides just Vulkan headers include paths, if found.  No library is
30  included in this target.  This can be useful for applications that
31  load Vulkan library dynamically.
32
33``Vulkan::glslangValidator``
34  .. versionadded:: 3.21
35
36  The glslangValidator tool, if found.  It is used to compile GLSL and
37  HLSL shaders into SPIR-V.
38
39Result Variables
40^^^^^^^^^^^^^^^^
41
42This module defines the following variables::
43
44  Vulkan_FOUND          - "True" if Vulkan was found
45  Vulkan_INCLUDE_DIRS   - include directories for Vulkan
46  Vulkan_LIBRARIES      - link against this library to use Vulkan
47
48The module will also define three cache variables::
49
50  Vulkan_INCLUDE_DIR        - the Vulkan include directory
51  Vulkan_LIBRARY            - the path to the Vulkan library
52  Vulkan_GLSLC_EXECUTABLE   - the path to the GLSL SPIR-V compiler
53  Vulkan_GLSLANG_VALIDATOR_EXECUTABLE - the path to the glslangValidator tool
54
55Hints
56^^^^^
57
58.. versionadded:: 3.18
59
60The ``VULKAN_SDK`` environment variable optionally specifies the
61location of the Vulkan SDK root directory for the given
62architecture. It is typically set by sourcing the toplevel
63``setup-env.sh`` script of the Vulkan SDK directory into the shell
64environment.
65
66#]=======================================================================]
67
68if(WIN32)
69  find_path(Vulkan_INCLUDE_DIR
70    NAMES vulkan/vulkan.h
71    HINTS
72      "$ENV{VULKAN_SDK}/Include"
73    )
74
75  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
76    find_library(Vulkan_LIBRARY
77      NAMES vulkan-1
78      HINTS
79        "$ENV{VULKAN_SDK}/Lib"
80        "$ENV{VULKAN_SDK}/Bin"
81      )
82    find_program(Vulkan_GLSLC_EXECUTABLE
83      NAMES glslc
84      HINTS
85        "$ENV{VULKAN_SDK}/Bin"
86      )
87    find_program(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE
88      NAMES glslangValidator
89      HINTS
90        "$ENV{VULKAN_SDK}/Bin"
91      )
92  elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
93    find_library(Vulkan_LIBRARY
94      NAMES vulkan-1
95      HINTS
96        "$ENV{VULKAN_SDK}/Lib32"
97        "$ENV{VULKAN_SDK}/Bin32"
98      )
99    find_program(Vulkan_GLSLC_EXECUTABLE
100      NAMES glslc
101      HINTS
102        "$ENV{VULKAN_SDK}/Bin32"
103      )
104    find_program(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE
105      NAMES glslangValidator
106      HINTS
107        "$ENV{VULKAN_SDK}/Bin32"
108      )
109  endif()
110else()
111  find_path(Vulkan_INCLUDE_DIR
112    NAMES vulkan/vulkan.h
113    HINTS "$ENV{VULKAN_SDK}/include")
114  find_library(Vulkan_LIBRARY
115    NAMES vulkan
116    HINTS "$ENV{VULKAN_SDK}/lib")
117  find_program(Vulkan_GLSLC_EXECUTABLE
118    NAMES glslc
119    HINTS "$ENV{VULKAN_SDK}/bin")
120  find_program(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE
121    NAMES glslangValidator
122    HINTS "$ENV{VULKAN_SDK}/bin")
123endif()
124
125set(Vulkan_LIBRARIES ${Vulkan_LIBRARY})
126set(Vulkan_INCLUDE_DIRS ${Vulkan_INCLUDE_DIR})
127
128include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
129find_package_handle_standard_args(Vulkan
130  DEFAULT_MSG
131  Vulkan_LIBRARY Vulkan_INCLUDE_DIR)
132
133mark_as_advanced(Vulkan_INCLUDE_DIR Vulkan_LIBRARY Vulkan_GLSLC_EXECUTABLE
134                 Vulkan_GLSLANG_VALIDATOR_EXECUTABLE)
135
136if(Vulkan_FOUND AND NOT TARGET Vulkan::Vulkan)
137  add_library(Vulkan::Vulkan UNKNOWN IMPORTED)
138  set_target_properties(Vulkan::Vulkan PROPERTIES
139    IMPORTED_LOCATION "${Vulkan_LIBRARIES}"
140    INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
141endif()
142
143if(Vulkan_FOUND AND NOT TARGET Vulkan::Headers)
144  add_library(Vulkan::Headers INTERFACE IMPORTED)
145  set_target_properties(Vulkan::Headers PROPERTIES
146    INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
147endif()
148
149if(Vulkan_FOUND AND Vulkan_GLSLC_EXECUTABLE AND NOT TARGET Vulkan::glslc)
150  add_executable(Vulkan::glslc IMPORTED)
151  set_property(TARGET Vulkan::glslc PROPERTY IMPORTED_LOCATION "${Vulkan_GLSLC_EXECUTABLE}")
152endif()
153
154if(Vulkan_FOUND AND Vulkan_GLSLANG_VALIDATOR_EXECUTABLE AND NOT TARGET Vulkan::glslangValidator)
155  add_executable(Vulkan::glslangValidator IMPORTED)
156  set_property(TARGET Vulkan::glslangValidator PROPERTY IMPORTED_LOCATION "${Vulkan_GLSLANG_VALIDATOR_EXECUTABLE}")
157endif()
158