Bläddra i källkod

Nvdrv: Correct Async regression and avoid signaling empty buffer vsyncs

Fernando Sahmkow 6 år sedan
förälder
incheckning
4e9f975935

+ 2 - 2
src/core/hle/service/nvdrv/nvdrv.cpp

@@ -40,8 +40,8 @@ Module::Module(Core::System& system) {
     auto& kernel = system.Kernel();
     auto& kernel = system.Kernel();
     for (u32 i = 0; i < MaxNvEvents; i++) {
     for (u32 i = 0; i < MaxNvEvents; i++) {
         std::string event_label = fmt::format("NVDRV::NvEvent_{}", i);
         std::string event_label = fmt::format("NVDRV::NvEvent_{}", i);
-        events_interface.events[i] = Kernel::WritableEvent::CreateEventPair(
-            kernel, Kernel::ResetType::Automatic, event_label);
+        events_interface.events[i] =
+            Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual, event_label);
         events_interface.status[i] = EventState::Free;
         events_interface.status[i] = EventState::Free;
         events_interface.registered[i] = false;
         events_interface.registered[i] = false;
     }
     }

+ 7 - 1
src/core/hle/service/nvflinger/nvflinger.cpp

@@ -170,8 +170,13 @@ const VI::Layer* NVFlinger::FindLayer(u64 display_id, u64 layer_id) const {
 
 
 void NVFlinger::Compose() {
 void NVFlinger::Compose() {
     for (auto& display : displays) {
     for (auto& display : displays) {
+        bool trigger_event = false;
         // Trigger vsync for this display at the end of drawing
         // Trigger vsync for this display at the end of drawing
-        SCOPE_EXIT({ display.SignalVSyncEvent(); });
+        SCOPE_EXIT({
+            if (trigger_event) {
+                display.SignalVSyncEvent();
+            }
+        });
 
 
         // Don't do anything for displays without layers.
         // Don't do anything for displays without layers.
         if (!display.HasLayers())
         if (!display.HasLayers())
@@ -194,6 +199,7 @@ void NVFlinger::Compose() {
         }
         }
 
 
         const auto& igbp_buffer = buffer->get().igbp_buffer;
         const auto& igbp_buffer = buffer->get().igbp_buffer;
+        trigger_event = true;
 
 
         // Now send the buffer to the GPU for drawing.
         // Now send the buffer to the GPU for drawing.
         // TODO(Subv): Support more than just disp0. The display device selection is probably based
         // TODO(Subv): Support more than just disp0. The display device selection is probably based