crtc: Move MetaCrtcConfig field to instance private

Last piece before MetCrtc can be made a derivable type.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1287
This commit is contained in:
Jonas Ådahl 2020-02-26 10:37:53 +01:00 committed by Georges Basile Stavracas Neto
parent c3fc6025b1
commit 092c5304a9
13 changed files with 82 additions and 47 deletions

View File

@ -43,6 +43,8 @@ typedef struct _MetaCrtcPrivate
MetaGpu *gpu; MetaGpu *gpu;
MetaMonitorTransform all_transforms; MetaMonitorTransform all_transforms;
MetaCrtcConfig *config;
} MetaCrtcPrivate; } MetaCrtcPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (MetaCrtc, meta_crtc, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (MetaCrtc, meta_crtc, G_TYPE_OBJECT)
@ -79,6 +81,7 @@ meta_crtc_set_config (MetaCrtc *crtc,
MetaCrtcMode *mode, MetaCrtcMode *mode,
MetaMonitorTransform transform) MetaMonitorTransform transform)
{ {
MetaCrtcPrivate *priv = meta_crtc_get_instance_private (crtc);
MetaCrtcConfig *config; MetaCrtcConfig *config;
meta_crtc_unset_config (crtc); meta_crtc_unset_config (crtc);
@ -88,13 +91,23 @@ meta_crtc_set_config (MetaCrtc *crtc,
config->mode = mode; config->mode = mode;
config->transform = transform; config->transform = transform;
crtc->config = config; priv->config = config;
} }
void void
meta_crtc_unset_config (MetaCrtc *crtc) meta_crtc_unset_config (MetaCrtc *crtc)
{ {
g_clear_pointer (&crtc->config, g_free); MetaCrtcPrivate *priv = meta_crtc_get_instance_private (crtc);
g_clear_pointer (&priv->config, g_free);
}
const MetaCrtcConfig *
meta_crtc_get_config (MetaCrtc *crtc)
{
MetaCrtcPrivate *priv = meta_crtc_get_instance_private (crtc);
return priv->config;
} }
static void static void
@ -151,11 +164,12 @@ static void
meta_crtc_finalize (GObject *object) meta_crtc_finalize (GObject *object)
{ {
MetaCrtc *crtc = META_CRTC (object); MetaCrtc *crtc = META_CRTC (object);
MetaCrtcPrivate *priv = meta_crtc_get_instance_private (crtc);
if (crtc->driver_notify) if (crtc->driver_notify)
crtc->driver_notify (crtc); crtc->driver_notify (crtc);
g_clear_pointer (&crtc->config, g_free); g_clear_pointer (&priv->config, g_free);
G_OBJECT_CLASS (meta_crtc_parent_class)->finalize (object); G_OBJECT_CLASS (meta_crtc_parent_class)->finalize (object);
} }

View File

@ -60,8 +60,6 @@ struct _MetaCrtc
{ {
GObject parent; GObject parent;
MetaCrtcConfig *config;
gpointer driver_private; gpointer driver_private;
GDestroyNotify driver_notify; GDestroyNotify driver_notify;
}; };
@ -106,4 +104,7 @@ void meta_crtc_set_config (MetaCrtc *crtc,
META_EXPORT_TEST META_EXPORT_TEST
void meta_crtc_unset_config (MetaCrtc *crtc); void meta_crtc_unset_config (MetaCrtc *crtc);
META_EXPORT_TEST
const MetaCrtcConfig * meta_crtc_get_config (MetaCrtc *crtc);
#endif /* META_CRTC_H */ #endif /* META_CRTC_H */

View File

@ -119,10 +119,14 @@ static MetaMonitorTransform
derive_monitor_transform (MetaMonitor *monitor) derive_monitor_transform (MetaMonitor *monitor)
{ {
MetaOutput *main_output; MetaOutput *main_output;
MetaCrtc *crtc;
const MetaCrtcConfig *crtc_config;
MetaMonitorTransform transform; MetaMonitorTransform transform;
main_output = meta_monitor_get_main_output (monitor); main_output = meta_monitor_get_main_output (monitor);
transform = meta_output_get_assigned_crtc (main_output)->config->transform; crtc = meta_output_get_assigned_crtc (main_output);
crtc_config = meta_crtc_get_config (crtc);
transform = crtc_config->transform;
return meta_monitor_crtc_to_logical_transform (monitor, transform); return meta_monitor_crtc_to_logical_transform (monitor, transform);
} }

View File

@ -1017,7 +1017,7 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
{ {
MetaCrtc *crtc = l->data; MetaCrtc *crtc = l->data;
GVariantBuilder transforms; GVariantBuilder transforms;
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
g_variant_builder_init (&transforms, G_VARIANT_TYPE ("au")); g_variant_builder_init (&transforms, G_VARIANT_TYPE ("au"));
for (j = 0; j <= META_MONITOR_TRANSFORM_FLIPPED_270; j++) for (j = 0; j <= META_MONITOR_TRANSFORM_FLIPPED_270; j++)
@ -1026,8 +1026,7 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
g_variant_builder_add (&transforms, "u", j); g_variant_builder_add (&transforms, "u", j);
} }
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
if (crtc_config) if (crtc_config)
{ {
int current_mode_index; int current_mode_index;

View File

@ -642,8 +642,14 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
monitor_priv->preferred_mode = mode; monitor_priv->preferred_mode = mode;
crtc = meta_output_get_assigned_crtc (output); crtc = meta_output_get_assigned_crtc (output);
if (crtc && crtc->config && crtc_mode == crtc->config->mode) if (crtc)
monitor_priv->current_mode = mode; {
const MetaCrtcConfig *crtc_config;
crtc_config = meta_crtc_get_config (crtc);
if (crtc_config && crtc_mode == crtc_config->mode)
monitor_priv->current_mode = mode;
}
} }
} }
@ -689,11 +695,11 @@ meta_monitor_normal_derive_layout (MetaMonitor *monitor,
{ {
MetaOutput *output; MetaOutput *output;
MetaCrtc *crtc; MetaCrtc *crtc;
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
output = meta_monitor_get_main_output (monitor); output = meta_monitor_get_main_output (monitor);
crtc = meta_output_get_assigned_crtc (output); crtc = meta_output_get_assigned_crtc (output);
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
g_return_if_fail (crtc_config); g_return_if_fail (crtc_config);
@ -910,11 +916,14 @@ is_monitor_mode_assigned (MetaMonitor *monitor,
MetaOutput *output = l->data; MetaOutput *output = l->data;
MetaMonitorCrtcMode *monitor_crtc_mode = &mode->crtc_modes[i]; MetaMonitorCrtcMode *monitor_crtc_mode = &mode->crtc_modes[i];
MetaCrtc *crtc; MetaCrtc *crtc;
const MetaCrtcConfig *crtc_config;
crtc = meta_output_get_assigned_crtc (output); crtc = meta_output_get_assigned_crtc (output);
crtc_config = crtc ? meta_crtc_get_config (crtc) : NULL;
if (monitor_crtc_mode->crtc_mode && if (monitor_crtc_mode->crtc_mode &&
(!crtc || !crtc->config || (!crtc || !crtc_config ||
crtc->config->mode != monitor_crtc_mode->crtc_mode)) crtc_config->mode != monitor_crtc_mode->crtc_mode))
return FALSE; return FALSE;
else if (!monitor_crtc_mode->crtc_mode && crtc) else if (!monitor_crtc_mode->crtc_mode && crtc)
return FALSE; return FALSE;
@ -1379,14 +1388,14 @@ meta_monitor_tiled_derive_layout (MetaMonitor *monitor,
{ {
MetaOutput *output = l->data; MetaOutput *output = l->data;
MetaCrtc *crtc; MetaCrtc *crtc;
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
graphene_rect_t *crtc_layout; const graphene_rect_t *crtc_layout;
crtc = meta_output_get_assigned_crtc (output); crtc = meta_output_get_assigned_crtc (output);
if (!crtc) if (!crtc)
continue; continue;
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
g_return_if_fail (crtc_config); g_return_if_fail (crtc_config);
crtc_layout = &crtc_config->layout; crtc_layout = &crtc_config->layout;
@ -1553,7 +1562,8 @@ is_current_mode_known (MetaMonitor *monitor)
output = meta_monitor_get_main_output (monitor); output = meta_monitor_get_main_output (monitor);
crtc = meta_output_get_assigned_crtc (output); crtc = meta_output_get_assigned_crtc (output);
return meta_monitor_is_active (monitor) == (crtc && crtc->config); return (meta_monitor_is_active (monitor) ==
(crtc && meta_crtc_get_config (crtc)));
} }
void void

View File

@ -80,9 +80,12 @@ meta_crtc_kms_apply_transform (MetaCrtc *crtc,
MetaKmsPlaneAssignment *kms_plane_assignment) MetaKmsPlaneAssignment *kms_plane_assignment)
{ {
MetaCrtcKms *crtc_kms = crtc->driver_private; MetaCrtcKms *crtc_kms = crtc->driver_private;
const MetaCrtcConfig *crtc_config;
MetaMonitorTransform hw_transform; MetaMonitorTransform hw_transform;
hw_transform = crtc->config->transform; crtc_config = meta_crtc_get_config (crtc);
hw_transform = crtc_config->transform;
if (!meta_crtc_kms_is_transform_handled (crtc, hw_transform)) if (!meta_crtc_kms_is_transform_handled (crtc, hw_transform))
hw_transform = META_MONITOR_TRANSFORM_NORMAL; hw_transform = META_MONITOR_TRANSFORM_NORMAL;
if (!meta_crtc_kms_is_transform_handled (crtc, hw_transform)) if (!meta_crtc_kms_is_transform_handled (crtc, hw_transform))
@ -98,7 +101,7 @@ meta_crtc_kms_assign_primary_plane (MetaCrtc *crtc,
uint32_t fb_id, uint32_t fb_id,
MetaKmsUpdate *kms_update) MetaKmsUpdate *kms_update)
{ {
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
MetaFixed16Rectangle src_rect; MetaFixed16Rectangle src_rect;
MetaFixed16Rectangle dst_rect; MetaFixed16Rectangle dst_rect;
MetaKmsAssignPlaneFlag flags; MetaKmsAssignPlaneFlag flags;
@ -107,8 +110,7 @@ meta_crtc_kms_assign_primary_plane (MetaCrtc *crtc,
MetaKmsPlane *primary_kms_plane; MetaKmsPlane *primary_kms_plane;
MetaKmsPlaneAssignment *plane_assignment; MetaKmsPlaneAssignment *plane_assignment;
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
src_rect = (MetaFixed16Rectangle) { src_rect = (MetaFixed16Rectangle) {
.x = meta_fixed_16_from_int (0), .x = meta_fixed_16_from_int (0),
@ -168,7 +170,6 @@ void
meta_crtc_kms_set_mode (MetaCrtc *crtc, meta_crtc_kms_set_mode (MetaCrtc *crtc,
MetaKmsUpdate *kms_update) MetaKmsUpdate *kms_update)
{ {
MetaCrtcConfig *crtc_config = crtc->config;
MetaGpu *gpu = meta_crtc_get_gpu (crtc); MetaGpu *gpu = meta_crtc_get_gpu (crtc);
GList *connectors; GList *connectors;
drmModeModeInfo *mode; drmModeModeInfo *mode;
@ -177,6 +178,8 @@ meta_crtc_kms_set_mode (MetaCrtc *crtc,
if (connectors) if (connectors)
{ {
const MetaCrtcConfig *crtc_config = meta_crtc_get_config (crtc);
mode = crtc_config->mode->driver_private; mode = crtc_config->mode->driver_private;
g_debug ("Setting CRTC (%ld) mode to %s", g_debug ("Setting CRTC (%ld) mode to %s",

View File

@ -65,11 +65,11 @@ meta_output_kms_set_underscan (MetaOutput *output,
if (meta_output_is_underscanning (output)) if (meta_output_is_underscanning (output))
{ {
MetaCrtc *crtc; MetaCrtc *crtc;
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
uint64_t hborder, vborder; uint64_t hborder, vborder;
crtc = meta_output_get_assigned_crtc (output); crtc = meta_output_get_assigned_crtc (output);
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
hborder = MIN (128, (uint64_t) round (crtc_config->mode->width * 0.05)); hborder = MIN (128, (uint64_t) round (crtc_config->mode->width * 0.05));
vborder = MIN (128, (uint64_t) round (crtc_config->mode->height * 0.05)); vborder = MIN (128, (uint64_t) round (crtc_config->mode->height * 0.05));

View File

@ -1127,6 +1127,7 @@ notify_view_crtc_presented (MetaRendererView *view,
MetaGpuKms *render_gpu = onscreen_native->render_gpu; MetaGpuKms *render_gpu = onscreen_native->render_gpu;
CoglFrameInfo *frame_info; CoglFrameInfo *frame_info;
MetaCrtc *crtc; MetaCrtc *crtc;
const MetaCrtcConfig *crtc_config;
float refresh_rate; float refresh_rate;
MetaGpuKms *gpu_kms; MetaGpuKms *gpu_kms;
@ -1138,9 +1139,8 @@ notify_view_crtc_presented (MetaRendererView *view,
frame_info = g_queue_peek_tail (&onscreen->pending_frame_infos); frame_info = g_queue_peek_tail (&onscreen->pending_frame_infos);
crtc = meta_crtc_kms_from_kms_crtc (kms_crtc); crtc = meta_crtc_kms_from_kms_crtc (kms_crtc);
refresh_rate = crtc && crtc->config ? crtc_config = crtc ? meta_crtc_get_config (crtc) : NULL;
crtc->config->mode->refresh_rate : refresh_rate = crtc_config ? crtc_config->mode->refresh_rate : 0.0f;
0.0f;
if (refresh_rate >= frame_info->refresh_rate) if (refresh_rate >= frame_info->refresh_rate)
{ {
frame_info->presentation_time = time_ns; frame_info->presentation_time = time_ns;
@ -2240,10 +2240,12 @@ meta_onscreen_native_is_buffer_scanout_compatible (CoglOnscreen *onscreen,
{ {
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
MetaOnscreenNative *onscreen_native = onscreen_egl->platform; MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
const MetaCrtcConfig *crtc_config;
MetaDrmBuffer *fb; MetaDrmBuffer *fb;
struct gbm_bo *gbm_bo; struct gbm_bo *gbm_bo;
if (onscreen_native->crtc->config->transform != META_MONITOR_TRANSFORM_NORMAL) crtc_config = meta_crtc_get_config (onscreen_native->crtc);
if (crtc_config->transform != META_MONITOR_TRANSFORM_NORMAL)
return FALSE; return FALSE;
if (onscreen_native->secondary_gpu_state) if (onscreen_native->secondary_gpu_state)
@ -3155,7 +3157,7 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
CoglDisplay *cogl_display = cogl_context_get_display (cogl_context); CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
CoglDisplayEGL *cogl_display_egl; CoglDisplayEGL *cogl_display_egl;
CoglOnscreenEGL *onscreen_egl; CoglOnscreenEGL *onscreen_egl;
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
MetaMonitorTransform view_transform; MetaMonitorTransform view_transform;
CoglOnscreen *onscreen = NULL; CoglOnscreen *onscreen = NULL;
CoglOffscreen *offscreen = NULL; CoglOffscreen *offscreen = NULL;
@ -3167,7 +3169,7 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
MetaRendererView *view; MetaRendererView *view;
GError *error = NULL; GError *error = NULL;
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
onscreen_width = crtc_config->mode->width; onscreen_width = crtc_config->mode->width;
onscreen_height = crtc_config->mode->height; onscreen_height = crtc_config->mode->height;
@ -3219,7 +3221,7 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
else else
scale = 1.0; scale = 1.0;
meta_rectangle_from_graphene_rect (&crtc->config->layout, meta_rectangle_from_graphene_rect (&crtc_config->layout,
META_ROUNDING_STRATEGY_ROUND, META_ROUNDING_STRATEGY_ROUND,
&view_layout); &view_layout);
view = g_object_new (META_TYPE_RENDERER_VIEW, view = g_object_new (META_TYPE_RENDERER_VIEW,
@ -3297,7 +3299,7 @@ meta_renderer_native_finish_frame (MetaRendererNative *renderer_native)
{ {
MetaCrtc *crtc = k->data; MetaCrtc *crtc = k->data;
if (crtc->config) if (meta_crtc_get_config (crtc))
continue; continue;
kms_update = meta_kms_ensure_pending_update (kms); kms_update = meta_kms_ensure_pending_update (kms);

View File

@ -408,10 +408,10 @@ apply_crtc_assignments (MetaMonitorManager *manager,
{ {
MetaCrtcAssignment *crtc_assignment = crtcs[i]; MetaCrtcAssignment *crtc_assignment = crtcs[i];
MetaCrtc *crtc = crtc_assignment->crtc; MetaCrtc *crtc = crtc_assignment->crtc;
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
int x2, y2; int x2, y2;
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
if (!crtc_config) if (!crtc_config)
continue; continue;
@ -439,7 +439,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
{ {
MetaCrtc *crtc = l->data; MetaCrtc *crtc = l->data;
if (!crtc->config) if (!meta_crtc_get_config (crtc))
continue; continue;
xrandr_set_crtc_config (manager_xrandr, xrandr_set_crtc_config (manager_xrandr,

View File

@ -106,11 +106,11 @@ output_set_underscanning_xrandr (MetaOutput *output,
if (underscanning) if (underscanning)
{ {
MetaCrtc *crtc; MetaCrtc *crtc;
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
uint32_t border_value; uint32_t border_value;
crtc = meta_output_get_assigned_crtc (output); crtc = meta_output_get_assigned_crtc (output);
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
prop = XInternAtom (xdisplay, "underscan hborder", False); prop = XInternAtom (xdisplay, "underscan hborder", False);
border_value = crtc_config->mode->width * 0.05; border_value = crtc_config->mode->width * 0.05;

View File

@ -185,6 +185,7 @@ meta_renderer_x11_nested_create_view (MetaRenderer *renderer,
CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend); CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend);
MetaMonitorTransform view_transform; MetaMonitorTransform view_transform;
float view_scale; float view_scale;
const MetaCrtcConfig *crtc_config;
int width, height; int width, height;
CoglOffscreen *fake_onscreen; CoglOffscreen *fake_onscreen;
CoglOffscreen *offscreen; CoglOffscreen *offscreen;
@ -198,8 +199,9 @@ meta_renderer_x11_nested_create_view (MetaRenderer *renderer,
else else
view_scale = 1.0; view_scale = 1.0;
width = roundf (crtc->config->layout.size.width * view_scale); crtc_config = meta_crtc_get_config (crtc);
height = roundf (crtc->config->layout.size.height * view_scale); width = roundf (crtc_config->layout.size.width * view_scale);
height = roundf (crtc_config->layout.size.height * view_scale);
fake_onscreen = create_offscreen (cogl_context, width, height); fake_onscreen = create_offscreen (cogl_context, width, height);
@ -208,7 +210,7 @@ meta_renderer_x11_nested_create_view (MetaRenderer *renderer,
else else
offscreen = NULL; offscreen = NULL;
meta_rectangle_from_graphene_rect (&crtc->config->layout, meta_rectangle_from_graphene_rect (&crtc_config->layout,
META_ROUNDING_STRATEGY_ROUND, META_ROUNDING_STRATEGY_ROUND,
&view_layout); &view_layout);

View File

@ -109,7 +109,7 @@ draw_view (MetaStageX11Nested *stage_nested,
CoglFramebuffer *onscreen = COGL_FRAMEBUFFER (stage_x11->onscreen); CoglFramebuffer *onscreen = COGL_FRAMEBUFFER (stage_x11->onscreen);
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (renderer_view); ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (renderer_view);
MetaCrtc *crtc; MetaCrtc *crtc;
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
CoglMatrix projection_matrix; CoglMatrix projection_matrix;
CoglMatrix transform; CoglMatrix transform;
float texture_width, texture_height; float texture_width, texture_height;
@ -120,7 +120,7 @@ draw_view (MetaStageX11Nested *stage_nested,
texture_height = cogl_texture_get_height (texture); texture_height = cogl_texture_get_height (texture);
crtc = g_object_get_data (G_OBJECT (renderer_view), "crtc"); crtc = g_object_get_data (G_OBJECT (renderer_view), "crtc");
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
sample_x = 0; sample_x = 0;
sample_y = 0; sample_y = 0;

View File

@ -185,12 +185,12 @@ check_current_monitor_mode (MetaMonitor *monitor,
} }
else else
{ {
MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
MetaLogicalMonitor *logical_monitor; MetaLogicalMonitor *logical_monitor;
g_assert_nonnull (crtc); g_assert_nonnull (crtc);
crtc_config = crtc->config; crtc_config = meta_crtc_get_config (crtc);
g_assert_nonnull (crtc_config); g_assert_nonnull (crtc_config);
g_assert (monitor_crtc_mode->crtc_mode == crtc_config->mode); g_assert (monitor_crtc_mode->crtc_mode == crtc_config->mode);
@ -498,7 +498,7 @@ check_monitor_configuration (MonitorTestCaseExpect *expect)
for (l = crtcs, i = 0; l; l = l->next, i++) for (l = crtcs, i = 0; l; l = l->next, i++)
{ {
MetaCrtc *crtc = l->data; MetaCrtc *crtc = l->data;
MetaCrtcConfig *crtc_config = crtc->config; const MetaCrtcConfig *crtc_config = meta_crtc_get_config (crtc);
if (expect->crtcs[i].current_mode == -1) if (expect->crtcs[i].current_mode == -1)
{ {