From 0a9d423eeb77c49e486513683ac8068e0b883bec Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Thu, 13 Mar 2025 00:39:01 +0100 Subject: [PATCH 1/3] adding hidden bindings --- runtime/Includes/Core/Graphics.h | 13 +++++ runtime/Includes/Core/Graphics.inl | 5 ++ runtime/Sources/Core/Bridge.cpp | 83 ++++++++++++++++++++++++++++++ runtime/Sources/Core/Graphics.cpp | 5 ++ 4 files changed, 106 insertions(+) diff --git a/runtime/Includes/Core/Graphics.h b/runtime/Includes/Core/Graphics.h index 7d51d1c..aac7e35 100644 --- a/runtime/Includes/Core/Graphics.h +++ b/runtime/Includes/Core/Graphics.h @@ -32,16 +32,29 @@ namespace mlx inline void TryEraseSpritesInScene(NonOwningPtr texture) noexcept; + inline void AddPreRenderHook(void(*f)(VkCommandBuffer, void*), void* param); + [[nodiscard]] MLX_FORCEINLINE bool HasWindow() const noexcept { return m_has_window; } [[nodiscard]] MLX_FORCEINLINE Renderer& GetRenderer() { return m_renderer; } [[nodiscard]] MLX_FORCEINLINE Scene& GetScene() { return *p_scene; } ~GraphicsSupport(); + private: + struct Hook + { + std::function fn; + void* param; + + Hook(std::function fn, void* param) : fn(fn), param(param) {} + }; + + private: Renderer m_renderer; SceneRenderer m_scene_renderer; PutPixelManager m_put_pixel_manager; + std::vector m_hooks; std::shared_ptr p_window; std::unique_ptr p_scene; diff --git a/runtime/Includes/Core/Graphics.inl b/runtime/Includes/Core/Graphics.inl index 6cb2c34..015c4f2 100644 --- a/runtime/Includes/Core/Graphics.inl +++ b/runtime/Includes/Core/Graphics.inl @@ -8,4 +8,9 @@ namespace mlx MLX_PROFILE_FUNCTION(); p_scene->TryEraseSpriteFromTexture(texture); } + + void GraphicsSupport::AddPreRenderHook(void(*f)(VkCommandBuffer, void*), void* param) + { + m_hooks.emplace_back(f, param); + } } diff --git a/runtime/Sources/Core/Bridge.cpp b/runtime/Sources/Core/Bridge.cpp index 3a2cd92..ff571b4 100644 --- a/runtime/Sources/Core/Bridge.cpp +++ b/runtime/Sources/Core/Bridge.cpp @@ -448,6 +448,18 @@ extern "C" return mlx::RenderCore::Get().GetDevice(); } + VkQueue mlx_get_vk_graphics_queue(mlx_context mlx) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + return kvfGetDeviceQueue(mlx::RenderCore::Get().GetDevice(), KVF_GRAPHICS_QUEUE); + } + + unsigned int mlx_get_vk_graphics_queue_family(mlx_context mlx) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + return kvfGetDeviceQueueFamily(mlx::RenderCore::Get().GetDevice(), KVF_GRAPHICS_QUEUE); + } + mlx_function mlx_get_vk_fn(const char* name) { #define MLX_VULKAN_GLOBAL_FUNCTION(fn) if(std::strcmp(name, #fn) == 0) return reinterpret_cast(mlx::RenderCore::Get().fn); @@ -461,6 +473,60 @@ extern "C" return nullptr; } + VkSurfaceKHR mlx_get_vk_surface(mlx_context mlx, mlx_window win) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return nullptr; + return gs->GetRenderer().GetSwapchain().GetSurface(); + } + + VkImage mlx_get_vk_swapchain_image(mlx_context mlx, mlx_window win, unsigned int index) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs || index > gs->GetRenderer().GetSwapchain().GetImagesCount()) + return nullptr; + return gs->GetRenderer().GetSwapchain().GetSwapchainImages()[index].Get(); + } + + VkImageView mlx_get_vk_swapchain_image_view(mlx_context mlx, mlx_window win, unsigned int index) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs || index > gs->GetRenderer().GetSwapchain().GetImagesCount()) + return nullptr; + return gs->GetRenderer().GetSwapchain().GetSwapchainImages()[index].GetImageView(); + } + + unsigned int mlx_get_current_vk_swapchain_image_index(mlx_context mlx, mlx_window win) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return -1; + return gs->GetRenderer().GetSwapchain().GetImageIndex(); + } + + VkExtent2D mlx_get_vk_swapchain_extent(mlx_context mlx, mlx_window win) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return {}; + return kvfGetSwapchainImagesSize(gs->GetRenderer().GetSwapchain().Get()); + } + + VkFormat mlx_get_vk_swapchain_format(mlx_context mlx, mlx_window win) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return VK_FORMAT_UNDEFINED; + return kvfGetSwapchainImagesFormat(gs->GetRenderer().GetSwapchain().Get()); + } + void* mlx_get_window_handle(mlx_context mlx, mlx_window win) { MLX_CHECK_APPLICATION_POINTER(mlx); @@ -470,6 +536,15 @@ extern "C" return mlx::SDLManager::Get().GetRawWindow(gs->GetWindow()->GetRawHandle()); } + void mlx_add_pre_render_hook(mlx_context mlx, mlx_window win, void(*f)(VkCommandBuffer, void*), void* param) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return; + gs->AddPreRenderHook(f, param); + } + mlx_function mlx_get_proc_addr(mlx_context mlx, const char* name) { MLX_CHECK_APPLICATION_POINTER(mlx); @@ -477,9 +552,17 @@ extern "C" std::unordered_map entries = { MLX_MAKE_ENTRY(mlx_get_vk_instance), MLX_MAKE_ENTRY(mlx_get_vk_physical_device), + MLX_MAKE_ENTRY(mlx_get_vk_graphics_queue), + MLX_MAKE_ENTRY(mlx_get_vk_graphics_queue_family), MLX_MAKE_ENTRY(mlx_get_vk_device), MLX_MAKE_ENTRY(mlx_get_vk_fn), MLX_MAKE_ENTRY(mlx_get_window_handle), + MLX_MAKE_ENTRY(mlx_get_vk_swapchain_extent), + MLX_MAKE_ENTRY(mlx_get_vk_swapchain_format), + MLX_MAKE_ENTRY(mlx_get_vk_swapchain_image), + MLX_MAKE_ENTRY(mlx_get_vk_swapchain_image_view), + MLX_MAKE_ENTRY(mlx_get_current_vk_swapchain_image_index), + MLX_MAKE_ENTRY(mlx_add_pre_render_hook), }; auto it = entries.find(std::string{ name }); if(it != entries.end()) diff --git a/runtime/Sources/Core/Graphics.cpp b/runtime/Sources/Core/Graphics.cpp index a4421c2..584b531 100644 --- a/runtime/Sources/Core/Graphics.cpp +++ b/runtime/Sources/Core/Graphics.cpp @@ -38,6 +38,11 @@ namespace mlx m_renderer.BeginFrame(); m_draw_layer = 0; m_scene_renderer.Render(*p_scene, m_renderer); + for(const auto& hook : m_hooks) + { + if(hook.fn) + hook.fn(m_renderer.GetActiveCommandBuffer(), hook.param); + } m_renderer.EndFrame(); #ifdef GRAPHICS_MEMORY_DUMP // Dump memory usage to file every two seconds From ff77f3bf9c1802181945247a343822fff4bcf271 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Thu, 13 Mar 2025 00:39:01 +0100 Subject: [PATCH 2/3] adding hidden bindings --- runtime/Includes/Core/Graphics.h | 13 +++++ runtime/Includes/Core/Graphics.inl | 5 ++ runtime/Sources/Core/Bridge.cpp | 83 ++++++++++++++++++++++++++++++ runtime/Sources/Core/Graphics.cpp | 5 ++ 4 files changed, 106 insertions(+) diff --git a/runtime/Includes/Core/Graphics.h b/runtime/Includes/Core/Graphics.h index 7d51d1c..aac7e35 100644 --- a/runtime/Includes/Core/Graphics.h +++ b/runtime/Includes/Core/Graphics.h @@ -32,16 +32,29 @@ namespace mlx inline void TryEraseSpritesInScene(NonOwningPtr texture) noexcept; + inline void AddPreRenderHook(void(*f)(VkCommandBuffer, void*), void* param); + [[nodiscard]] MLX_FORCEINLINE bool HasWindow() const noexcept { return m_has_window; } [[nodiscard]] MLX_FORCEINLINE Renderer& GetRenderer() { return m_renderer; } [[nodiscard]] MLX_FORCEINLINE Scene& GetScene() { return *p_scene; } ~GraphicsSupport(); + private: + struct Hook + { + std::function fn; + void* param; + + Hook(std::function fn, void* param) : fn(fn), param(param) {} + }; + + private: Renderer m_renderer; SceneRenderer m_scene_renderer; PutPixelManager m_put_pixel_manager; + std::vector m_hooks; std::shared_ptr p_window; std::unique_ptr p_scene; diff --git a/runtime/Includes/Core/Graphics.inl b/runtime/Includes/Core/Graphics.inl index 6cb2c34..015c4f2 100644 --- a/runtime/Includes/Core/Graphics.inl +++ b/runtime/Includes/Core/Graphics.inl @@ -8,4 +8,9 @@ namespace mlx MLX_PROFILE_FUNCTION(); p_scene->TryEraseSpriteFromTexture(texture); } + + void GraphicsSupport::AddPreRenderHook(void(*f)(VkCommandBuffer, void*), void* param) + { + m_hooks.emplace_back(f, param); + } } diff --git a/runtime/Sources/Core/Bridge.cpp b/runtime/Sources/Core/Bridge.cpp index 3a2cd92..ff571b4 100644 --- a/runtime/Sources/Core/Bridge.cpp +++ b/runtime/Sources/Core/Bridge.cpp @@ -448,6 +448,18 @@ extern "C" return mlx::RenderCore::Get().GetDevice(); } + VkQueue mlx_get_vk_graphics_queue(mlx_context mlx) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + return kvfGetDeviceQueue(mlx::RenderCore::Get().GetDevice(), KVF_GRAPHICS_QUEUE); + } + + unsigned int mlx_get_vk_graphics_queue_family(mlx_context mlx) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + return kvfGetDeviceQueueFamily(mlx::RenderCore::Get().GetDevice(), KVF_GRAPHICS_QUEUE); + } + mlx_function mlx_get_vk_fn(const char* name) { #define MLX_VULKAN_GLOBAL_FUNCTION(fn) if(std::strcmp(name, #fn) == 0) return reinterpret_cast(mlx::RenderCore::Get().fn); @@ -461,6 +473,60 @@ extern "C" return nullptr; } + VkSurfaceKHR mlx_get_vk_surface(mlx_context mlx, mlx_window win) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return nullptr; + return gs->GetRenderer().GetSwapchain().GetSurface(); + } + + VkImage mlx_get_vk_swapchain_image(mlx_context mlx, mlx_window win, unsigned int index) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs || index > gs->GetRenderer().GetSwapchain().GetImagesCount()) + return nullptr; + return gs->GetRenderer().GetSwapchain().GetSwapchainImages()[index].Get(); + } + + VkImageView mlx_get_vk_swapchain_image_view(mlx_context mlx, mlx_window win, unsigned int index) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs || index > gs->GetRenderer().GetSwapchain().GetImagesCount()) + return nullptr; + return gs->GetRenderer().GetSwapchain().GetSwapchainImages()[index].GetImageView(); + } + + unsigned int mlx_get_current_vk_swapchain_image_index(mlx_context mlx, mlx_window win) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return -1; + return gs->GetRenderer().GetSwapchain().GetImageIndex(); + } + + VkExtent2D mlx_get_vk_swapchain_extent(mlx_context mlx, mlx_window win) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return {}; + return kvfGetSwapchainImagesSize(gs->GetRenderer().GetSwapchain().Get()); + } + + VkFormat mlx_get_vk_swapchain_format(mlx_context mlx, mlx_window win) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return VK_FORMAT_UNDEFINED; + return kvfGetSwapchainImagesFormat(gs->GetRenderer().GetSwapchain().Get()); + } + void* mlx_get_window_handle(mlx_context mlx, mlx_window win) { MLX_CHECK_APPLICATION_POINTER(mlx); @@ -470,6 +536,15 @@ extern "C" return mlx::SDLManager::Get().GetRawWindow(gs->GetWindow()->GetRawHandle()); } + void mlx_add_pre_render_hook(mlx_context mlx, mlx_window win, void(*f)(VkCommandBuffer, void*), void* param) + { + MLX_CHECK_APPLICATION_POINTER(mlx); + mlx::NonOwningPtr gs = mlx->app->GetGraphicsSupport(win); + if(!gs) + return; + gs->AddPreRenderHook(f, param); + } + mlx_function mlx_get_proc_addr(mlx_context mlx, const char* name) { MLX_CHECK_APPLICATION_POINTER(mlx); @@ -477,9 +552,17 @@ extern "C" std::unordered_map entries = { MLX_MAKE_ENTRY(mlx_get_vk_instance), MLX_MAKE_ENTRY(mlx_get_vk_physical_device), + MLX_MAKE_ENTRY(mlx_get_vk_graphics_queue), + MLX_MAKE_ENTRY(mlx_get_vk_graphics_queue_family), MLX_MAKE_ENTRY(mlx_get_vk_device), MLX_MAKE_ENTRY(mlx_get_vk_fn), MLX_MAKE_ENTRY(mlx_get_window_handle), + MLX_MAKE_ENTRY(mlx_get_vk_swapchain_extent), + MLX_MAKE_ENTRY(mlx_get_vk_swapchain_format), + MLX_MAKE_ENTRY(mlx_get_vk_swapchain_image), + MLX_MAKE_ENTRY(mlx_get_vk_swapchain_image_view), + MLX_MAKE_ENTRY(mlx_get_current_vk_swapchain_image_index), + MLX_MAKE_ENTRY(mlx_add_pre_render_hook), }; auto it = entries.find(std::string{ name }); if(it != entries.end()) diff --git a/runtime/Sources/Core/Graphics.cpp b/runtime/Sources/Core/Graphics.cpp index a4421c2..584b531 100644 --- a/runtime/Sources/Core/Graphics.cpp +++ b/runtime/Sources/Core/Graphics.cpp @@ -38,6 +38,11 @@ namespace mlx m_renderer.BeginFrame(); m_draw_layer = 0; m_scene_renderer.Render(*p_scene, m_renderer); + for(const auto& hook : m_hooks) + { + if(hook.fn) + hook.fn(m_renderer.GetActiveCommandBuffer(), hook.param); + } m_renderer.EndFrame(); #ifdef GRAPHICS_MEMORY_DUMP // Dump memory usage to file every two seconds From 0c177eaaa749ab189f723a5186ceeb31082dc75e Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Thu, 13 Mar 2025 00:43:34 +0100 Subject: [PATCH 3/3] removing unnecessary mode in CIs --- .github/workflows/linux_clang.yml | 1 - .github/workflows/linux_gcc.yml | 1 - .github/workflows/macos_x86.yml | 1 - 3 files changed, 3 deletions(-) diff --git a/.github/workflows/linux_clang.yml b/.github/workflows/linux_clang.yml index 1300ead..1dba664 100644 --- a/.github/workflows/linux_clang.yml +++ b/.github/workflows/linux_clang.yml @@ -15,7 +15,6 @@ jobs: matrix: os: [ubuntu-24.04] arch: [x86_64] - mode: [release] runs-on: ${{ matrix.os }} if: "!contains(github.event.head_commit.message, 'ci skip')" diff --git a/.github/workflows/linux_gcc.yml b/.github/workflows/linux_gcc.yml index f676874..710c9ed 100644 --- a/.github/workflows/linux_gcc.yml +++ b/.github/workflows/linux_gcc.yml @@ -15,7 +15,6 @@ jobs: matrix: os: [ubuntu-24.04] arch: [x86_64] - mode: [release] runs-on: ${{ matrix.os }} if: "!contains(github.event.head_commit.message, 'ci skip')" diff --git a/.github/workflows/macos_x86.yml b/.github/workflows/macos_x86.yml index 80f8408..7906264 100644 --- a/.github/workflows/macos_x86.yml +++ b/.github/workflows/macos_x86.yml @@ -15,7 +15,6 @@ jobs: matrix: os: [macOS-latest] arch: [x86_64] - mode: [release] runs-on: ${{ matrix.os }} if: "!contains(github.event.head_commit.message, 'ci skip')"