// Copyright 2023 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include "Common/CommonTypes.h" class NativeVertexFormat; class AbstractTexture; class AbstractPipeline; namespace VideoCommon { class OnScreenUI { public: OnScreenUI() = default; ~OnScreenUI(); // ImGui initialization depends on being able to create textures and pipelines, so do it last. bool Initialize(u32 width, u32 height, float scale); // Returns a lock for the ImGui mutex, enabling data structures to be modified from outside. // Use with care, only non-drawing functions should be called from outside the video thread, // as the drawing is tied to a "frame". std::unique_lock GetImGuiLock(); bool IsReady() { return m_ready; } // Sets up ImGui state for the next frame. // This function itself acquires the ImGui lock, so it should not be held. void BeginImGuiFrame(u32 width, u32 height); // Same as above but without locking the ImGui lock. void BeginImGuiFrameUnlocked(u32 width, u32 height); // Renders ImGui windows to the currently-bound framebuffer. // Should be called with the ImGui lock held. void DrawImGui(); // Recompiles ImGui pipeline - call when stereo mode changes. bool RecompileImGuiPipeline(); void SetScale(float backbuffer_scale); void Finalize(); // Receive keyboard and mouse from QT void SetKeyMap(std::span> key_map); void SetKey(u32 key, bool is_down, const char* chars); void SetMousePos(float x, float y); void SetMousePress(u32 button_mask); private: // Destroys all ImGui GPU resources, must do before shutdown. void ShutdownImGui(); void DrawDebugText(); // ImGui resources. std::unique_ptr m_imgui_vertex_format; std::vector> m_imgui_textures; std::unique_ptr m_imgui_pipeline; std::mutex m_imgui_mutex; u64 m_imgui_last_frame_time; u32 m_backbuffer_width = 1; u32 m_backbuffer_height = 1; float m_backbuffer_scale = 1.0; bool m_ready = false; }; } // namespace VideoCommon