[UI] Image post-processing and full presentation/window rework
[GPU] Add FXAA post-processing [UI] Add FidelityFX FSR and CAS post-processing [UI] Add blue noise dithering from 10bpc to 8bpc [GPU] Apply the DC PWL gamma ramp closer to the spec, supporting fully white color [UI] Allow the GPU CP thread to present on the host directly, bypassing the UI thread OS paint event [UI] Allow variable refresh rate (or tearing) [UI] Present the newest frame (restart) on DXGI [UI] Replace GraphicsContext with a far more advanced Presenter with more coherent surface connection and UI overlay state management [UI] Connect presentation to windows via the Surface class, not native window handles [Vulkan] Switch to simpler Vulkan setup with no instance/device separation due to interdependencies and to pass fewer objects around [Vulkan] Lower the minimum required Vulkan version to 1.0 [UI/GPU] Various cleanup, mainly ComPtr usage [UI] Support per-monitor DPI awareness v2 on Windows [UI] DPI-scale Dear ImGui [UI] Replace the remaining non-detachable window delegates with unified window event and input listeners [UI] Allow listeners to safely destroy or close the window, and to register/unregister listeners without use-after-free and the ABA problem [UI] Explicit Z ordering of input listeners and UI overlays, top-down for input, bottom-up for drawing [UI] Add explicit window lifecycle phases [UI] Replace Window virtual functions with explicit desired state, its application, actual state, its feedback [UI] GTK: Apply the initial size to the drawing area [UI] Limit internal UI frame rate to that of the monitor [UI] Hide the cursor using a timer instead of polling due to no repeated UI thread paints with GPU CP thread presentation, and only within the window
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2020 Ben Vanik. All rights reserved. *
|
||||
* Copyright 2022 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
@@ -32,6 +32,8 @@
|
||||
#include "xenia/kernel/xthread.h"
|
||||
#include "xenia/ui/graphics_provider.h"
|
||||
#include "xenia/ui/imgui_drawer.h"
|
||||
#include "xenia/ui/immediate_drawer.h"
|
||||
#include "xenia/ui/presenter.h"
|
||||
#include "xenia/ui/windowed_app_context.h"
|
||||
|
||||
DEFINE_bool(imgui_debug, false, "Show ImGui debugging tools.", "UI");
|
||||
@@ -49,14 +51,18 @@ using xe::ui::MenuItem;
|
||||
using xe::ui::MouseEvent;
|
||||
using xe::ui::UIEvent;
|
||||
|
||||
const std::string kBaseTitle = "Xenia Debugger";
|
||||
void DebugWindow::DebugDialog::OnDraw(ImGuiIO& io) {
|
||||
debug_window_.DrawFrame(io);
|
||||
}
|
||||
|
||||
static const std::string kBaseTitle = "Xenia Debugger";
|
||||
|
||||
DebugWindow::DebugWindow(Emulator* emulator,
|
||||
xe::ui::WindowedAppContext& app_context)
|
||||
: emulator_(emulator),
|
||||
processor_(emulator->processor()),
|
||||
app_context_(app_context),
|
||||
window_(xe::ui::Window::Create(app_context_, kBaseTitle)) {
|
||||
window_(xe::ui::Window::Create(app_context_, kBaseTitle, 1500, 1000)) {
|
||||
if (cs_open(CS_ARCH_X86, CS_MODE_64, &capstone_handle_) != CS_ERR_OK) {
|
||||
assert_always("Failed to initialize capstone");
|
||||
}
|
||||
@@ -86,44 +92,57 @@ std::unique_ptr<DebugWindow> DebugWindow::Create(
|
||||
}
|
||||
|
||||
bool DebugWindow::Initialize() {
|
||||
if (!window_->Initialize()) {
|
||||
XELOGE("Failed to initialize platform window");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Main menu.
|
||||
auto main_menu = MenuItem::Create(MenuItem::Type::kNormal);
|
||||
auto file_menu = MenuItem::Create(MenuItem::Type::kPopup, "&File");
|
||||
{
|
||||
file_menu->AddChild(MenuItem::Create(MenuItem::Type::kString, "&Close",
|
||||
"Alt+F4",
|
||||
[this]() { window_->Close(); }));
|
||||
file_menu->AddChild(
|
||||
MenuItem::Create(MenuItem::Type::kString, "&Close", "Alt+F4",
|
||||
[this]() { window_->RequestClose(); }));
|
||||
}
|
||||
main_menu->AddChild(std::move(file_menu));
|
||||
window_->set_main_menu(std::move(main_menu));
|
||||
window_->SetMainMenu(std::move(main_menu));
|
||||
|
||||
window_->Resize(1500, 1000);
|
||||
// Open the window once it's configured.
|
||||
if (!window_->Open()) {
|
||||
XELOGE("Failed to open the platform window for the debugger");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create the graphics context used for drawing.
|
||||
auto provider = emulator_->display_window()->context()->provider();
|
||||
window_->set_context(provider->CreateContext(window_.get()));
|
||||
// Setup drawing to the window.
|
||||
|
||||
// Enable imgui input.
|
||||
window_->set_imgui_input_enabled(true);
|
||||
xe::ui::GraphicsProvider& graphics_provider =
|
||||
*emulator_->graphics_system()->provider();
|
||||
|
||||
window_->on_painting.AddListener([this](UIEvent* e) { DrawFrame(); });
|
||||
presenter_ = graphics_provider.CreatePresenter();
|
||||
if (!presenter_) {
|
||||
XELOGE("Failed to initialize the presenter for the debugger");
|
||||
return false;
|
||||
}
|
||||
|
||||
immediate_drawer_ = graphics_provider.CreateImmediateDrawer();
|
||||
if (!immediate_drawer_) {
|
||||
XELOGE("Failed to initialize the immediate drawer for the debugger");
|
||||
return false;
|
||||
}
|
||||
immediate_drawer_->SetPresenter(presenter_.get());
|
||||
|
||||
imgui_drawer_ = std::make_unique<xe::ui::ImGuiDrawer>(window_.get(), 0);
|
||||
imgui_drawer_->SetPresenterAndImmediateDrawer(presenter_.get(),
|
||||
immediate_drawer_.get());
|
||||
debug_dialog_ =
|
||||
std::unique_ptr<DebugDialog>(new DebugDialog(imgui_drawer_.get(), *this));
|
||||
|
||||
// Update the cache before the first frame.
|
||||
UpdateCache();
|
||||
window_->Invalidate();
|
||||
|
||||
// Begin drawing.
|
||||
window_->SetPresenter(presenter_.get());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DebugWindow::DrawFrame() {
|
||||
xe::ui::GraphicsContextLock lock(window_->context());
|
||||
|
||||
auto& io = window_->imgui_drawer()->GetIO();
|
||||
|
||||
void DebugWindow::DrawFrame(ImGuiIO& io) {
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(-1, 0));
|
||||
ImGui::Begin("main_window", nullptr,
|
||||
ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize |
|
||||
@@ -242,9 +261,6 @@ void DebugWindow::DrawFrame() {
|
||||
ImGui::ShowDemoWindow();
|
||||
ImGui::ShowMetricsWindow();
|
||||
}
|
||||
|
||||
// Continuous paint.
|
||||
window_->Invalidate();
|
||||
}
|
||||
|
||||
void DebugWindow::DrawToolbar() {
|
||||
@@ -1443,7 +1459,7 @@ void DebugWindow::UpdateCache() {
|
||||
title += " (stepping)";
|
||||
break;
|
||||
}
|
||||
window_->set_title(title);
|
||||
window_->SetTitle(title);
|
||||
});
|
||||
|
||||
cache_.is_running =
|
||||
@@ -1573,7 +1589,7 @@ void DebugWindow::OnBreakpointHit(Breakpoint* breakpoint,
|
||||
}
|
||||
|
||||
void DebugWindow::Focus() const {
|
||||
app_context_.CallInUIThread([this]() { window_->set_focus(true); });
|
||||
app_context_.CallInUIThread([this]() { window_->Focus(); });
|
||||
}
|
||||
|
||||
} // namespace ui
|
||||
|
||||
Reference in New Issue
Block a user