87 lines
2.4 KiB
C++
87 lines
2.4 KiB
C++
// Copyright 2023 Dolphin Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <span>
|
|
#include <vector>
|
|
|
|
#include "Common/CommonTypes.h"
|
|
#include "VideoCommon/OnScreenUIKeyMap.h"
|
|
|
|
class NativeVertexFormat;
|
|
class AbstractTexture;
|
|
class AbstractPipeline;
|
|
|
|
namespace VideoCommon
|
|
{
|
|
// OnScreenUI handles all the ImGui rendering.
|
|
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<std::mutex> 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(const DolphinKeyMap& key_map);
|
|
void SetKey(u32 key, bool is_down, const char* chars);
|
|
void SetMousePos(float x, float y);
|
|
void SetMousePress(u32 button_mask);
|
|
|
|
private:
|
|
void DrawDebugText();
|
|
#ifdef USE_RETRO_ACHIEVEMENTS
|
|
void DrawChallengesAndLeaderboards();
|
|
#endif // USE_RETRO_ACHIEVEMENTS
|
|
|
|
// ImGui resources.
|
|
std::unique_ptr<NativeVertexFormat> m_imgui_vertex_format;
|
|
std::vector<std::unique_ptr<AbstractTexture>> m_imgui_textures;
|
|
std::unique_ptr<AbstractPipeline> m_imgui_pipeline;
|
|
std::map<u32, int> m_dolphin_to_imgui_map;
|
|
std::mutex m_imgui_mutex;
|
|
u64 m_imgui_last_frame_time = 0;
|
|
|
|
u32 m_backbuffer_width = 1;
|
|
u32 m_backbuffer_height = 1;
|
|
float m_backbuffer_scale = 1.0;
|
|
|
|
#ifdef USE_RETRO_ACHIEVEMENTS
|
|
std::map<std::string, std::unique_ptr<AbstractTexture>, std::less<>> m_challenge_texture_map;
|
|
#endif // USE_RETRO_ACHIEVEMENTS
|
|
|
|
bool m_ready = false;
|
|
};
|
|
} // namespace VideoCommon
|