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