From 0ce52b1da2228f3325d94e52bead7335c8b07d1c Mon Sep 17 00:00:00 2001
From: Subv <subv2112@gmail.com>
Date: Sat, 24 Mar 2018 23:35:06 -0500
Subject: [PATCH] GPU: Make the debug_context variable a member of the frontend
 instead of a global.

---
 src/core/core.h                               | 11 +++++++++
 src/video_core/debug_utils/debug_utils.cpp    |  2 --
 src/video_core/debug_utils/debug_utils.h      |  2 --
 src/video_core/engines/maxwell_3d.cpp         | 24 ++++++++++---------
 .../debugger/graphics/graphics_surface.cpp    |  5 +++-
 src/yuzu/main.cpp                             |  9 ++++---
 src/yuzu/main.h                               |  6 +++++
 7 files changed, 40 insertions(+), 19 deletions(-)

diff --git a/src/core/core.h b/src/core/core.h
index 552c8f5eee..ade456cfc9 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -13,6 +13,7 @@
 #include "core/memory.h"
 #include "core/perf_stats.h"
 #include "core/telemetry_session.h"
+#include "video_core/debug_utils/debug_utils.h"
 #include "video_core/gpu.h"
 
 class EmuWindow;
@@ -135,6 +136,14 @@ public:
         return *app_loader;
     }
 
