|
|
|
@ -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) { |
|
|
|
|