@@ -2013,6 +2013,35 @@ update_secondary_gpu_state_post_swap_buffers (CoglOnscreen *onscreen,
20132013 }
20142014}
20152015
2016+ static void
2017+ ensure_crtc_modes (CoglOnscreen * onscreen ,
2018+ MetaKmsUpdate * kms_update )
2019+ {
2020+ CoglOnscreenEGL * onscreen_egl = onscreen -> winsys ;
2021+ MetaOnscreenNative * onscreen_native = onscreen_egl -> platform ;
2022+ CoglContext * cogl_context = COGL_FRAMEBUFFER (onscreen )-> context ;
2023+ CoglRenderer * cogl_renderer = cogl_context -> display -> renderer ;
2024+ CoglRendererEGL * cogl_renderer_egl = cogl_renderer -> winsys ;
2025+ MetaRendererNativeGpuData * renderer_gpu_data = cogl_renderer_egl -> platform ;
2026+ MetaRendererNative * renderer_native = renderer_gpu_data -> renderer_native ;
2027+ MetaRenderer * renderer = META_RENDERER (renderer_native );
2028+ MetaBackend * backend = meta_renderer_get_backend (renderer );
2029+ MetaMonitorManager * monitor_manager =
2030+ meta_backend_get_monitor_manager (backend );
2031+ MetaPowerSave power_save_mode ;
2032+
2033+ power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager );
2034+ if (onscreen_native -> pending_set_crtc &&
2035+ power_save_mode == META_POWER_SAVE_ON )
2036+ {
2037+ meta_onscreen_native_set_crtc_mode (onscreen ,
2038+ renderer_gpu_data ,
2039+ kms_update );
2040+ onscreen_native -> pending_set_crtc = FALSE;
2041+ }
2042+ }
2043+
2044+
20162045static MetaKmsUpdate *
20172046unset_disabled_crtcs (MetaBackend * backend ,
20182047 MetaKms * kms )
@@ -2068,8 +2097,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
20682097 MetaRendererNative * renderer_native = renderer_gpu_data -> renderer_native ;
20692098 MetaRenderer * renderer = META_RENDERER (renderer_native );
20702099 MetaBackend * backend = meta_renderer_get_backend (renderer );
2071- MetaMonitorManager * monitor_manager =
2072- meta_backend_get_monitor_manager (backend );
20732100 MetaBackendNative * backend_native = META_BACKEND_NATIVE (backend );
20742101 MetaKms * kms = meta_backend_native_get_kms (backend_native );
20752102 CoglOnscreenEGL * onscreen_egl = onscreen -> winsys ;
@@ -2078,7 +2105,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
20782105 CoglFrameInfo * frame_info ;
20792106 gboolean egl_context_changed = FALSE;
20802107 MetaKmsUpdate * kms_update ;
2081- MetaPowerSave power_save_mode ;
20822108 g_autoptr (GError ) error = NULL ;
20832109 MetaDrmBufferGbm * buffer_gbm ;
20842110 g_autoptr (MetaKmsFeedback ) kms_feedback = NULL ;
@@ -2137,18 +2163,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
21372163
21382164 update_secondary_gpu_state_post_swap_buffers (onscreen , & egl_context_changed );
21392165
2140- /* If this is the first framebuffer to be presented then we now setup the
2141- * crtc modes, else we flip from the previous buffer */
2142-
2143- power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager );
2144- if (onscreen_native -> pending_set_crtc &&
2145- power_save_mode == META_POWER_SAVE_ON )
2146- {
2147- meta_onscreen_native_set_crtc_mode (onscreen ,
2148- renderer_gpu_data ,
2149- kms_update );
2150- onscreen_native -> pending_set_crtc = FALSE;
2151- }
2166+ ensure_crtc_modes (onscreen , kms_update );
21522167
21532168 onscreen_native -> pending_queue_swap_notify_frame_count = renderer_native -> frame_counter ;
21542169 meta_onscreen_native_flip_crtcs (onscreen , kms_update );
@@ -2239,6 +2254,50 @@ meta_renderer_native_create_dma_buf (CoglRenderer *cogl_renderer,
22392254 return NULL ;
22402255}
22412256
2257+ static void
2258+ meta_onscreen_native_direct_scanout (CoglOnscreen * onscreen ,
2259+ CoglScanout * scanout )
2260+ {
2261+ CoglOnscreenEGL * onscreen_egl = onscreen -> winsys ;
2262+ MetaOnscreenNative * onscreen_native = onscreen_egl -> platform ;
2263+ MetaGpuKms * render_gpu = onscreen_native -> render_gpu ;
2264+ CoglContext * cogl_context = COGL_FRAMEBUFFER (onscreen )-> context ;
2265+ CoglRenderer * cogl_renderer = cogl_context -> display -> renderer ;
2266+ CoglRendererEGL * cogl_renderer_egl = cogl_renderer -> winsys ;
2267+ MetaRendererNativeGpuData * renderer_gpu_data = cogl_renderer_egl -> platform ;
2268+ MetaRendererNative * renderer_native = renderer_gpu_data -> renderer_native ;
2269+ MetaRenderer * renderer = META_RENDERER (renderer_native );
2270+ MetaBackend * backend = meta_renderer_get_backend (renderer );
2271+ MetaBackendNative * backend_native = META_BACKEND_NATIVE (backend );
2272+ MetaKms * kms = meta_backend_native_get_kms (backend_native );
2273+ CoglFrameInfo * frame_info ;
2274+ MetaKmsUpdate * kms_update ;
2275+ g_autoptr (GError ) error = NULL ;
2276+
2277+ kms_update = meta_kms_ensure_pending_update (kms );
2278+
2279+ wait_for_pending_flips (onscreen );
2280+
2281+ frame_info = g_queue_peek_tail (& onscreen -> pending_frame_infos );
2282+ frame_info -> global_frame_counter = renderer_native -> frame_counter ;
2283+
2284+ renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native ,
2285+ render_gpu );
2286+
2287+ g_return_if_fail (renderer_gpu_data -> mode == META_RENDERER_NATIVE_MODE_GBM );
2288+
2289+ g_warn_if_fail (!onscreen_native -> gbm .next_fb );
2290+ g_set_object (& onscreen_native -> gbm .next_fb , META_DRM_BUFFER (scanout ));
2291+
2292+ ensure_crtc_modes (onscreen , kms_update );
2293+
2294+ onscreen_native -> pending_queue_swap_notify_frame_count =
2295+ renderer_native -> frame_counter ;
2296+ meta_onscreen_native_flip_crtcs (onscreen , kms_update );
2297+
2298+ meta_kms_post_pending_update_sync (kms );
2299+ }
2300+
22422301static gboolean
22432302meta_renderer_native_init_egl_context (CoglContext * cogl_context ,
22442303 GError * * error )
@@ -2962,6 +3021,7 @@ get_native_cogl_winsys_vtable (CoglRenderer *cogl_renderer)
29623021 vtable .onscreen_swap_region = NULL ;
29633022 vtable .onscreen_swap_buffers_with_damage =
29643023 meta_onscreen_native_swap_buffers_with_damage ;
3024+ vtable .onscreen_direct_scanout = meta_onscreen_native_direct_scanout ;
29653025
29663026 vtable .context_get_clock_time = meta_renderer_native_get_clock_time ;
29673027
0 commit comments