Răsfoiți Sursa

frontend: qt: bootmanager: Acquire a shared context in main emu thread.

bunnei 6 ani în urmă
părinte
comite
c6f78a4a6d
2 a modificat fișierele cu 12 adăugiri și 12 ștergeri
  1. 5 10
      src/yuzu/bootmanager.cpp
  2. 7 2
      src/yuzu/bootmanager.h

+ 5 - 10
src/yuzu/bootmanager.cpp

@@ -39,7 +39,10 @@
 #include "yuzu/bootmanager.h"
 #include "yuzu/main.h"
 
-EmuThread::EmuThread(Core::Frontend::GraphicsContext& core_context) : core_context(core_context) {}
+EmuThread::EmuThread(GRenderWindow& window)
+    : shared_context{window.CreateSharedContext()},
+      context{(Settings::values.use_asynchronous_gpu_emulation && shared_context) ? *shared_context
+                                                                                  : window} {}
 
 EmuThread::~EmuThread() = default;
 
@@ -55,15 +58,7 @@ static GMainWindow* GetMainWindow() {
 void EmuThread::run() {
     MicroProfileOnThreadCreate("EmuThread");
 
-    // Acquire render context for duration of the thread if this is the rendering thread
-    if (!Settings::values.use_asynchronous_gpu_emulation) {
-        core_context.MakeCurrent();
-    }
-    SCOPE_EXIT({
-        if (!Settings::values.use_asynchronous_gpu_emulation) {
-            core_context.DoneCurrent();
-        }
-    });
+    Core::Frontend::ScopeAcquireContext acquire_context{context};
 
     emit LoadProgress(VideoCore::LoadCallbackStage::Prepare, 0, 0);
 

+ 7 - 2
src/yuzu/bootmanager.h

@@ -17,6 +17,7 @@
 #include "core/core.h"
 #include "core/frontend/emu_window.h"
 
+class GRenderWindow;
 class QKeyEvent;
 class QScreen;
 class QTouchEvent;
@@ -35,7 +36,7 @@ class EmuThread final : public QThread {
     Q_OBJECT
 
 public:
-    explicit EmuThread(Core::Frontend::GraphicsContext& context);
+    explicit EmuThread(GRenderWindow& window);
     ~EmuThread() override;
 
     /**
@@ -89,7 +90,11 @@ private:
     std::mutex running_mutex;
     std::condition_variable running_cv;
 
-    Core::Frontend::GraphicsContext& core_context;
+    /// Only used in asynchronous GPU mode
+    std::unique_ptr<Core::Frontend::GraphicsContext> shared_context;
+
+    /// This is shared_context in asynchronous GPU mode, core_context in synchronous GPU mode
+    Core::Frontend::GraphicsContext& context;
 
 signals:
     /**