1
0
Эх сурвалжийг харах

FindVulkan: Add component for `glslang`

MACHIZAUD Andréa 3 жил өмнө
parent
commit
9f8720e74c

+ 279 - 3
Modules/FindVulkan.cmake

@@ -15,7 +15,7 @@ Optional COMPONENTS
 
 .. versionadded:: 3.24
 
-This module respects several optional COMPONENTS: ``shaderc_combined`` and
+This module respects several optional COMPONENTS: ``glslang`` ``shaderc_combined`` and
 ``SPIRV-Tools``.  There are corresponding import targets for each of these
 flags.
 
@@ -45,6 +45,12 @@ This module defines :prop_tgt:`IMPORTED` targets if Vulkan has been found:
   The glslangValidator tool, if found.  It is used to compile GLSL and
   HLSL shaders into SPIR-V.
 
+``Vulkan::glslang``
+  .. versionadded:: 3.24
+
+  Defined if SDK has the Khronos-reference front-end shader parser and SPIR-V
+  generator library (glslang).
+
 ``Vulkan::shaderc_combined``
   .. versionadded:: 3.24
 
@@ -72,6 +78,10 @@ This module defines the following variables:
   .. versionadded:: 3.23
 
   value from ``vulkan/vulkan_core.h``
+``Vulkan_glslang_FOUND``
+  .. versionadded:: 3.24
+
+  True, if the SDK has the glslang library.
 ``Vulkan_shaderc_combined_FOUND``
   .. versionadded:: 3.24
 
@@ -91,6 +101,10 @@ The module will also defines these cache variables:
   the path to the GLSL SPIR-V compiler
 ``Vulkan_GLSLANG_VALIDATOR_EXECUTABLE``
   the path to the glslangValidator tool
+``Vulkan_glslang_LIBRARY``
+  .. versionadded:: 3.24
+
+  Path to the glslang library.
 ``Vulkan_shaderc_combined_LIBRARY``
   .. versionadded:: 3.24
 
@@ -176,6 +190,91 @@ find_program(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE
   )
 mark_as_advanced(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE)
 
