Skip to content

Commit 66f88c7

Browse files
committed
feat: add molten-vk conan dependency
1 parent aa5da98 commit 66f88c7

10 files changed

Lines changed: 142 additions & 10 deletions

File tree

Engine/Source/RHI-Vulkan/CMakeLists.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
44
set(platform_sources Src/Platform/Win32Surface.cpp)
55
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
66
set(platform_sources Src/Platform/MacosSurface.mm)
7-
set(platform_ext_libs
8-
"-framework Cocoa"
9-
"-framework IOKit"
10-
"-framework CoreFoundation")
7+
set(platform_ext_libs molten-vk::molten-vk "-framework Cocoa" "-framework IOKit" "-framework CoreFoundation")
118
endif()
129

1310
exp_add_library(

Engine/Source/RHI-Vulkan/Src/Instance.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ namespace RHI::Vulkan {
6060

6161
VulkanInstance::VulkanInstance()
6262
{
63+
#if PLATFORM_MACOS
64+
Common::PlatformUtils::SetEnvVar("VK_DRIVER_FILES", "MoltenVK_icd.json");
65+
#endif
66+
6367
#if BUILD_CONFIG_DEBUG
6468
PrepareLayers();
6569
#endif

Sample/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ function(add_sample)
3737
RES ${paths}
3838
NOT_INSTALL
3939
)
40+
add_dependencies(${arg_NAME} ${platform_dep_target})
4041
endfunction()
4142

4243
if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")

ThirdParty/CMakeLists.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
2828
set_target_properties(dxc::dxc PROPERTIES RUNTIME_DEP "${dxc_INCLUDE_DIR}/../bin/dxil.dll;${dxc_INCLUDE_DIR}/../bin/dxcompiler.dll")
2929
set_target_properties(vulkan-validationlayers::vulkan-validationlayers PROPERTIES RUNTIME_DEP "${VulkanValidationLayers_INCLUDE_DIR}/../bin/VkLayer_khronos_validation.dll;${VulkanValidationLayers_INCLUDE_DIR}/../bin/VkLayer_khronos_validation.json")
3030
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
31+
find_package(MoltenVK REQUIRED GLOBAL)
3132
set_target_properties(vulkan-validationlayers::vulkan-validationlayers PROPERTIES RUNTIME_DEP "${VulkanValidationLayers_INCLUDE_DIR}/../lib/libVkLayer_khronos_validation.dylib;${VulkanValidationLayers_INCLUDE_DIR}/../share/vulkan/explicit_layer.d/VkLayer_khronos_validation.json")
33+
set_target_properties(molten-vk::molten-vk PROPERTIES RUNTIME_DEP "${MoltenVK_INCLUDE_DIR}/../lib/libMoltenVK.dylib;${MoltenVK_INCLUDE_DIR}/../lib/MoltenVK_icd.json")
3234
endif ()
33-
34-
# TODO macos vulkan validation layers runtime dep
35-
# TODO molten vk
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
sources:
2+
"1.4.1-exp":
3+
commit: "db445ff2042d9ce348c439ad8451112f354b8d2a"
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import re
2+
3+
from conan import ConanFile
4+
from conan.tools.build import check_min_cppstd, can_run
5+
from conan.tools.cmake import cmake_layout, CMakeToolchain, CMakeDeps, CMake
6+
from conan.tools.files import apply_conandata_patches, copy
7+
from conan.tools.scm import Git
8+
import os
9+
import shutil
10+
11+
required_conan_version = ">=2.0.9"
12+
13+
class MoltenVKConan(ConanFile):
14+
name = "molten-vk"
15+
description = "molten vk (vulkan driver on macos)"
16+
license = "https://github.com/KhronosGroup/MoltenVK?tab=Apache-2.0-1-ov-file"
17+
url = "https://github.com/conan-io/conan-center-index"
18+
homepage = "https://github.com/KhronosGroup/MoltenVK"
19+
topics = ("vulkan", "driver", "macos")
20+
package_type = "shared-library"
21+
settings = "os", "arch", "compiler", "build_type"
22+
options = {}
23+
default_options = {}
24+
25+
def layout(self):
26+
cmake_layout(self, src_folder="src")
27+
28+
def validate(self):
29+
check_min_cppstd(self, 17)
30+
31+
def build_requirements(self):
32+
self.tool_requires("ninja/[>=1.12]")
33+
self.tool_requires("cmake/[>=3.16]")
34+
35+
def source(self):
36+
git = Git(self)
37+
git.clone("https://github.com/KhronosGroup/MoltenVK", target=".")
38+
git.checkout(self.conan_data["sources"][self.version]["commit"])
39+
apply_conandata_patches(self)
40+
41+
def generate(self):
42+
cmake_toolchain = CMakeToolchain(self, generator="Ninja")
43+
cmake_toolchain.generate()
44+
45+
deps = CMakeDeps(self)
46+
deps.generate()
47+
48+
def build(self):
49+
cmake = CMake(self)
50+
install_folder = os.path.join(self.build_folder, "installed")
51+
cmake.configure(cli_args=[f"-DCMAKE_INSTALL_PREFIX={install_folder}"])
52+
cmake.build()
53+
cmake.install(cli_args=["--prefix", install_folder])
54+
55+
lib_root = os.path.join(install_folder, "lib")
56+
for entry in os.listdir(lib_root):
57+
entry_path = os.path.join(lib_root, entry)
58+
if os.path.isdir(entry_path):
59+
shutil.rmtree(entry_path)
60+
elif os.path.islink(entry_path):
61+
os.remove(entry_path)
62+
elif entry.startswith("libMoltenVK"):
63+
os.rename(entry_path, os.path.join(lib_root, "libMoltenVK.dylib"))
64+
65+
icd_descriptor_json = os.path.join(install_folder, "etc", "vulkan", "icd.d", "MoltenVK_icd.json")
66+
new_icd_descriptor_json = os.path.join(install_folder, "lib", "MoltenVK_icd.json")
67+
with open(icd_descriptor_json, "r") as file:
68+
content = file.read()
69+
new_content = re.sub(r"\"library_path\": \".+\"", "\"library_path\": \"libMoltenVK.dylib\"", content)
70+
with open(new_icd_descriptor_json, "w") as file:
71+
file.write(new_content)
72+
73+
def package(self):
74+
install_folder = os.path.join(self.build_folder, "installed")
75+
copy(self, "*", install_folder, self.package_folder)
76+
os.mkdir(os.path.join(self.package_folder, "include"))
77+
78+
def package_info(self):
79+
self.cpp_info.set_property("cmake_file_name", "MoltenVK")
80+
self.cpp_info.bindirs = ["bin"]
81+
self.cpp_info.includedirs = ["include"]
82+
self.cpp_info.libs = []
83+
self.cpp_info.libdirs = []
84+
85+
def test(self):
86+
if can_run(self):
87+
bin_path = os.path.join(self.cpp.build.bindirs[0], "test_package")
88+
self.run(bin_path, env="conanrun")
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
project(test_package LANGUAGES CXX)
3+
4+
find_package(MoltenVK REQUIRED)
5+
6+
add_executable(${PROJECT_NAME} test_package.cpp)
7+
target_link_libraries(${PROJECT_NAME} PRIVATE molten-vk::molten-vk)
8+
add_custom_command(
9+
TARGET ${PROJECT_NAME} POST_BUILD
10+
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MoltenVK_INCLUDE_DIR}/../lib/libMoltenVK.dylib $<TARGET_FILE_DIR:${PROJECT_NAME}>/libMoltenVK.dylib
11+
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MoltenVK_INCLUDE_DIR}/../lib/MoltenVK_icd.json $<TARGET_FILE_DIR:${PROJECT_NAME}>/MoltenVK_icd.json
12+
)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from conan import ConanFile
2+
from conan.tools.build import can_run
3+
from conan.tools.cmake import cmake_layout, CMake
4+
import os
5+
6+
7+
class TestPackageConan(ConanFile):
8+
settings = "os", "arch", "compiler", "build_type"
9+
generators = "CMakeDeps", "CMakeToolchain"
10+
11+
def layout(self):
12+
cmake_layout(self)
13+
14+
def requirements(self):
15+
self.requires(self.tested_reference_str)
16+
17+
def build(self):
18+
cmake = CMake(self)
19+
cmake.configure()
20+
cmake.build()
21+
22+
def test(self):
23+
if can_run(self):
24+
bin_path = os.path.join(self.cpp.build.bindir, "test_package")
25+
self.run(bin_path, env="conanrun")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
int main(int argc, char* argv[])
2+
{
3+
return 0;
4+
}

conanfile.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ def requirements(self):
1515
self.requires("vulkan-loader/1.4.313.0")
1616
self.requires("vulkan-memory-allocator/3.3.0")
1717
self.requires("spirv-cross/1.4.313.0")
18-
1918
if self.settings.os == "Windows":
2019
self.requires("directx-headers/1.610.2")
2120

@@ -28,5 +27,5 @@ def requirements(self):
2827
self.requires("clipp/1.2.3-exp")
2928
self.requires("dxc/1.8.2505.1-exp")
3029
self.requires("vulkan-validationlayers/1.4.313.0-exp")
31-
32-
# TODO molten-vk
30+
if self.settings.os == "Macos":
31+
self.requires("molten-vk/1.4.1-exp")

0 commit comments

Comments
 (0)