#include #include namespace mlx { GraphicsSupport::GraphicsSupport([[maybe_unused]] std::size_t w, [[maybe_unused]] std::size_t h, NonOwningPtr render_target, int id) : m_put_pixel_manager(&m_renderer), p_window(nullptr), m_id(id), m_has_window(false) { MLX_PROFILE_FUNCTION(); // TODO : re-enable render targets m_renderer.Init(nullptr); m_scene_renderer.Init(m_renderer); SceneDescriptor descriptor{}; descriptor.renderer = &m_renderer; p_scene = std::make_unique(std::move(descriptor)); } GraphicsSupport::GraphicsSupport(std::size_t w, std::size_t h, std::string title, int id) : m_put_pixel_manager(&m_renderer), p_window(std::make_shared(w, h, title)), m_id(id), m_has_window(true) { MLX_PROFILE_FUNCTION(); m_renderer.Init(p_window.get()); m_scene_renderer.Init(m_renderer); SceneDescriptor descriptor{}; descriptor.renderer = &m_renderer; p_scene = std::make_unique(std::move(descriptor)); } void GraphicsSupport::Render() noexcept { MLX_PROFILE_FUNCTION(); if(m_renderer.BeginFrame()) { m_scene_renderer.Render(*p_scene, m_renderer); m_renderer.EndFrame(); } #ifdef GRAPHICS_MEMORY_DUMP // dump memory to file every two seconds using namespace std::chrono_literals; static std::int64_t timer = static_cast(std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count()); if(std::chrono::duration{static_cast(std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count()) - timer} >= 1s) { RenderCore::Get().GetAllocator().DumpMemoryToJson(); timer = static_cast(std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count()); } #endif } GraphicsSupport::~GraphicsSupport() { MLX_PROFILE_FUNCTION(); RenderCore::Get().WaitDeviceIdle(); p_scene.reset(); m_scene_renderer.Destroy(); m_renderer.Destroy(); if(p_window) p_window->Destroy(); } }