diff --git a/runtime/Includes/Core/UUID.h b/runtime/Includes/Core/UUID.h index 9911302..2caa3f7 100644 --- a/runtime/Includes/Core/UUID.h +++ b/runtime/Includes/Core/UUID.h @@ -7,9 +7,7 @@ namespace mlx { public: UUID(); - UUID(std::uint64_t uuid); - - inline operator std::uint64_t() const { return m_uuid; } + inline operator std::uint64_t() const noexcept { return m_uuid; } private: std::uint64_t m_uuid; diff --git a/runtime/Sources/Core/SDLManager.cpp b/runtime/Sources/Core/SDLManager.cpp index 5f3aa50..51aa85d 100644 --- a/runtime/Sources/Core/SDLManager.cpp +++ b/runtime/Sources/Core/SDLManager.cpp @@ -22,7 +22,7 @@ namespace mlx MLX_PROFILE_FUNCTION(); s_instance = this; - m_drop_sdl_responsability = SDL_WasInit(SDL_INIT_VIDEO); + m_drop_sdl_responsability = SDL_WasInit(SDL_INIT_VIDEO) || std::getenv("MLX_HEADLESS_MODE") != nullptr; if(m_drop_sdl_responsability) // is case the mlx is running in a sandbox like MacroUnitTester where SDL is already init return; SDL_SetMemoryFunctions(MemManager::Get().Malloc, MemManager::Get().Calloc, MemManager::Get().Realloc, MemManager::Get().Free); diff --git a/runtime/Sources/Core/UUID.cpp b/runtime/Sources/Core/UUID.cpp index cf2855a..5a370dd 100644 --- a/runtime/Sources/Core/UUID.cpp +++ b/runtime/Sources/Core/UUID.cpp @@ -7,7 +7,14 @@ namespace mlx static std::random_device random_device; static std::mt19937_64 engine(random_device()); static std::uniform_int_distribution uniform_distribution; + static std::unordered_set registry; - UUID::UUID() : m_uuid(uniform_distribution(engine)) {} - UUID::UUID(std::uint64_t uuid) : m_uuid(uuid) {} + UUID::UUID() + { + do + { + m_uuid = uniform_distribution(engine); + } while(registry.contains(m_uuid)); + registry.emplace(m_uuid); + } } diff --git a/runtime/Sources/Renderer/RenderCore.cpp b/runtime/Sources/Renderer/RenderCore.cpp index 4bddadc..2445aa2 100644 --- a/runtime/Sources/Renderer/RenderCore.cpp +++ b/runtime/Sources/Renderer/RenderCore.cpp @@ -87,15 +87,24 @@ namespace mlx kvfSetValidationErrorCallback(&ValidationErrorCallback); kvfSetValidationWarningCallback(&WarningCallback); - mlx_window_create_info info{}; - info.title = ""; - info.width = 1; - info.height = 1; - Window window(&info, true); - std::vector instance_extensions = window.GetRequiredVulkanInstanceExtentions(); - #ifdef MLX_PLAT_MACOS - instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); - #endif + std::vector instance_extensions; + VkSurfaceKHR surface = VK_NULL_HANDLE; + std::unique_ptr window; + + bool is_headless = std::getenv("MLX_HEADLESS_MODE") != nullptr; + + if(!is_headless) + { + mlx_window_create_info info{}; + info.title = ""; + info.width = 1; + info.height = 1; + window = std::make_unique(&info, true); + instance_extensions = window->GetRequiredVulkanInstanceExtentions(); + #ifdef MLX_PLAT_MACOS + instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + #endif + } m_instance = kvfCreateInstance(instance_extensions.data(), instance_extensions.size()); DebugLog("Vulkan: instance created"); @@ -103,9 +112,13 @@ namespace mlx loader->LoadInstance(m_instance); LoadKVFInstanceVulkanFunctionPointers(); - VkSurfaceKHR surface = window.CreateVulkanSurface(m_instance); - - m_physical_device = kvfPickGoodDefaultPhysicalDevice(m_instance, surface); + if(!is_headless) + { + surface = window->CreateVulkanSurface(m_instance); + m_physical_device = kvfPickGoodDefaultPhysicalDevice(m_instance, surface); + } + else + m_physical_device = kvfPickGoodPhysicalDevice(m_instance, VK_NULL_HANDLE, nullptr, 0); // just for style VkPhysicalDeviceProperties props; @@ -121,7 +134,8 @@ namespace mlx loader->LoadDevice(m_device); LoadKVFDeviceVulkanFunctionPointers(); - vkDestroySurfaceKHR(m_instance, surface, nullptr); + if(surface != VK_NULL_HANDLE) + vkDestroySurfaceKHR(m_instance, surface, nullptr); VkAllocationCallbacks callbacks; callbacks.pUserData = nullptr;