diff --git a/src/backends/meta-renderer.c b/src/backends/meta-renderer.c index dcc0f046c..f380a9987 100644 --- a/src/backends/meta-renderer.c +++ b/src/backends/meta-renderer.c @@ -298,6 +298,7 @@ void meta_renderer_resume (MetaRenderer *renderer) { MetaRendererPrivate *priv = meta_renderer_get_instance_private (renderer); + MetaRendererClass *klass = META_RENDERER_GET_CLASS (renderer); GList *l; g_return_if_fail (priv->is_paused); @@ -311,6 +312,9 @@ meta_renderer_resume (MetaRenderer *renderer) clutter_frame_clock_uninhibit (frame_clock); } + + if (klass->resume) + klass->resume (renderer); } gboolean diff --git a/src/backends/meta-renderer.h b/src/backends/meta-renderer.h index 92b0727bb..6400bec15 100644 --- a/src/backends/meta-renderer.h +++ b/src/backends/meta-renderer.h @@ -46,6 +46,7 @@ struct _MetaRendererClass MetaOutput *output, MetaCrtc *crtc); void (* rebuild_views) (MetaRenderer *renderer); + void (* resume) (MetaRenderer *renderer); GList * (* get_views_for_monitor) (MetaRenderer *renderer, MetaMonitor *monitor); }; diff --git a/src/backends/native/meta-crtc-kms.c b/src/backends/native/meta-crtc-kms.c index bf8eb5ba4..1d3cf3de8 100644 --- a/src/backends/native/meta-crtc-kms.c +++ b/src/backends/native/meta-crtc-kms.c @@ -36,6 +36,15 @@ #include "backends/native/meta-kms.h" #include "backends/native/meta-monitor-manager-native.h" +enum +{ + GAMMA_LUT_CHANGED, + + N_SIGNALS +}; + +static guint signals[N_SIGNALS]; + #define ALL_TRANSFORMS_MASK ((1 << META_MONITOR_N_TRANSFORMS) - 1) struct _MetaCrtcKms @@ -97,6 +106,16 @@ meta_crtc_kms_get_gamma_lut_size (MetaCrtc *crtc) return crtc_state->gamma.size; } +const MetaKmsCrtcGamma * +meta_crtc_kms_peek_gamma_lut (MetaCrtcKms *crtc_kms) +{ + MetaMonitorManagerNative *monitor_manager_native = + monitor_manager_from_crtc (META_CRTC (crtc_kms)); + + return meta_monitor_manager_native_get_cached_crtc_gamma (monitor_manager_native, + crtc_kms); +} + static MetaGammaLut * meta_crtc_kms_get_gamma_lut (MetaCrtc *crtc) { @@ -238,7 +257,7 @@ meta_crtc_kms_set_gamma_lut (MetaCrtc *crtc, crtc_kms, crtc_gamma); - meta_crtc_kms_invalidate_gamma (crtc_kms); + g_signal_emit (crtc_kms, signals[GAMMA_LUT_CHANGED], 0); clutter_stage_schedule_update (CLUTTER_STAGE (stage)); } @@ -374,36 +393,6 @@ meta_crtc_kms_is_gamma_invalid (MetaCrtcKms *crtc_kms) return !crtc_kms->is_gamma_valid; } -void -meta_crtc_kms_set_gamma (MetaCrtcKms *crtc_kms, - MetaKmsUpdate *kms_update) -{ - MetaGpu *gpu = meta_crtc_get_gpu (META_CRTC (crtc_kms)); - MetaBackend *backend = meta_gpu_get_backend (gpu); - MetaMonitorManager *monitor_manager = - meta_backend_get_monitor_manager (backend); - MetaMonitorManagerNative *monitor_manager_native = - META_MONITOR_MANAGER_NATIVE (monitor_manager); - MetaKmsCrtcGamma *gamma; - MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms); - - g_return_if_fail (!crtc_kms->is_gamma_valid); - g_return_if_fail (meta_kms_crtc_has_gamma (kms_crtc)); - - gamma = meta_monitor_manager_native_get_cached_crtc_gamma (monitor_manager_native, - crtc_kms); - g_return_if_fail (gamma); - - meta_kms_update_set_crtc_gamma (kms_update, - kms_crtc, - gamma->size, - gamma->red, - gamma->green, - gamma->blue); - - crtc_kms->is_gamma_valid = TRUE; -} - void meta_crtc_kms_set_mode (MetaCrtcKms *crtc_kms, MetaKmsUpdate *kms_update) @@ -498,12 +487,6 @@ meta_crtc_kms_supports_format (MetaCrtcKms *crtc_kms, drm_format); } -void -meta_crtc_kms_invalidate_gamma (MetaCrtcKms *crtc_kms) -{ - crtc_kms->is_gamma_valid = FALSE; -} - MetaCrtcKms * meta_crtc_kms_from_kms_crtc (MetaKmsCrtc *kms_crtc) { @@ -574,4 +557,12 @@ meta_crtc_kms_class_init (MetaCrtcKmsClass *klass) crtc_native_class->is_transform_handled = meta_crtc_kms_is_transform_handled; crtc_native_class->is_hw_cursor_supported = meta_crtc_kms_is_hw_cursor_supported; + + signals[GAMMA_LUT_CHANGED] = + g_signal_new ("gamma-lut-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); } diff --git a/src/backends/native/meta-crtc-kms.h b/src/backends/native/meta-crtc-kms.h index a8cd2d6f7..414c4f9d4 100644 --- a/src/backends/native/meta-crtc-kms.h +++ b/src/backends/native/meta-crtc-kms.h @@ -72,12 +72,9 @@ gboolean meta_crtc_kms_supports_format (MetaCrtcKms *crtc_kms, uint32_t drm_format); -void meta_crtc_kms_invalidate_gamma (MetaCrtcKms *crtc_kms); - gboolean meta_crtc_kms_is_gamma_invalid (MetaCrtcKms *crtc_kms); -void meta_crtc_kms_set_gamma (MetaCrtcKms *crtc_kms, - MetaKmsUpdate *kms_update); +const MetaKmsCrtcGamma * meta_crtc_kms_peek_gamma_lut (MetaCrtcKms *crtc_kms); MetaCrtcKms * meta_crtc_kms_from_kms_crtc (MetaKmsCrtc *kms_crtc); diff --git a/src/backends/native/meta-monitor-manager-native.c b/src/backends/native/meta-monitor-manager-native.c index ea1b6c220..35395f85c 100644 --- a/src/backends/native/meta-monitor-manager-native.c +++ b/src/backends/native/meta-monitor-manager-native.c @@ -158,12 +158,7 @@ meta_monitor_manager_native_set_power_save_mode (MetaMonitorManager *manager, { case META_POWER_SAVE_ON: case META_POWER_SAVE_UNSUPPORTED: - { - g_list_foreach (meta_gpu_get_crtcs (META_GPU (gpu_kms)), - (GFunc) meta_crtc_kms_invalidate_gamma, - NULL); - break; - } + break; case META_POWER_SAVE_STANDBY: case META_POWER_SAVE_SUSPEND: case META_POWER_SAVE_OFF: @@ -452,20 +447,7 @@ meta_monitor_manager_native_pause (MetaMonitorManagerNative *manager_native) void meta_monitor_manager_native_resume (MetaMonitorManagerNative *manager_native) { - MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_native); - MetaBackend *backend = meta_monitor_manager_get_backend (manager); - GList *l; - meta_monitor_manager_native_connect_hotplug_handler (manager_native); - - for (l = meta_backend_get_gpus (backend); l; l = l->next) - { - MetaGpu *gpu = l->data; - - g_list_foreach (meta_gpu_get_crtcs (gpu), - (GFunc) meta_crtc_kms_invalidate_gamma, - NULL); - } } static gboolean diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c index 578bccfa9..38673109d 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -107,6 +107,8 @@ struct _MetaOnscreenNative #endif MetaRendererView *view; + + gboolean is_gamma_lut_invalid; }; G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native, @@ -223,6 +225,7 @@ notify_view_crtc_presented (MetaRendererView *view, CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (stage_view); CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); + MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); CoglFrameInfo *frame_info; MetaCrtc *crtc; @@ -230,6 +233,8 @@ notify_view_crtc_presented (MetaRendererView *view, g_return_if_fail (frame_info != NULL); + onscreen_native->is_gamma_lut_invalid = FALSE; + crtc = META_CRTC (meta_crtc_kms_from_kms_crtc (kms_crtc)); maybe_update_frame_info (crtc, frame_info, time_us, flags, sequence); @@ -1397,12 +1402,23 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen, MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc); MetaKms *kms = meta_kms_device_get_kms (kms_device); - if (meta_crtc_kms_is_gamma_invalid (crtc_kms)) + if (onscreen_native->is_gamma_lut_invalid) { - MetaKmsUpdate *kms_update; + const MetaKmsCrtcGamma *gamma; - kms_update = meta_kms_ensure_pending_update (kms, kms_device); - meta_crtc_kms_set_gamma (crtc_kms, kms_update); + gamma = meta_crtc_kms_peek_gamma_lut (crtc_kms); + if (gamma) + { + MetaKmsUpdate *kms_update; + + kms_update = meta_kms_ensure_pending_update (kms, kms_device); + meta_kms_update_set_crtc_gamma (kms_update, + kms_crtc, + gamma->size, + gamma->red, + gamma->green, + gamma->blue); + } } if (meta_output_kms_is_privacy_screen_invalid (output_kms)) @@ -2135,6 +2151,23 @@ init_secondary_gpu_state (MetaRendererNative *renderer_native, return TRUE; } +void +meta_onscreen_native_invalidate (MetaOnscreenNative *onscreen_native) +{ + if (meta_crtc_get_gamma_lut_size (onscreen_native->crtc) > 0) + onscreen_native->is_gamma_lut_invalid = TRUE; +} + +static void +on_gamma_lut_changed (MetaCrtc *crtc, + MetaOnscreenNative *onscreen_native) +{ + ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (onscreen_native->view); + + onscreen_native->is_gamma_lut_invalid = TRUE; + clutter_stage_view_schedule_update (stage_view); +} + MetaOnscreenNative * meta_onscreen_native_new (MetaRendererNative *renderer_native, MetaGpuKms *render_gpu, @@ -2162,6 +2195,14 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native, onscreen_native->output = output; onscreen_native->crtc = crtc; + if (meta_crtc_get_gamma_lut_size (crtc) > 0) + { + onscreen_native->is_gamma_lut_invalid = TRUE; + g_signal_connect_object (crtc, "gamma-lut-changed", + G_CALLBACK (on_gamma_lut_changed), + onscreen_native, G_CONNECT_DEFAULT); + } + return onscreen_native; } diff --git a/src/backends/native/meta-onscreen-native.h b/src/backends/native/meta-onscreen-native.h index 377b7e22b..5c6af820a 100644 --- a/src/backends/native/meta-onscreen-native.h +++ b/src/backends/native/meta-onscreen-native.h @@ -62,4 +62,6 @@ MetaOnscreenNative * meta_onscreen_native_new (MetaRendererNative *renderer_nati META_EXPORT_TEST MetaCrtc * meta_onscreen_native_get_crtc (MetaOnscreenNative *onscreen_native); +void meta_onscreen_native_invalidate (MetaOnscreenNative *onscreen_native); + #endif /* META_ONSCREEN_NATIVE_H */ diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index dcd4f3ac2..f8de8b303 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -1452,6 +1452,24 @@ meta_renderer_native_rebuild_views (MetaRenderer *renderer) meta_renderer_native_queue_modes_reset (META_RENDERER_NATIVE (renderer)); } +static void +meta_renderer_native_resume (MetaRenderer *renderer) +{ + GList *l; + + for (l = meta_renderer_get_views (renderer); l; l = l->next) + { + ClutterStageView *stage_view = l->data; + CoglFramebuffer *framebuffer; + + framebuffer = clutter_stage_view_get_onscreen (stage_view); + if (!META_IS_ONSCREEN_NATIVE (framebuffer)) + continue; + + meta_onscreen_native_invalidate (META_ONSCREEN_NATIVE (framebuffer)); + } +} + void meta_renderer_native_prepare_frame (MetaRendererNative *renderer_native, MetaRendererView *view, @@ -2173,6 +2191,7 @@ meta_renderer_native_class_init (MetaRendererNativeClass *klass) renderer_class->create_cogl_renderer = meta_renderer_native_create_cogl_renderer; renderer_class->create_view = meta_renderer_native_create_view; renderer_class->rebuild_views = meta_renderer_native_rebuild_views; + renderer_class->resume = meta_renderer_native_resume; } MetaRendererNative *