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_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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue