1
0
Fork 0

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:
Sebastian Wick 2024-08-08 01:06:16 +02:00 committed by Marge Bot
parent 5b44d589b1
commit 608d66afa5
6 changed files with 165 additions and 32 deletions

View file

@ -74,3 +74,14 @@ CLUTTER_EXPORT
void clutter_stage_view_notify_ready (ClutterStageView *view); void clutter_stage_view_notify_ready (ClutterStageView *view);
void clutter_stage_view_invalidate_input_devices (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);

View file

@ -385,6 +385,26 @@ set_color_state (ClutterStageView *view,
clutter_stage_view_invalidate_offscreen (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 static void
clutter_stage_view_ensure_color_states (ClutterStageView *view) 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; 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;
}

View file

@ -32,16 +32,20 @@
#include "backends/meta-renderer-view.h" #include "backends/meta-renderer-view.h"
#include "backends/meta-color-device.h"
#include "backends/meta-crtc.h" #include "backends/meta-crtc.h"
#include "backends/meta-renderer.h" #include "backends/meta-renderer.h"
#include "clutter/clutter-mutter.h" #include "clutter/clutter-mutter.h"
#include "core/boxes-private.h" #include "core/boxes-private.h"
#include "core/meta-debug-control-private.h"
enum enum
{ {
PROP_0, PROP_0,
PROP_BACKEND,
PROP_CRTC, PROP_CRTC,
PROP_COLOR_DEVICE,
PROP_LAST PROP_LAST
}; };
@ -50,7 +54,9 @@ static GParamSpec *obj_props[PROP_LAST];
typedef struct _MetaRendererViewPrivate typedef struct _MetaRendererViewPrivate
{ {
MetaBackend *backend;
MetaCrtc *crtc; MetaCrtc *crtc;
MetaColorDevice *color_device;
} MetaRendererViewPrivate; } MetaRendererViewPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (MetaRendererView, meta_renderer_view, G_DEFINE_TYPE_WITH_PRIVATE (MetaRendererView, meta_renderer_view,
@ -65,6 +71,54 @@ meta_renderer_view_get_crtc (MetaRendererView *view)
return priv->crtc; 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 static void
meta_renderer_view_get_property (GObject *object, meta_renderer_view_get_property (GObject *object,
guint prop_id, guint prop_id,
@ -77,9 +131,15 @@ meta_renderer_view_get_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_BACKEND:
g_value_set_object (value, priv->backend);
break;
case PROP_CRTC: case PROP_CRTC:
g_value_set_object (value, priv->crtc); g_value_set_object (value, priv->crtc);
break; break;
case PROP_COLOR_DEVICE:
g_value_set_object (value, priv->color_device);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -98,15 +158,55 @@ meta_renderer_view_set_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_BACKEND:
priv->backend = g_value_get_object (value);
break;
case PROP_CRTC: case PROP_CRTC:
priv->crtc = g_value_get_object (value); priv->crtc = g_value_get_object (value);
break; break;
case PROP_COLOR_DEVICE:
g_set_object (&priv->color_device, g_value_get_object (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; 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 static void
meta_renderer_view_init (MetaRendererView *view) meta_renderer_view_init (MetaRendererView *view)
{ {
@ -117,9 +217,18 @@ meta_renderer_view_class_init (MetaRendererViewClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (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->get_property = meta_renderer_view_get_property;
object_class->set_property = meta_renderer_view_set_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] = obj_props[PROP_CRTC] =
g_param_spec_object ("crtc", NULL, NULL, g_param_spec_object ("crtc", NULL, NULL,
META_TYPE_CRTC, META_TYPE_CRTC,
@ -127,5 +236,12 @@ meta_renderer_view_class_init (MetaRendererViewClass *klass)
G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS); 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); g_object_class_install_properties (object_class, PROP_LAST, obj_props);
} }

View file

@ -72,7 +72,6 @@
#include "common/meta-cogl-drm-formats.h" #include "common/meta-cogl-drm-formats.h"
#include "common/meta-drm-format-helpers.h" #include "common/meta-drm-format-helpers.h"
#include "core/boxes-private.h" #include "core/boxes-private.h"
#include "core/meta-debug-control-private.h"
#ifdef HAVE_EGL_DEVICE #ifdef HAVE_EGL_DEVICE
#include "backends/native/meta-render-device-egl-stream.h" #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); MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
MetaBackend *backend = meta_renderer_get_backend (renderer); MetaBackend *backend = meta_renderer_get_backend (renderer);
MetaContext *context = meta_backend_get_context (backend);
MetaMonitorManager *monitor_manager = MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
MetaColorManager *color_manager = meta_backend_get_color_manager (backend); MetaColorManager *color_manager = meta_backend_get_color_manager (backend);
MetaColorDevice *color_device = MetaColorDevice *color_device =
meta_color_manager_get_color_device (color_manager, monitor); meta_color_manager_get_color_device (color_manager, monitor);
MetaDebugControl *debug_control = meta_context_get_debug_control (context);
CoglContext *cogl_context = CoglContext *cogl_context =
cogl_context_from_renderer_native (renderer_native); cogl_context_from_renderer_native (renderer_native);
CoglDisplay *cogl_display = cogl_context_get_display (cogl_context); CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
const MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
const MetaCrtcModeInfo *crtc_mode_info; const MetaCrtcModeInfo *crtc_mode_info;
gboolean force_linear;
ClutterColorState *color_state;
g_autoptr (ClutterColorState) blending_color_state = NULL;
MtkMonitorTransform view_transform; MtkMonitorTransform view_transform;
g_autoptr (CoglFramebuffer) framebuffer = NULL; g_autoptr (CoglFramebuffer) framebuffer = NULL;
gboolean use_shadowfb; gboolean use_shadowfb;
@ -1431,30 +1425,6 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
framebuffer = COGL_FRAMEBUFFER (virtual_onscreen); 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, view_transform = calculate_view_transform (monitor_manager,
logical_monitor, logical_monitor,
output, output,
@ -1471,13 +1441,13 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
view_native = g_object_new (META_TYPE_RENDERER_VIEW_NATIVE, view_native = g_object_new (META_TYPE_RENDERER_VIEW_NATIVE,
"name", meta_output_get_name (output), "name", meta_output_get_name (output),
"backend", backend,
"color-device", color_device,
"stage", meta_backend_get_stage (backend), "stage", meta_backend_get_stage (backend),
"layout", &view_layout, "layout", &view_layout,
"crtc", crtc, "crtc", crtc,
"scale", scale, "scale", scale,
"framebuffer", framebuffer, "framebuffer", framebuffer,
"color-state", blending_color_state,
"output-color-state", color_state,
"use-shadowfb", use_shadowfb, "use-shadowfb", use_shadowfb,
"transform", view_transform, "transform", view_transform,
"refresh-rate", crtc_mode_info->refresh_rate, "refresh-rate", crtc_mode_info->refresh_rate,

View file

@ -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, renderer_x11_cm->screen_view = g_object_new (META_TYPE_RENDERER_VIEW,
"name", "X11 screen", "name", "X11 screen",
"backend", backend,
"stage", stage, "stage", stage,
"layout", &view_layout, "layout", &view_layout,
"framebuffer", onscreen, "framebuffer", onscreen,

View file

@ -25,6 +25,7 @@
#include <glib-object.h> #include <glib-object.h>
#include "backends/meta-backend-private.h" #include "backends/meta-backend-private.h"
#include "backends/meta-color-manager.h"
#include "backends/meta-logical-monitor.h" #include "backends/meta-logical-monitor.h"
#include "backends/meta-output.h" #include "backends/meta-output.h"
#include "backends/meta-renderer.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); MetaBackend *backend = meta_renderer_get_backend (renderer);
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_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; float view_scale;
const MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
int width, height; int width, height;
@ -98,6 +102,8 @@ meta_renderer_x11_nested_create_view (MetaRenderer *renderer,
view = g_object_new (META_TYPE_RENDERER_VIEW, view = g_object_new (META_TYPE_RENDERER_VIEW,
"name", meta_output_get_name (output), "name", meta_output_get_name (output),
"backend", backend,
"color-device", color_device,
"stage", meta_backend_get_stage (backend), "stage", meta_backend_get_stage (backend),
"layout", &view_layout, "layout", &view_layout,
"crtc", crtc, "crtc", crtc,