@@ -64,14 +64,78 @@ if(NOT Vulkan_FOUND OR NOT EXISTS "${Vulkan_INCLUDE_DIR}")
6464 endif ()
6565endif ()
6666
67+ # Include the script to fix vulkan.cppm files
68+ include (${CMAKE_CURRENT_LIST_DIR} /CMake/fix_vulkan_cppm.cmake)
69+
6770find_package (VulkanHpp REQUIRED)
6871
6972# Check if VulkanHpp_CPPM_DIR is set and exists
7073if (NOT DEFINED VulkanHpp_CPPM_DIR OR NOT EXISTS "${VulkanHpp_CPPM_DIR} " )
7174 message (WARNING "VulkanHpp CPPM directory not found: ${VulkanHpp_CPPM_DIR} " )
7275
76+ # First check if vulkan.cppm exists in /usr/include/vulkan
77+ if (EXISTS "/usr/include/vulkan/vulkan.cppm" )
78+ message (STATUS "Found vulkan.cppm in /usr/include/vulkan" )
79+
80+ # Create a copy in the build directory that we can modify
81+ set (VulkanHpp_CPPM_DIR "${CMAKE_BINARY_DIR} /include" )
82+ file (MAKE_DIRECTORY "${VulkanHpp_CPPM_DIR} /vulkan" )
83+
84+ # Read the content of the system vulkan.cppm file
85+ file (READ "/usr/include/vulkan/vulkan.cppm" VULKAN_CPPM_CONTENT)
86+
87+ # Check if it's using the old format (without detail namespace)
88+ if (VULKAN_CPPM_CONTENT MATCHES "using VULKAN_HPP_NAMESPACE::DispatchLoaderBase" AND
89+ NOT VULKAN_CPPM_CONTENT MATCHES "namespace detail" )
90+ message (STATUS "System vulkan.cppm file needs to be updated with detail namespace" )
91+
92+ # Create a modified version that directly imports the detail symbols
93+ file (WRITE "${VulkanHpp_CPPM_DIR} /vulkan/vulkan.cppm"
94+ "// Modified vulkan.cppm file
95+ module;
96+ #include <vulkan/vulkan.hpp>
97+ export module vulkan;
98+ export namespace vk {
99+ // Import symbols from the main namespace
100+ using namespace VULKAN_HPP_NAMESPACE;
101+
102+ // Import symbols from the detail namespace
103+ using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase;
104+ using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic;
105+ using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic;
106+ using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy;
107+ using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared;
108+ using VULKAN_HPP_NAMESPACE::detail::ObjectFree;
109+ using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared;
110+ using VULKAN_HPP_NAMESPACE::detail::ObjectRelease;
111+ using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared;
112+ using VULKAN_HPP_NAMESPACE::detail::PoolFree;
113+ using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared;
114+ using VULKAN_HPP_NAMESPACE::detail::createResultValueType;
115+ using VULKAN_HPP_NAMESPACE::detail::resultCheck;
116+ using VULKAN_HPP_NAMESPACE::detail::DynamicLoader;
117+
118+ // Export detail namespace for other symbols
119+ namespace detail {
120+ using namespace VULKAN_HPP_NAMESPACE::detail;
121+ }
122+
123+ // Export raii namespace
124+ namespace raii {
125+ using namespace VULKAN_HPP_RAII_NAMESPACE;
126+
127+ // Import symbols from the detail namespace
128+ using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher;
129+ using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher;
130+ }
131+ }
132+ " )
133+ else ()
134+ # Just copy the file as is
135+ file (COPY "/usr/include/vulkan/vulkan.cppm" DESTINATION "${VulkanHpp_CPPM_DIR} /vulkan" )
136+ endif ()
73137 # Try to find VulkanHpp in VULKAN_SDK
74- if (DEFINED ENV{VULKAN_SDK})
138+ elseif (DEFINED ENV{VULKAN_SDK})
75139 message (STATUS "Trying to find VulkanHpp in VULKAN_SDK environment variable: $ENV{VULKAN_SDK} " )
76140 set (VulkanHpp_CPPM_DIR "$ENV{VULKAN_SDK} /include" )
77141 if (EXISTS "${VulkanHpp_CPPM_DIR} " )
@@ -93,6 +157,31 @@ export namespace vk {
93157 namespace detail {
94158 using namespace VULKAN_HPP_NAMESPACE::detail;
95159 }
160+
161+ // Import symbols from the detail namespace directly
162+ using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase;
163+ using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic;
164+ using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic;
165+ using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy;
166+ using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared;
167+ using VULKAN_HPP_NAMESPACE::detail::ObjectFree;
168+ using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared;
169+ using VULKAN_HPP_NAMESPACE::detail::ObjectRelease;
170+ using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared;
171+ using VULKAN_HPP_NAMESPACE::detail::PoolFree;
172+ using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared;
173+ using VULKAN_HPP_NAMESPACE::detail::createResultValueType;
174+ using VULKAN_HPP_NAMESPACE::detail::resultCheck;
175+ using VULKAN_HPP_NAMESPACE::detail::DynamicLoader;
176+
177+ // Export raii namespace
178+ namespace raii {
179+ using namespace VULKAN_HPP_RAII_NAMESPACE;
180+
181+ // Import symbols from the detail namespace
182+ using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher;
183+ using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher;
184+ }
96185}
97186" )
98187 endif ()
0 commit comments