+    void SetGPUDebugContext(std::shared_ptr<Tegra::DebugContext> context) {
+        debug_context = std::move(context);
+    }
+
+    std::shared_ptr<Tegra::DebugContext> GetGPUDebugContext() const {
+        return debug_context;
+    }
+
 private:
     /**
      * Initialize the emulated system.
@@ -154,6 +163,8 @@ private:
     std::unique_ptr<Kernel::Scheduler> scheduler;
     std::unique_ptr<Tegra::GPU> gpu_core;
 
+    std::shared_ptr<Tegra::DebugContext> debug_context;
+
     Kernel::SharedPtr<Kernel::Process> current_process;
 
     /// When true, signals that a reschedule should happen
diff --git a/src/video_core/debug_utils/debug_utils.cpp b/src/video_core/debug_utils/debug_utils.cpp
index 73fd4d7a3b..22d44aab29 100644
--- a/src/video_core/debug_utils/debug_utils.cpp
+++ b/src/video_core/debug_utils/debug_utils.cpp
@@ -23,8 +23,6 @@
 
 namespace Tegra {
 
-std::shared_ptr<DebugContext> g_debug_context;
-
 void DebugContext::DoOnEvent(Event event, void* data) {
     {
         std::unique_lock<std::mutex> lock(breakpoint_mutex);
diff --git a/src/video_core/debug_utils/debug_utils.h b/src/video_core/debug_utils/debug_utils.h
index 98461d6d9e..bbba8e3807 100644
--- a/src/video_core/debug_utils/debug_utils.h
+++ b/src/video_core/debug_utils/debug_utils.h
@@ -160,6 +160,4 @@ private:
     std::list<BreakPointObserver*> breakpoint_observers;
 };
 
-extern std::shared_ptr<DebugContext> g_debug_context;
-
 } // namespace Tegra
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index c962887ca1..986165c6da 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -4,6 +4,7 @@
 
 #include <cinttypes>
 #include "common/assert.h"
+#include "core/core.h"
 #include "video_core/debug_utils/debug_utils.h"
 #include "video_core/engines/maxwell_3d.h"
 #include "video_core/textures/decoders.h"
@@ -50,6 +51,8 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) {
     ASSERT_MSG(method < Regs::NUM_REGS,
                "Invalid Maxwell3D register, increase the size of the Regs structure");
 
+    auto debug_context = Core::System::GetInstance().GetGPUDebugContext();
+
     // It is an error to write to a register other than the current macro's ARG register before it
     // has finished execution.
     if (executing_macro != 0) {
@@ -76,8 +79,8 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) {
         return;
     }
 
-    if (Tegra::g_debug_context) {
-        Tegra::g_debug_context->OnEvent(Tegra::DebugContext::Event::MaxwellCommandLoaded, nullptr);
+    if (debug_context) {
+        debug_context->OnEvent(Tegra::DebugContext::Event::MaxwellCommandLoaded, nullptr);
     }
 
     regs.reg_array[method] = value;
@@ -146,9 +149,8 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) {
 
 #undef MAXWELL3D_REG_INDEX
 
-    if (Tegra::g_debug_context) {
-        Tegra::g_debug_context->OnEvent(Tegra::DebugContext::Event::MaxwellCommandProcessed,
-                                        nullptr);
+    if (debug_context) {
+        debug_context->OnEvent(Tegra::DebugContext::Event::MaxwellCommandProcessed, nullptr);
     }
 }
 
@@ -173,14 +175,14 @@ void Maxwell3D::ProcessQueryGet() {
 
 void Maxwell3D::DrawArrays() {
     LOG_WARNING(HW_GPU, "Game requested a DrawArrays, ignoring");
-    if (Tegra::g_debug_context) {
-        Tegra::g_debug_context->OnEvent(Tegra::DebugContext::Event::IncomingPrimitiveBatch,
-                                        nullptr);
+    auto debug_context = Core::System::GetInstance().GetGPUDebugContext();
+
+    if (debug_context) {
+        debug_context->OnEvent(Tegra::DebugContext::Event::IncomingPrimitiveBatch, nullptr);
     }
 
-    if (Tegra::g_debug_context) {
-        Tegra::g_debug_context->OnEvent(Tegra::DebugContext::Event::FinishedPrimitiveBatch,
-                                        nullptr);
+    if (debug_context) {
+        debug_context->OnEvent(Tegra::DebugContext::Event::FinishedPrimitiveBatch, nullptr);
     }
 }
 
diff --git a/src/yuzu/debugger/graphics/graphics_surface.cpp b/src/yuzu/debugger/graphics/graphics_surface.cpp
index d061013da6..8e6509adc5 100644
--- a/src/yuzu/debugger/graphics/graphics_surface.cpp
+++ b/src/yuzu/debugger/graphics/graphics_surface.cpp
@@ -341,7 +341,10 @@ void GraphicsSurfaceWidget::OnUpdate() {
         surface_address = rt.Address();
         surface_width = rt.horiz;
         surface_height = rt.vert;
-        surface_format = ConvertToTextureFormat(static_cast<Tegra::RenderTargetFormat>(rt.format));
+        if (rt.format != 0) {
+            surface_format =
+                ConvertToTextureFormat(static_cast<Tegra::RenderTargetFormat>(rt.format));
+        }
 
         break;
     }
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index b8c23ae156..bd323870b7 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -25,6 +25,7 @@
 #include "core/gdbstub/gdbstub.h"
 #include "core/loader/loader.h"
 #include "core/settings.h"
+#include "video_core/debug_utils/debug_utils.h"
 #include "yuzu/about_dialog.h"
 #include "yuzu/bootmanager.h"
 #include "yuzu/configuration/config.h"
@@ -71,7 +72,7 @@ void GMainWindow::ShowCallouts() {}
 
 GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
 
-    Tegra::g_debug_context = Tegra::DebugContext::Construct();
+    debug_context = Tegra::DebugContext::Construct();
 
     setAcceptDrops(true);
     ui.setupUi(this);
@@ -165,12 +166,12 @@ void GMainWindow::InitializeDebugWidgets() {
     connect(this, &GMainWindow::EmulationStopping, registersWidget,
             &RegistersWidget::OnEmulationStopping);
 
-    graphicsBreakpointsWidget = new GraphicsBreakPointsWidget(Tegra::g_debug_context, this);
+    graphicsBreakpointsWidget = new GraphicsBreakPointsWidget(debug_context, this);
     addDockWidget(Qt::RightDockWidgetArea, graphicsBreakpointsWidget);
     graphicsBreakpointsWidget->hide();
     debug_menu->addAction(graphicsBreakpointsWidget->toggleViewAction());
 
-    graphicsSurfaceWidget = new GraphicsSurfaceWidget(Tegra::g_debug_context, this);
+    graphicsSurfaceWidget = new GraphicsSurfaceWidget(debug_context, this);
     addDockWidget(Qt::RightDockWidgetArea, graphicsSurfaceWidget);
     graphicsSurfaceWidget->hide();
     debug_menu->addAction(graphicsSurfaceWidget->toggleViewAction());
@@ -339,6 +340,8 @@ bool GMainWindow::LoadROM(const QString& filename) {
 
     Core::System& system{Core::System::GetInstance()};
 
+    system.SetGPUDebugContext(debug_context);
+
     const Core::System::ResultStatus result{system.Load(render_window, filename.toStdString())};
 
     Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "Qt");
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index 0f89607c8c..2471caf839 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -23,6 +23,10 @@ class ProfilerWidget;
 class RegistersWidget;
 class WaitTreeWidget;
 
+namespace Tegra {
+class DebugContext;
+}
+
 class GMainWindow : public QMainWindow {
     Q_OBJECT
 
@@ -135,6 +139,8 @@ private:
 
     Ui::MainWindow ui;
 
+    std::shared_ptr<Tegra::DebugContext> debug_context;
+
     GRenderWindow* render_window;
     GameList* game_list;
 
-- 
GitLab