Преглед изворни кода

Nvdrv: Correct Async regression and avoid signaling empty buffer vsyncs

Fernando Sahmkow пре 6 година
родитељ
комит
4e9f975935
2 измењених фајлова са 9 додато и 3 уклоњено
  1. 2 2
      src/core/hle/service/nvdrv/nvdrv.cpp
  2. 7 1
      src/core/hle/service/nvflinger/nvflinger.cpp

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

@@ -40,8 +40,8 @@ Module::Module(Core::System& system) {
     auto& kernel = system.Kernel();
     for (u32 i = 0; i < MaxNvEvents; 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.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() {
     for (auto& display : displays) {
+        bool trigger_event = false;
         // 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.
         if (!display.HasLayers())
@@ -194,6 +199,7 @@ void NVFlinger::Compose() {
         }
 
         const auto& igbp_buffer = buffer->get().igbp_buffer;
+        trigger_event = true;
 
         // Now send the buffer to the GPU for drawing.
         // TODO(Subv): Support more than just disp0. The display device selection is probably based