nvnflinger: check for layers before compose
This commit is contained in:
		@@ -44,6 +44,10 @@ struct Display {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool HasLayers() {
 | 
			
		||||
        return !stack.layers.empty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    u64 id;
 | 
			
		||||
    LayerStack stack;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -33,16 +33,17 @@ void SurfaceFlinger::RemoveDisplay(u64 display_id) {
 | 
			
		||||
    std::erase_if(m_displays, [&](auto& display) { return display.id == display_id; });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SurfaceFlinger::ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale,
 | 
			
		||||
bool SurfaceFlinger::ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale,
 | 
			
		||||
                                    u64 display_id) {
 | 
			
		||||
    auto* const display = this->FindDisplay(display_id);
 | 
			
		||||
    if (!display) {
 | 
			
		||||
        return;
 | 
			
		||||
    if (!display || !display->HasLayers()) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *out_swap_interval =
 | 
			
		||||
        m_composer.ComposeLocked(out_compose_speed_scale, *display,
 | 
			
		||||
                                 *nvdrv->GetDevice<Nvidia::Devices::nvdisp_disp0>(disp_fd));
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SurfaceFlinger::AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id) {
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    void AddDisplay(u64 display_id);
 | 
			
		||||
    void RemoveDisplay(u64 display_id);
 | 
			
		||||
    void ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id);
 | 
			
		||||
    bool ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id);
 | 
			
		||||
 | 
			
		||||
    void AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id);
 | 
			
		||||
    void RemoveLayerFromDisplayStack(u64 display_id, s32 consumer_binder_id);
 | 
			
		||||
 
 | 
			
		||||
@@ -218,10 +218,11 @@ void Container::DestroyBufferQueueLocked(Layer* layer) {
 | 
			
		||||
                                          layer->GetProducerBinderId());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Container::ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale,
 | 
			
		||||
bool Container::ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale,
 | 
			
		||||
                                 u64 display_id) {
 | 
			
		||||
    std::scoped_lock lk{m_lock};
 | 
			
		||||
    m_surface_flinger->ComposeDisplay(out_swap_interval, out_compose_speed_scale, display_id);
 | 
			
		||||
    return m_surface_flinger->ComposeDisplay(out_swap_interval, out_compose_speed_scale,
 | 
			
		||||
                                             display_id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Service::VI
 | 
			
		||||
 
 | 
			
		||||
@@ -76,7 +76,7 @@ private:
 | 
			
		||||
    void DestroyBufferQueueLocked(Layer* layer);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    void ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id);
 | 
			
		||||
    bool ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::mutex m_lock{};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user