FindVulkan: Add dxc (DirectX Shader Compiler) component

This commit is contained in:
HellsingDarge 2022-07-14 16:41:40 +07:00 committed by Brad King
parent 6a35e799fd
commit 1277b873c9
5 changed files with 138 additions and 0 deletions

View File

@ -0,0 +1,5 @@
FindVulkan-dxc
--------------
* The :module:`FindVulkan` module gained support for a DirectX Shader Compiler
component, ``dxc``.

View File

@ -20,6 +20,10 @@ This module respects several optional COMPONENTS: ``glslc``,
On macOS, an additional component ``MoltenVK`` is available.
There are corresponding import targets for each of these flags.
.. versionadded:: 3.25
Added optional COMPONENT ``dxc`` with corresponding targets.
IMPORTED Targets
^^^^^^^^^^^^^^^^
@ -75,6 +79,16 @@ This module defines :prop_tgt:`IMPORTED` targets if Vulkan has been found:
Defined if SDK has the Vulkan meta-loader (volk).
``Vulkan::dxc_lib``
.. versionadded:: 3.25
Defined if SDK has the DirectX shader compiler library.
``Vulkan::dxc_exe``
.. versionadded:: 3.25
Defined if SDK has the DirectX shader compiler CLI tool.
Result Variables
^^^^^^^^^^^^^^^^
@ -119,6 +133,17 @@ This module defines the following variables:
True, if the SDK has the volk library.
``Vulkan_dxc_lib_FOUND``
.. versionadded:: 3.25
True, if the SDK has the DirectX shader compiler library.
``Vulkan_dxc_exe_FOUND``
.. versionadded:: 3.25
True, if the SDK has the DirectX shader compiler CLI tool.
The module will also defines these cache variables:
``Vulkan_INCLUDE_DIR``
@ -151,6 +176,16 @@ The module will also defines these cache variables:
Path to the volk library.
``Vulkan_dxc_LIBRARY``
.. versionadded:: 3.25
Path to the DirectX shader compiler library.
``Vulkan_dxc_EXECUTABLE``
.. versionadded:: 3.25
Path to the DirectX shader compiler CLI tool.
Hints
^^^^^
@ -396,6 +431,20 @@ if(volk IN_LIST Vulkan_FIND_COMPONENTS)
mark_as_advanced(Vulkan_Volk_LIBRARY)
endif()
if (dxc IN_LIST Vulkan_FIND_COMPONENTS)
find_library(Vulkan_dxc_LIBRARY
NAMES dxcompiler
HINTS
${_Vulkan_hint_library_search_paths})
mark_as_advanced(Vulkan_dxc_LIBRARY)
find_program(Vulkan_dxc_EXECUTABLE
NAMES dxc
HINTS
${_Vulkan_hint_executable_search_paths})
mark_as_advanced(Vulkan_dxc_EXECUTABLE)
endif()
if(Vulkan_GLSLC_EXECUTABLE)
set(Vulkan_glslc_FOUND TRUE)
else()
@ -408,6 +457,12 @@ else()
set(Vulkan_glslangValidator_FOUND FALSE)
endif()
if (Vulkan_dxc_EXECUTABLE)
set(Vulkan_dxc_exe_FOUND TRUE)
else()
set(Vulkan_dxc_exe_FOUND FALSE)
endif()
function(_Vulkan_set_library_component_found component)
cmake_parse_arguments(PARSE_ARGV 1 _ARG
"NO_WARNING"
@ -459,6 +514,7 @@ _Vulkan_set_library_component_found(glslang
_Vulkan_set_library_component_found(shaderc_combined)
_Vulkan_set_library_component_found(SPIRV-Tools)
_Vulkan_set_library_component_found(volk)
_Vulkan_set_library_component_found(dxc)
if(Vulkan_MoltenVK_INCLUDE_DIR AND Vulkan_MoltenVK_LIBRARY)
set(Vulkan_MoltenVK_FOUND TRUE)
@ -764,6 +820,25 @@ if(Vulkan_FOUND)
IMPORTED_LINK_INTERFACE_LIBRARIES dl)
endif()
endif()
if (Vulkan_dxc_LIBRARY AND NOT TARGET Vulkan::dxc_lib)
add_library(Vulkan::dxc_lib STATIC IMPORTED)
set_property(TARGET Vulkan::dxc_lib
PROPERTY
INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
set_property(TARGET Vulkan::dxc_lib APPEND
PROPERTY
IMPORTED_CONFIGURATIONS Release)
set_property(TARGET Vulkan::dxc_lib APPEND
PROPERTY
IMPORTED_LOCATION_RELEASE "${Vulkan_dxc_LIBRARY}")
endif()
if(Vulkan_dxc_EXECUTABLE AND NOT TARGET Vulkan::dxc_exe)
add_executable(Vulkan::dxc_exe IMPORTED)
set_property(TARGET Vulkan::dxc_exe PROPERTY IMPORTED_LOCATION "${Vulkan_dxc_EXECUTABLE}")
endif()
endif()
if(Vulkan_MoltenVK_FOUND)

View File

@ -8,7 +8,9 @@ set(components
shaderc_combined
SPIRV-Tools
volk
dxc
)
if(APPLE)
list(APPEND components MoltenVK)
endif()
@ -80,6 +82,10 @@ add_executable(test_tgt_volk main-volk.cxx)
target_link_libraries(test_tgt_volk Vulkan::volk)
add_test(NAME test_tgt_volk COMMAND test_tgt_volk)
add_executable(test_tgt_dxc_lib main-dxc_lib.cxx)
target_link_libraries(test_tgt_dxc_lib Vulkan::dxc_lib)
add_test(NAME test_tgt_dxc_lib COMMAND test_tgt_dxc_lib)
if(Vulkan_GLSLC_EXECUTABLE)
add_test(NAME test_glslc
COMMAND ${CMAKE_COMMAND}
@ -97,3 +103,12 @@ if(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE)
-P "${CMAKE_CURRENT_LIST_DIR}/Run-glslangValidator.cmake"
)
endif()
if(Vulkan_dxc_EXECUTABLE)
add_test(NAME test_dxc_exe
COMMAND ${CMAKE_COMMAND}
"-DVULKAN_DXC_EXECUTABLE=${Vulkan_dxc_EXECUTABLE}"
"-DVULKAN_DXC_EXECUTABLE_TARGET=$<TARGET_FILE:Vulkan::dxc_exe>"
-P "${CMAKE_CURRENT_LIST_DIR}/Run-dxc_exe.cmake"
)
endif()

View File

@ -0,0 +1,20 @@
cmake_minimum_required(VERSION 3.12)
function(run_dxc_exe exe exe_display)
execute_process(COMMAND ${exe} --help
OUTPUT_VARIABLE output
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE result
)
if(NOT result EQUAL 0)
message(SEND_ERROR "Result of ${exe_display} --help is ${result}, should be 0")
endif()
if(NOT output MATCHES "^OVERVIEW: HLSL Compiler for ")
message(SEND_ERROR "Output of ${exe_display} --help is \"${output}\", should begin with \"OVERVIEW: HLSL Compiler for \"")
endif()
endfunction()
run_dxc_exe("${VULKAN_DXC_EXECUTABLE}" "\${VULKAN_DXC_EXECUTABLE}")
run_dxc_exe("${VULKAN_DXC_EXECUTABLE_TARGET}" "Vulkan::dxc_exe")

View File

@ -0,0 +1,23 @@
#include <cstdio>
#include "dxc/dxcapi.h"
#include "printf.h"
int main()
{
IDxcCompiler3* compiler;
DxcCreateInstance(CLSID_DxcCompiler, IID_PPV_ARGS(&compiler));
assert(compiler);
IDxcVersionInfo* version;
compiler->QueryInterface(&version);
uint32_t major, minor;
version->GetVersion(&major, &minor);
printf("DirectX Shader Compiler: %u.%u\n", major, minor);
version->Release();
compiler->Release();
return 0;
}