diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c index 2ceaa5f1c..705ec7ab2 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -138,6 +138,9 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native, static GQuark blit_source_quark = 0; +static void +post_next_frame (CoglOnscreen *onscreen); + static gboolean init_secondary_gpu_state (MetaRendererNative *renderer_native, CoglOnscreen *onscreen, @@ -1394,30 +1397,20 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys; MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform; MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native; - MetaRenderer *renderer = META_RENDERER (renderer_native); - MetaBackend *backend = meta_renderer_get_backend (renderer); - MetaMonitorManager *monitor_manager = - meta_backend_get_monitor_manager (backend); MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state; MetaGpuKms *render_gpu = onscreen_native->render_gpu; MetaDeviceFile *render_device_file; ClutterFrame *frame = user_data; MetaFrameNative *frame_native = meta_frame_native_from_frame (frame); - MetaKmsUpdate *kms_update; CoglOnscreenClass *parent_class; gboolean secondary_gpu_used = FALSE; - MetaPowerSave power_save_mode; g_autoptr (GError) error = NULL; MetaDrmBufferFlags buffer_flags; MetaDrmBufferGbm *buffer_gbm; g_autoptr (MetaDrmBuffer) primary_gpu_fb = NULL; g_autoptr (MetaDrmBuffer) secondary_gpu_fb = NULL; g_autoptr (MetaDrmBuffer) buffer = NULL; - MetaKmsCrtc *kms_crtc; - MetaKmsDevice *kms_device; - - COGL_TRACE_SCOPED_ANCHOR (MetaRendererNativePostKmsUpdate); COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeSwapBuffers, "Meta::OnscreenNative::swap_buffers_with_damage()"); @@ -1506,6 +1499,50 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_PENDING_PRESENTED); + meta_frame_native_set_damage (frame_native, region); + + if (!secondary_gpu_used) + { + int sync_fd = cogl_context_get_latest_sync_fd (cogl_context); + + meta_frame_native_set_sync_fd (frame_native, g_steal_fd (&sync_fd)); + } + + post_next_frame (onscreen); + return; + +swap_failed: + frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC; + meta_onscreen_native_notify_frame_complete (onscreen); + clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_IDLE); +} + +static void +post_next_frame (CoglOnscreen *onscreen) +{ + CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); + CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer); + CoglRenderer *cogl_renderer = cogl_context->display->renderer; + CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys; + MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform; + MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native; + MetaRenderer *renderer = META_RENDERER (renderer_native); + MetaBackend *backend = meta_renderer_get_backend (renderer); + MetaMonitorManager *monitor_manager = + meta_backend_get_monitor_manager (backend); + MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); + MetaPowerSave power_save_mode; + MetaKmsCrtc *kms_crtc; + MetaKmsDevice *kms_device; + MetaKmsUpdate *kms_update; + g_autoptr (MetaKmsFeedback) kms_feedback = NULL; + ClutterFrame *frame = onscreen_native->next_frame; + MetaFrameNative *frame_native; + MtkRegion *region; + int sync_fd; + + COGL_TRACE_SCOPED_ANCHOR (MetaRendererNativePostKmsUpdate); + power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager); if (power_save_mode != META_POWER_SAVE_ON) { @@ -1514,6 +1551,9 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, return; } + frame_native = meta_frame_native_from_frame (frame); + region = meta_frame_native_get_damage (frame_native); + kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (onscreen_native->crtc)); kms_device = meta_kms_crtc_get_device (kms_crtc); kms_update = meta_frame_native_ensure_kms_update (frame_native, @@ -1533,7 +1573,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, region); COGL_TRACE_BEGIN_ANCHORED (MetaRendererNativePostKmsUpdate, - "Meta::OnscreenNative::swap_buffers_with_damage#post_pending_update()"); + "Meta::OnscreenNative::post_next_frame#post_pending_update()"); switch (renderer_gpu_data->mode) { @@ -1589,22 +1629,12 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, kms_update = meta_frame_native_steal_kms_update (frame_native); - if (!secondary_gpu_used) - { - int sync_fd; - - sync_fd = cogl_context_get_latest_sync_fd (cogl_context); - meta_kms_update_set_sync_fd (kms_update, g_steal_fd (&sync_fd)); - } + sync_fd = meta_frame_native_steal_sync_fd (frame_native); + if (sync_fd >= 0) + meta_kms_update_set_sync_fd (kms_update, g_steal_fd (&sync_fd)); meta_kms_device_post_update (kms_device, kms_update, META_KMS_UPDATE_FLAG_NONE); - return; - -swap_failed: - frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC; - meta_onscreen_native_notify_frame_complete (onscreen); - clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_IDLE); } gboolean