Nvdrv: Correct Async regression and avoid signaling empty buffer vsyncs
This commit is contained in:
		
				
					committed by
					
						
						FernandoS27
					
				
			
			
				
	
			
			
			
						parent
						
							d633397883
						
					
				
				
					commit
					4e9f975935
				
			@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user