renderer-view: Set ClutterColorStates from a MetaColorDevice
And stop passing in the color states from the RendererNative. We also keep the color states updated by listening for changes in the color device. The RendererX11Cm has a single view and no mapping to a specific color device, so we handle the absense of a color device as well and rely on ClutterStageView to have the default color states. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3930>
This commit is contained in:
parent
5b44d589b1
commit
608d66afa5
6 changed files with 165 additions and 32 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <glib-object.h>
|
||||
|
||||
#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,
|
||||
|
|
Loading…
Reference in a new issue