diff --git a/clutter/clutter/clutter-stage-view-private.h b/clutter/clutter/clutter-stage-view-private.h index 310672b3b..31ac7e144 100644 --- a/clutter/clutter/clutter-stage-view-private.h +++ b/clutter/clutter/clutter-stage-view-private.h @@ -74,3 +74,14 @@ CLUTTER_EXPORT void clutter_stage_view_notify_ready (ClutterStageView *view); void clutter_stage_view_invalidate_input_devices (ClutterStageView *view); + +CLUTTER_EXPORT +void clutter_stage_view_set_color_state (ClutterStageView *view, + ClutterColorState *color_state); + +CLUTTER_EXPORT +void clutter_stage_view_set_output_color_state (ClutterStageView *view, + ClutterColorState *color_state); + +CLUTTER_EXPORT +const char * clutter_stage_view_get_name (ClutterStageView *view); diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c index 97169c549..af234cc38 100644 --- a/clutter/clutter/clutter-stage-view.c +++ b/clutter/clutter/clutter-stage-view.c @@ -385,6 +385,26 @@ set_color_state (ClutterStageView *view, clutter_stage_view_invalidate_offscreen (view); } +void +clutter_stage_view_set_color_state (ClutterStageView *view, + ClutterColorState *color_state) +{ + ClutterStageViewPrivate *priv = + clutter_stage_view_get_instance_private (view); + + set_color_state (view, &priv->color_state, color_state); +} + +void +clutter_stage_view_set_output_color_state (ClutterStageView *view, + ClutterColorState *color_state) +{ + ClutterStageViewPrivate *priv = + clutter_stage_view_get_instance_private (view); + + set_color_state (view, &priv->output_color_state, color_state); +} + static void clutter_stage_view_ensure_color_states (ClutterStageView *view) { @@ -1486,3 +1506,12 @@ clutter_stage_view_get_output_color_state (ClutterStageView *view) return priv->output_color_state; } + +const char * +clutter_stage_view_get_name (ClutterStageView *view) +{ + ClutterStageViewPrivate *priv = + clutter_stage_view_get_instance_private (view); + + return priv->name; +} diff --git a/src/backends/meta-renderer-view.c b/src/backends/meta-renderer-view.c index a99862970..113d8fbbd 100644 --- a/src/backends/meta-renderer-view.c +++ b/src/backends/meta-renderer-view.c @@ -32,16 +32,20 @@ #include "backends/meta-renderer-view.h" +#include "backends/meta-color-device.h" #include "backends/meta-crtc.h" #include "backends/meta-renderer.h" #include "clutter/clutter-mutter.h" #include "core/boxes-private.h" +#include "core/meta-debug-control-private.h" enum { PROP_0, + PROP_BACKEND, PROP_CRTC, + PROP_COLOR_DEVICE, PROP_LAST }; @@ -50,7 +54,9 @@ static GParamSpec *obj_props[PROP_LAST]; typedef struct _MetaRendererViewPrivate { + MetaBackend *backend; MetaCrtc *crtc; + MetaColorDevice *color_device; } MetaRendererViewPrivate; G_DEFINE_TYPE_WITH_PRIVATE (MetaRendererView, meta_renderer_view, @@ -65,6 +71,54 @@ meta_renderer_view_get_crtc (MetaRendererView *view) return priv->crtc; } +static void +set_color_states (MetaRendererView *view) +{ + ClutterStageView *clutter_stage_view = CLUTTER_STAGE_VIEW (view); + MetaRendererViewPrivate *priv = + meta_renderer_view_get_instance_private (view); + MetaContext *context = meta_backend_get_context (priv->backend); + MetaDebugControl *debug_control = meta_context_get_debug_control (context); + ClutterColorState *output_color_state; + g_autoptr (ClutterColorState) view_color_state = NULL; + gboolean force_linear; + + g_return_if_fail (priv->color_device != NULL); + + output_color_state = meta_color_device_get_color_state (priv->color_device); + + force_linear = meta_debug_control_is_linear_blending_forced (debug_control); + view_color_state = clutter_color_state_get_blending (output_color_state, + force_linear); + + if (meta_is_topic_enabled (META_DEBUG_RENDER)) + { + g_autofree char *output_cs_str = + clutter_color_state_to_string (output_color_state); + g_autofree char *view_cs_str = + clutter_color_state_to_string (view_color_state); + const char *name = clutter_stage_view_get_name (clutter_stage_view); + + meta_topic (META_DEBUG_RENDER, "ColorState for view %s: %s", + name, view_cs_str); + + meta_topic (META_DEBUG_RENDER, "ColorState for output %s: %s", + name, output_cs_str); + } + + clutter_stage_view_set_color_state (clutter_stage_view, + view_color_state); + clutter_stage_view_set_output_color_state (clutter_stage_view, + output_color_state); +} + +static void +on_color_state_changed (MetaColorDevice *color_device, + MetaRendererView *view) +{ + set_color_states (view); +} + static void meta_renderer_view_get_property (GObject *object, guint prop_id, @@ -77,9 +131,15 @@ meta_renderer_view_get_property (GObject *object, switch (prop_id) { + case PROP_BACKEND: + g_value_set_object (value, priv->backend); + break; case PROP_CRTC: g_value_set_object (value, priv->crtc); break; + case PROP_COLOR_DEVICE: + g_value_set_object (value, priv->color_device); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -98,15 +158,55 @@ meta_renderer_view_set_property (GObject *object, switch (prop_id) { + case PROP_BACKEND: + priv->backend = g_value_get_object (value); + break; case PROP_CRTC: priv->crtc = g_value_get_object (value); break; + case PROP_COLOR_DEVICE: + g_set_object (&priv->color_device, g_value_get_object (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } +static void +meta_renderer_view_constructed (GObject *object) +{ + MetaRendererView *view = META_RENDERER_VIEW (object); + MetaRendererViewPrivate *priv = + meta_renderer_view_get_instance_private (view); + + g_return_if_fail (priv->backend != NULL); + + if (priv->color_device != NULL) + { + set_color_states (view); + + g_signal_connect_object (priv->color_device, "color-state-changed", + G_CALLBACK (on_color_state_changed), + view, + G_CONNECT_DEFAULT); + } + + G_OBJECT_CLASS (meta_renderer_view_parent_class)->constructed (object); +} + +static void +meta_renderer_view_dispose (GObject *object) +{ + MetaRendererView *view = META_RENDERER_VIEW (object); + MetaRendererViewPrivate *priv = + meta_renderer_view_get_instance_private (view); + + g_clear_object (&priv->color_device); + + G_OBJECT_CLASS (meta_renderer_view_parent_class)->dispose (object); +} + static void meta_renderer_view_init (MetaRendererView *view) { @@ -117,9 +217,18 @@ meta_renderer_view_class_init (MetaRendererViewClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->constructed = meta_renderer_view_constructed; + object_class->dispose = meta_renderer_view_dispose; object_class->get_property = meta_renderer_view_get_property; object_class->set_property = meta_renderer_view_set_property; + obj_props[PROP_BACKEND] = + g_param_spec_object ("backend", NULL, NULL, + META_TYPE_BACKEND, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + obj_props[PROP_CRTC] = g_param_spec_object ("crtc", NULL, NULL, META_TYPE_CRTC, @@ -127,5 +236,12 @@ meta_renderer_view_class_init (MetaRendererViewClass *klass) G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + obj_props[PROP_COLOR_DEVICE] = + g_param_spec_object ("color-device", NULL, NULL, + META_TYPE_COLOR_DEVICE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, PROP_LAST, obj_props); } diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index 9cc263fce..7034206bc 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -72,7 +72,6 @@ #include "common/meta-cogl-drm-formats.h" #include "common/meta-drm-format-helpers.h" #include "core/boxes-private.h" -#include "core/meta-debug-control-private.h" #ifdef HAVE_EGL_DEVICE #include "backends/native/meta-render-device-egl-stream.h" @@ -1342,21 +1341,16 @@ meta_renderer_native_create_view (MetaRenderer *renderer, { MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer); MetaBackend *backend = meta_renderer_get_backend (renderer); - MetaContext *context = meta_backend_get_context (backend); MetaMonitorManager *monitor_manager = meta_backend_get_monitor_manager (backend); MetaColorManager *color_manager = meta_backend_get_color_manager (backend); MetaColorDevice *color_device = meta_color_manager_get_color_device (color_manager, monitor); - MetaDebugControl *debug_control = meta_context_get_debug_control (context); CoglContext *cogl_context = cogl_context_from_renderer_native (renderer_native); CoglDisplay *cogl_display = cogl_context_get_display (cogl_context); const MetaCrtcConfig *crtc_config; const MetaCrtcModeInfo *crtc_mode_info; - gboolean force_linear; - ClutterColorState *color_state; - g_autoptr (ClutterColorState) blending_color_state = NULL; MtkMonitorTransform view_transform; g_autoptr (CoglFramebuffer) framebuffer = NULL; gboolean use_shadowfb; @@ -1431,30 +1425,6 @@ meta_renderer_native_create_view (MetaRenderer *renderer, framebuffer = COGL_FRAMEBUFFER (virtual_onscreen); } - color_state = meta_color_device_get_color_state (color_device); - - force_linear = meta_debug_control_is_linear_blending_forced (debug_control); - blending_color_state = clutter_color_state_get_blending (color_state, - force_linear); - - if (meta_is_topic_enabled (META_DEBUG_RENDER)) - { - g_autofree char *cs_str = - clutter_color_state_to_string (color_state); - g_autofree char *blending_cs_str = - clutter_color_state_to_string (blending_color_state); - - meta_topic (META_DEBUG_RENDER, - "ColorState for view %s:\n %s", - meta_output_get_name (output), - blending_cs_str); - - meta_topic (META_DEBUG_RENDER, - "ColorState for output %s:\n %s", - meta_output_get_name (output), - cs_str); - } - view_transform = calculate_view_transform (monitor_manager, logical_monitor, output, @@ -1471,13 +1441,13 @@ meta_renderer_native_create_view (MetaRenderer *renderer, view_native = g_object_new (META_TYPE_RENDERER_VIEW_NATIVE, "name", meta_output_get_name (output), + "backend", backend, + "color-device", color_device, "stage", meta_backend_get_stage (backend), "layout", &view_layout, "crtc", crtc, "scale", scale, "framebuffer", framebuffer, - "color-state", blending_color_state, - "output-color-state", color_state, "use-shadowfb", use_shadowfb, "transform", view_transform, "refresh-rate", crtc_mode_info->refresh_rate, diff --git a/src/backends/x11/cm/meta-renderer-x11-cm.c b/src/backends/x11/cm/meta-renderer-x11-cm.c index c69447f93..494b985fb 100644 --- a/src/backends/x11/cm/meta-renderer-x11-cm.c +++ b/src/backends/x11/cm/meta-renderer-x11-cm.c @@ -53,6 +53,7 @@ meta_renderer_x11_cm_init_screen_view (MetaRendererX11Cm *renderer_x11_cm, }; renderer_x11_cm->screen_view = g_object_new (META_TYPE_RENDERER_VIEW, "name", "X11 screen", + "backend", backend, "stage", stage, "layout", &view_layout, "framebuffer", onscreen, diff --git a/src/backends/x11/nested/meta-renderer-x11-nested.c b/src/backends/x11/nested/meta-renderer-x11-nested.c index 583c98e7b..2bfeeae3b 100644 --- a/src/backends/x11/nested/meta-renderer-x11-nested.c +++ b/src/backends/x11/nested/meta-renderer-x11-nested.c @@ -25,6 +25,7 @@ #include #include "backends/meta-backend-private.h" +#include "backends/meta-color-manager.h" #include "backends/meta-logical-monitor.h" #include "backends/meta-output.h" #include "backends/meta-renderer.h" @@ -71,6 +72,9 @@ meta_renderer_x11_nested_create_view (MetaRenderer *renderer, MetaBackend *backend = meta_renderer_get_backend (renderer); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend); + MetaColorManager *color_manager = meta_backend_get_color_manager (backend); + MetaColorDevice *color_device = + meta_color_manager_get_color_device (color_manager, monitor); float view_scale; const MetaCrtcConfig *crtc_config; int width, height; @@ -98,6 +102,8 @@ meta_renderer_x11_nested_create_view (MetaRenderer *renderer, view = g_object_new (META_TYPE_RENDERER_VIEW, "name", meta_output_get_name (output), + "backend", backend, + "color-device", color_device, "stage", meta_backend_get_stage (backend), "layout", &view_layout, "crtc", crtc,