summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/nvnflinger/nvnflinger.cpp
diff options
context:
space:
mode:
authorliamwhite <liamwhite@users.noreply.github.com>2023-11-18 02:41:23 +0100
committerGitHub <noreply@github.com>2023-11-18 02:41:23 +0100
commit6c64d5aff29c004fbc6c7fd4657e8868144d5283 (patch)
tree5c283caec0d5f680b8d609b1375259a5ae5a5a3d /src/core/hle/service/nvnflinger/nvnflinger.cpp
parentMerge pull request #12055 from german77/activate (diff)
parentnvnflinger: implement consumer abandonment (diff)
downloadyuzu-6c64d5aff29c004fbc6c7fd4657e8868144d5283.tar
yuzu-6c64d5aff29c004fbc6c7fd4657e8868144d5283.tar.gz
yuzu-6c64d5aff29c004fbc6c7fd4657e8868144d5283.tar.bz2
yuzu-6c64d5aff29c004fbc6c7fd4657e8868144d5283.tar.lz
yuzu-6c64d5aff29c004fbc6c7fd4657e8868144d5283.tar.xz
yuzu-6c64d5aff29c004fbc6c7fd4657e8868144d5283.tar.zst
yuzu-6c64d5aff29c004fbc6c7fd4657e8868144d5283.zip
Diffstat (limited to 'src/core/hle/service/nvnflinger/nvnflinger.cpp')
-rw-r--r--src/core/hle/service/nvnflinger/nvnflinger.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/core/hle/service/nvnflinger/nvnflinger.cpp b/src/core/hle/service/nvnflinger/nvnflinger.cpp
index bebb45eae..0745434c5 100644
--- a/src/core/hle/service/nvnflinger/nvnflinger.cpp
+++ b/src/core/hle/service/nvnflinger/nvnflinger.cpp
@@ -47,7 +47,10 @@ void Nvnflinger::SplitVSync(std::stop_token stop_token) {
vsync_signal.Wait();
const auto lock_guard = Lock();
- Compose();
+
+ if (!is_abandoned) {
+ Compose();
+ }
}
}
@@ -98,7 +101,6 @@ Nvnflinger::~Nvnflinger() {
}
ShutdownLayers();
- vsync_thread = {};
if (nvdrv) {
nvdrv->Close(disp_fd);
@@ -106,12 +108,20 @@ Nvnflinger::~Nvnflinger() {
}
void Nvnflinger::ShutdownLayers() {
- const auto lock_guard = Lock();
- for (auto& display : displays) {
- for (size_t layer = 0; layer < display.GetNumLayers(); ++layer) {
- display.GetLayer(layer).Core().NotifyShutdown();
+ // Abandon consumers.
+ {
+ const auto lock_guard = Lock();
+ for (auto& display : displays) {
+ for (size_t layer = 0; layer < display.GetNumLayers(); ++layer) {
+ display.GetLayer(layer).GetConsumer().Abandon();
+ }
}
+
+ is_abandoned = true;
}
+
+ // Join the vsync thread, if it exists.
+ vsync_thread = {};
}
void Nvnflinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) {