mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Nvdrv: Correct Async regression and avoid signaling empty buffer vsyncs
This commit is contained in:
		
							parent
							
								
									d633397883
								
							
						
					
					
						commit
						4e9f975935
					
				@ -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(
 | 
					        events_interface.events[i] =
 | 
				
			||||||
            kernel, Kernel::ResetType::Automatic, event_label);
 | 
					            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;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user