diff options
| author | Liam <byteslice@airmail.cc> | 2023-10-29 23:38:24 -0400 |
|---|---|---|
| committer | Liam <byteslice@airmail.cc> | 2023-10-29 23:38:24 -0400 |
| commit | a872030a351cc50293e6bf0793fe70041cee0098 (patch) | |
| tree | 5e88267716394ccd2d15379a02e69d74bd371916 /src/core/hle/service/nvnflinger/nvnflinger.cpp | |
| parent | adb090090605d3b1f4368fb0c7bc836206aa4bdf (diff) | |
nvnflinger: implement consumer abandonment
Diffstat (limited to 'src/core/hle/service/nvnflinger/nvnflinger.cpp')
| -rw-r--r-- | src/core/hle/service/nvnflinger/nvnflinger.cpp | 22 |
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) { |