+if(glslang IN_LIST Vulkan_FIND_COMPONENTS)
+  find_library(Vulkan_glslang-spirv_LIBRARY
+    NAMES SPIRV
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-spirv_LIBRARY)
+
+  find_library(Vulkan_glslang-spirv_DEBUG_LIBRARY
+    NAMES SPIRVd
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-spirv_DEBUG_LIBRARY)
+
+  find_library(Vulkan_glslang-oglcompiler_LIBRARY
+    NAMES OGLCompiler
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-oglcompiler_LIBRARY)
+
+  find_library(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY
+    NAMES OGLCompilerd
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY)
+
+  find_library(Vulkan_glslang-osdependent_LIBRARY
+    NAMES OSDependent
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-osdependent_LIBRARY)
+
+  find_library(Vulkan_glslang-osdependent_DEBUG_LIBRARY
+    NAMES OSDependentd
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-osdependent_DEBUG_LIBRARY)
+
+  find_library(Vulkan_glslang-machineindependent_LIBRARY
+    NAMES MachineIndependent
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-machineindependent_LIBRARY)
+
+  find_library(Vulkan_glslang-machineindependent_DEBUG_LIBRARY
+    NAMES MachineIndependentd
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-machineindependent_DEBUG_LIBRARY)
+
+  find_library(Vulkan_glslang-genericcodegen_LIBRARY
+    NAMES GenericCodeGen
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-genericcodegen_LIBRARY)
+
+  find_library(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY
+    NAMES GenericCodeGend
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY)
+
+  find_library(Vulkan_glslang_LIBRARY
+    NAMES glslang
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang_LIBRARY)
+
+  find_library(Vulkan_glslang_DEBUG_LIBRARY
+    NAMES glslangd
+    HINTS
+      ${_Vulkan_hint_library_search_paths}
+    )
+  mark_as_advanced(Vulkan_glslang_DEBUG_LIBRARY)
+endif()
 if(shaderc_combined IN_LIST Vulkan_FIND_COMPONENTS)
   find_library(Vulkan_shaderc_combined_LIBRARY
     NAMES shaderc_combined
@@ -204,14 +303,27 @@ if(SPIRV-Tools IN_LIST Vulkan_FIND_COMPONENTS)
 endif()
 
 function(_Vulkan_set_library_component_found component)
-  if(Vulkan_${component}_LIBRARY OR Vulkan_${component}_DEBUG_LIBRARY)
+  cmake_parse_arguments(PARSE_ARGV 1 _ARG
+    "NO_WARNING"
+    ""
+    "DEPENDENT_COMPONENTS")
+
+  set(all_dependent_component_found TRUE)
+  foreach(dependent_component IN LISTS _ARG_DEPENDENT_COMPONENTS)
+    if(NOT Vulkan_${dependent_component}_FOUND)
+      set(all_dependent_component_found FALSE)
+      break()
+    endif()
+  endforeach()
+
+  if(all_dependent_component_found AND (Vulkan_${component}_LIBRARY OR Vulkan_${component}_DEBUG_LIBRARY))
     set(Vulkan_${component}_FOUND TRUE PARENT_SCOPE)
 
     # For Windows Vulkan SDK, third party tools binaries are provided with different MSVC ABI:
     #   - Release binaries uses a runtime library
     #   - Debug binaries uses a debug runtime library
     # This lead to incompatibilities in linking for some configuration types due to CMake-default or project-configured selected MSVC ABI.
-    if(WIN32)
+    if(WIN32 AND NOT _ARG_NO_WARNING)
       if(NOT Vulkan_${component}_LIBRARY)
         message(WARNING
 "Library ${component} for Release configuration is missing, imported target Vulkan::${component} may not be able to link when targeting this build configuration due to incompatible MSVC ABI.")
@@ -226,6 +338,18 @@ function(_Vulkan_set_library_component_found component)
   endif()
 endfunction()
 
+_Vulkan_set_library_component_found(glslang-spirv NO_WARNING)
+_Vulkan_set_library_component_found(glslang-oglcompiler NO_WARNING)
+_Vulkan_set_library_component_found(glslang-osdependent NO_WARNING)
+_Vulkan_set_library_component_found(glslang-machineindependent NO_WARNING)
+_Vulkan_set_library_component_found(glslang-genericcodegen NO_WARNING)
+_Vulkan_set_library_component_found(glslang
+  DEPENDENT_COMPONENTS
+    glslang-spirv
+    glslang-oglcompiler
+    glslang-osdependent
+    glslang-machineindependent
+    glslang-genericcodegen)
 _Vulkan_set_library_component_found(shaderc_combined)
 _Vulkan_set_library_component_found(SPIRV-Tools)
 
@@ -285,6 +409,158 @@ if(Vulkan_FOUND AND Vulkan_GLSLANG_VALIDATOR_EXECUTABLE AND NOT TARGET Vulkan::g
 endif()
 
 if(Vulkan_FOUND)
+  if((Vulkan_glslang-spirv_LIBRARY OR Vulkan_glslang-spirv_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-spirv)
+    add_library(Vulkan::glslang-spirv STATIC IMPORTED)
+    set_property(TARGET Vulkan::glslang-spirv
+      PROPERTY
+        INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
+    if(Vulkan_glslang-spirv_LIBRARY)
+      set_property(TARGET Vulkan::glslang-spirv APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Release)
+      set_property(TARGET Vulkan::glslang-spirv
+        PROPERTY
+          IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-spirv_LIBRARY}")
+    endif()
+    if(Vulkan_glslang-spirv_DEBUG_LIBRARY)
+      set_property(TARGET Vulkan::glslang-spirv APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Debug)
+      set_property(TARGET Vulkan::glslang-spirv
+        PROPERTY
+          IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-spirv_DEBUG_LIBRARY}")
+    endif()
+  endif()
+
+  if((Vulkan_glslang-oglcompiler_LIBRARY OR Vulkan_glslang-oglcompiler_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-oglcompiler)
+    add_library(Vulkan::glslang-oglcompiler STATIC IMPORTED)
+    set_property(TARGET Vulkan::glslang-oglcompiler
+      PROPERTY
+        INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
+    if(Vulkan_glslang-oglcompiler_LIBRARY)
+      set_property(TARGET Vulkan::glslang-oglcompiler APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Release)
+      set_property(TARGET Vulkan::glslang-oglcompiler
+        PROPERTY
+          IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-oglcompiler_LIBRARY}")
+    endif()
+    if(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY)
+      set_property(TARGET Vulkan::glslang-oglcompiler APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Debug)
+      set_property(TARGET Vulkan::glslang-oglcompiler
+        PROPERTY
+          IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-oglcompiler_DEBUG_LIBRARY}")
+    endif()
+  endif()
+
+  if((Vulkan_glslang-osdependent_LIBRARY OR Vulkan_glslang-osdependent_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-osdependent)
+    add_library(Vulkan::glslang-osdependent STATIC IMPORTED)
+    set_property(TARGET Vulkan::glslang-osdependent
+      PROPERTY
+        INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
+    if(Vulkan_glslang-osdependent_LIBRARY)
+      set_property(TARGET Vulkan::glslang-osdependent APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Release)
+      set_property(TARGET Vulkan::glslang-osdependent
+        PROPERTY
+          IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-osdependent_LIBRARY}")
+    endif()
+    if(Vulkan_glslang-osdependent_DEBUG_LIBRARY)
+      set_property(TARGET Vulkan::glslang-osdependent APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Debug)
+      set_property(TARGET Vulkan::glslang-osdependent
+        PROPERTY
+          IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-osdependent_DEBUG_LIBRARY}")
+    endif()
+  endif()
+
+  if((Vulkan_glslang-machineindependent_LIBRARY OR Vulkan_glslang-machineindependent_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-machineindependent)
+    add_library(Vulkan::glslang-machineindependent STATIC IMPORTED)
+    set_property(TARGET Vulkan::glslang-machineindependent
+      PROPERTY
+        INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
+    if(Vulkan_glslang-machineindependent_LIBRARY)
+      set_property(TARGET Vulkan::glslang-machineindependent APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Release)
+      set_property(TARGET Vulkan::glslang-machineindependent
+        PROPERTY
+          IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-machineindependent_LIBRARY}")
+    endif()
+    if(Vulkan_glslang-machineindependent_DEBUG_LIBRARY)
+      set_property(TARGET Vulkan::glslang-machineindependent APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Debug)
+      set_property(TARGET Vulkan::glslang-machineindependent
+        PROPERTY
+          IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-machineindependent_DEBUG_LIBRARY}")
+    endif()
+  endif()
+
+  if((Vulkan_glslang-genericcodegen_LIBRARY OR Vulkan_glslang-genericcodegen_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-genericcodegen)
+    add_library(Vulkan::glslang-genericcodegen STATIC IMPORTED)
+    set_property(TARGET Vulkan::glslang-genericcodegen
+      PROPERTY
+        INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
+    if(Vulkan_glslang-genericcodegen_LIBRARY)
+      set_property(TARGET Vulkan::glslang-genericcodegen APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Release)
+      set_property(TARGET Vulkan::glslang-genericcodegen
+        PROPERTY
+          IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-genericcodegen_LIBRARY}")
+    endif()
+    if(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY)
+      set_property(TARGET Vulkan::glslang-genericcodegen APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Debug)
+      set_property(TARGET Vulkan::glslang-genericcodegen
+        PROPERTY
+          IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-genericcodegen_DEBUG_LIBRARY}")
+    endif()
+  endif()
+
+  if((Vulkan_glslang_LIBRARY OR Vulkan_glslang_DEBUG_LIBRARY)
+      AND TARGET Vulkan::glslang-spirv
+      AND TARGET Vulkan::glslang-oglcompiler
+      AND TARGET Vulkan::glslang-osdependent
+      AND TARGET Vulkan::glslang-machineindependent
+      AND TARGET Vulkan::glslang-genericcodegen
+      AND NOT TARGET Vulkan::glslang)
+    add_library(Vulkan::glslang STATIC IMPORTED)
+    set_property(TARGET Vulkan::glslang
+      PROPERTY
+        INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
+    if(Vulkan_glslang_LIBRARY)
+      set_property(TARGET Vulkan::glslang APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Release)
+      set_property(TARGET Vulkan::glslang
+        PROPERTY
+          IMPORTED_LOCATION_RELEASE "${Vulkan_glslang_LIBRARY}")
+    endif()
+    if(Vulkan_glslang_DEBUG_LIBRARY)
+      set_property(TARGET Vulkan::glslang APPEND
+        PROPERTY
+          IMPORTED_CONFIGURATIONS Debug)
+      set_property(TARGET Vulkan::glslang
+        PROPERTY
+          IMPORTED_LOCATION_DEBUG "${Vulkan_glslang_DEBUG_LIBRARY}")
+    endif()
+    target_link_libraries(Vulkan::glslang
+      INTERFACE
+        Vulkan::glslang-spirv
+        Vulkan::glslang-oglcompiler
+        Vulkan::glslang-osdependent
+        Vulkan::glslang-machineindependent
+        Vulkan::glslang-genericcodegen
+    )
+  endif()
+
   if((Vulkan_shaderc_combined_LIBRARY OR Vulkan_shaderc_combined_DEBUG_LIBRARY) AND NOT TARGET Vulkan::shaderc_combined)
     add_library(Vulkan::shaderc_combined STATIC IMPORTED)
     set_property(TARGET Vulkan::shaderc_combined

+ 12 - 0
Tests/FindVulkan/Test/CMakeLists.txt

@@ -6,6 +6,7 @@ include(CTest)
 SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../../Modules)
 find_package(Vulkan REQUIRED
   COMPONENTS
+    glslang
     shaderc_combined
     SPIRV-Tools)
 
@@ -27,6 +28,17 @@ target_include_directories(test_var_dl PRIVATE ${Vulkan_INCLUDE_DIRS})
 target_link_libraries(test_var_dl ${CMAKE_DL_LIBS})
 add_test(NAME test_var_dl COMMAND test_var_dl)
 
+add_executable(test_tgt_glslang main-glslang.cxx)
+target_link_libraries(test_tgt_glslang Vulkan::glslang)
+add_test(NAME test_tgt_glslang COMMAND test_tgt_glslang)
+
+get_property(glslang_debug_location TARGET Vulkan::glslang PROPERTY IMPORTED_LOCATION_DEBUG)
+if(NOT glslang_debug_location)
+  set_property(TARGET test_tgt_glslang
+    PROPERTY
+      MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
+endif()
+
 add_executable(test_tgt_shaderc_combined main-shaderc_combined.cxx)
 target_link_libraries(test_tgt_shaderc_combined Vulkan::shaderc_combined)
 add_test(NAME test_tgt_shaderc_combined COMMAND test_tgt_shaderc_combined)

+ 24 - 0
Tests/FindVulkan/Test/main-glslang.cxx

@@ -0,0 +1,24 @@
+#include <cassert>
+#include <iostream>
+
+#include <glslang/Public/ShaderLang.h>
+
+int main()
+{
+  const glslang::Version glslang_version = glslang::GetVersion();
+  const char* glslang_essl_version = glslang::GetEsslVersionString();
+  const char* glslang_glsl_version = glslang::GetGlslVersionString();
+  const int glslang_khronos_tool_id = glslang::GetKhronosToolId();
+
+  std::cout << "glslang Version: " << glslang_version.major << '.'
+            << glslang_version.minor << '.' << glslang_version.patch
+            << " (glsl version: " << glslang_glsl_version
+            << ", essl version:" << glslang_essl_version
+            << ", khronos tool:" << glslang_khronos_tool_id << ')'
+            << std::endl;
+
+  assert(glslang_essl_version);
+  assert(glslang_glsl_version);
+
+  return 0;
+}