| // dear imgui: Renderer Backend for Metal 4 |
| // This needs to be used along with a Platform Backend (e.g. OSX) |
| // Metal 4 requires Apple Silicon and macOS 26+. |
| |
| // Implemented features: |
| // [X] Renderer: User texture binding. Use 'MTLTexture.gpuResourceID' as texture identifier. Read the FAQ about ImTextureID/ImTextureRef! |
| // [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset). |
| // [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures). |
| // Missing features or Issues: |
| // [ ] Texture view pool support? Reevaluate which type to use for ImtextureID. |
| |
| // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. |
| // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. |
| // Learn about Dear ImGui: |
| // - FAQ https://dearimgui.com/faq |
| // - Getting Started https://dearimgui.com/getting-started |
| // - Documentation https://dearimgui.com/docs (same as your local docs/ folder). |
| // - Introduction, links and more at the top of imgui.cpp |
| |
| #pragma once |
| #include "imgui.h" // IMGUI_IMPL_API |
| #ifndef IMGUI_DISABLE |
| |
| //----------------------------------------------------------------------------- |
| // ObjC API |
| //----------------------------------------------------------------------------- |
| |
| #ifdef __OBJC__ |
| |
| @class MTL4RenderPassDescriptor; |
| @protocol MTLDevice, MTL4CommandBuffer, MTL4RenderCommandEncoder, MTL4CommandQueue; |
| |
| // framesInFlight must match the number of frames your application keeps in flight (e.g. the size of your own |
| // command buffer/allocator ring). The backend uses it to size its own per-frame-in-flight resources (constant |
| // buffer, vertex/index buffer cache) so the CPU never overwrites a slot the GPU may still be reading. |
| // Follow "Getting Started" link and check examples/ folder to learn about using backends! |
| IMGUI_IMPL_API bool ImGui_ImplMetal4_Init(id<MTLDevice> device, id<MTL4CommandQueue> commandQueue, int framesInFlight); |
| IMGUI_IMPL_API void ImGui_ImplMetal4_Shutdown(); |
| // frameInFlightIndex must match the slot you use to index your own per-frame-in-flight resources |
| // (e.g. the same index used to pick your command buffer/allocator), and must be < framesInFlight passed to Init(). |
| IMGUI_IMPL_API void ImGui_ImplMetal4_NewFrame(MTL4RenderPassDescriptor* renderPassDescriptor, int frameInFlightIndex); |
| IMGUI_IMPL_API void ImGui_ImplMetal4_RenderDrawData(ImDrawData* drawData, |
| id<MTL4CommandBuffer> commandBuffer, |
| id<MTL4RenderCommandEncoder> commandEncoder); |
| |
| // Called by Init/NewFrame/Shutdown |
| IMGUI_IMPL_API bool ImGui_ImplMetal4_CreateDeviceObjects(id<MTLDevice> device); |
| IMGUI_IMPL_API void ImGui_ImplMetal4_DestroyDeviceObjects(); |
| |
| // (Advanced) Use e.g. if you need to precisely control the timing of texture updates (e.g. for staged rendering), by setting ImDrawData::Textures = nullptr to handle this manually. |
| IMGUI_IMPL_API void ImGui_ImplMetal4_UpdateTexture(ImTextureData* tex); |
| |
| #endif |
| |
| //----------------------------------------------------------------------------- |
| // C++ API |
| //----------------------------------------------------------------------------- |
| |
| // Enable Metal C++ binding support with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file |
| // More info about using Metal from C++: https://developer.apple.com/metal/cpp/ |
| |
| #ifdef IMGUI_IMPL_METAL_CPP |
| #ifndef __OBJC__ |
| |
| // Forward declare relevant classes from the MTL and MTL4 namespace |
| namespace MTL { class Device; } |
| namespace MTL4 { class CommandQueue; class CommandBuffer; class RenderPassDescriptor; class RenderCommandEncoder; } |
| |
| // Follow "Getting Started" link and check examples/ folder to learn about using backends! |
| IMGUI_IMPL_API bool ImGui_ImplMetal4_Init(MTL::Device* device, MTL4::CommandQueue* commandQueue, int framesInFlight); |
| IMGUI_IMPL_API void ImGui_ImplMetal4_Shutdown(); |
| IMGUI_IMPL_API void ImGui_ImplMetal4_NewFrame(MTL4::RenderPassDescriptor* renderPassDescriptor, int frameInFlightIndex); |
| IMGUI_IMPL_API void ImGui_ImplMetal4_RenderDrawData(ImDrawData* draw_data, |
| MTL4::CommandBuffer* commandBuffer, |
| MTL4::RenderCommandEncoder* commandEncoder); |
| |
| // Called by Init/NewFrame/Shutdown |
| IMGUI_IMPL_API bool ImGui_ImplMetal4_CreateDeviceObjects(MTL::Device* device); |
| IMGUI_IMPL_API void ImGui_ImplMetal4_DestroyDeviceObjects(); |
| |
| // (Advanced) Use e.g. if you need to precisely control the timing of texture updates (e.g. for staged rendering), by setting ImDrawData::Textures = nullptr to handle this manually. |
| IMGUI_IMPL_API void ImGui_ImplMetal4_UpdateTexture(ImTextureData* tex); |
| |
| #endif |
| #endif |
| |
| //----------------------------------------------------------------------------- |
| |
| #endif // #ifndef IMGUI_DISABLE |