monitor-manager: Make MetaCrtc a GObject

Turn MetaCrtc into a GObject and move it to a separate file. This
changes the storage format, resulting in changing the API for accessing
MetaCrtcs from using an array, to using a GList.

https://bugzilla.gnome.org/show_bug.cgi?id=785381
This commit is contained in:
Jonas Ådahl
2017-03-28 12:35:19 +08:00
parent 39bc2e0333
commit f64fab1d2d
17 changed files with 299 additions and 191 deletions

View File

@@ -25,6 +25,7 @@
#include "meta-monitor-manager-kms.h"
#include "meta-monitor-config-manager.h"
#include "meta-crtc.h"
#include "meta-output.h"
#include "meta-backend-private.h"
#include "meta-renderer-native.h"
@@ -663,13 +664,15 @@ add_common_modes (MetaMonitorManager *manager,
g_ptr_array_free (array, TRUE);
}
static void
init_crtc (MetaCrtc *crtc,
MetaMonitorManager *manager,
drmModeCrtc *drm_crtc)
static MetaCrtc *
create_crtc (MetaMonitorManager *manager,
drmModeCrtc *drm_crtc)
{
MetaCrtc *crtc;
unsigned int i;
crtc = g_object_new (META_TYPE_CRTC, NULL);
crtc->crtc_id = drm_crtc->crtc_id;
crtc->rect.x = drm_crtc->x;
crtc->rect.y = drm_crtc->y;
@@ -694,6 +697,8 @@ init_crtc (MetaCrtc *crtc,
crtc->driver_private = g_new0 (MetaCrtcKms, 1);
crtc->driver_notify = (GDestroyNotify) meta_crtc_destroy_notify;
return crtc;
}
static MetaOutput *
@@ -706,6 +711,7 @@ create_output (MetaMonitorManager *manager,
MetaOutputKms *output_kms;
GArray *crtcs;
GBytes *edid;
GList *l;
unsigned int i;
unsigned int crtc_mask;
@@ -791,11 +797,12 @@ create_output (MetaMonitorManager *manager,
crtcs = g_array_new (FALSE, FALSE, sizeof (MetaCrtc*));
for (i = 0; i < manager->n_crtcs; i++)
for (l = manager->crtcs, i = 0; l; l = l->next, i++)
{
if (crtc_mask & (1 << i))
{
MetaCrtc *crtc = &manager->crtcs[i];
MetaCrtc *crtc = l->data;
g_array_append_val (crtcs, crtc);
}
}
@@ -805,11 +812,13 @@ create_output (MetaMonitorManager *manager,
if (output_kms->current_encoder && output_kms->current_encoder->crtc_id != 0)
{
for (i = 0; i < manager->n_crtcs; i++)
for (l = manager->crtcs; l; l = l->next)
{
if (manager->crtcs[i].crtc_id == output_kms->current_encoder->crtc_id)
MetaCrtc *crtc = l->data;
if (crtc->crtc_id == output_kms->current_encoder->crtc_id)
{
output->crtc = &manager->crtcs[i];
output->crtc = crtc;
break;
}
}
@@ -1041,8 +1050,7 @@ init_crtcs (MetaMonitorManager *manager,
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
unsigned int i;
manager->n_crtcs = resources->count_crtcs;
manager->crtcs = g_new0 (MetaCrtc, manager->n_crtcs);
manager->crtcs = NULL;
for (i = 0; i < (unsigned)resources->count_crtcs; i++)
{
@@ -1051,13 +1059,13 @@ init_crtcs (MetaMonitorManager *manager,
drm_crtc = drmModeGetCrtc (manager_kms->fd, resources->crtcs[i]);
crtc = &manager->crtcs[i];
init_crtc (crtc, manager, drm_crtc);
crtc = create_crtc (manager, drm_crtc);
find_crtc_properties (manager_kms, crtc);
init_crtc_rotations (manager, crtc, i);
drmModeFreeCrtc (drm_crtc);
manager->crtcs = g_list_append (manager->crtcs, crtc);
}
}
@@ -1327,9 +1335,9 @@ apply_crtc_assignments (MetaMonitorManager *manager,
}
/* Disable CRTCs not mentioned in the list (they have is_dirty == FALSE,
because they weren't seen in the first loop) */
for (i = 0; i < manager->n_crtcs; i++)
for (l = manager->crtcs; l; l = l->next)
{
MetaCrtc *crtc = &manager->crtcs[i];
MetaCrtc *crtc = l->data;
crtc->logical_monitor = NULL;

View File

@@ -48,6 +48,7 @@
#include <xf86drm.h>
#include "backends/meta-backend-private.h"
#include "backends/meta-crtc.h"
#include "backends/meta-egl.h"
#include "backends/meta-egl-ext.h"
#include "backends/meta-logical-monitor.h"
@@ -683,11 +684,13 @@ meta_onscreen_native_set_crtc_modes (MetaOnscreenNative *onscreen_native)
}
else
{
unsigned int i;
GList *crtcs;
GList *l;
for (i = 0; i < monitor_manager->n_crtcs; i++)
crtcs = meta_monitor_manager_get_crtcs (monitor_manager);
for (l = crtcs; l; l = l->next)
{
MetaCrtc *crtc = &monitor_manager->crtcs[i];
MetaCrtc *crtc = l->data;
meta_monitor_manager_kms_apply_crtc_mode (monitor_manager_kms,
crtc,
@@ -768,11 +771,13 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
}
else
{
unsigned int i;
GList *crtcs;
GList *l;
for (i = 0; i < monitor_manager->n_crtcs; i++)
crtcs = meta_monitor_manager_get_crtcs (monitor_manager);
for (l = crtcs; l; l = l->next)
{
MetaCrtc *crtc = &monitor_manager->crtcs[i];
MetaCrtc *crtc = l->data;
meta_onscreen_native_flip_crtc (onscreen_native, flip_closure,
crtc, crtc->rect.x, crtc->rect.y,
@@ -1827,11 +1832,13 @@ meta_renderer_native_finish_frame (MetaRendererNative *renderer_native)
meta_backend_get_monitor_manager (backend);
MetaMonitorManagerKms *monitor_manager_kms =
META_MONITOR_MANAGER_KMS (monitor_manager);
unsigned int i;
GList *crtcs;
GList *l;
for (i = 0; i < monitor_manager->n_crtcs; i++)
crtcs = meta_monitor_manager_get_crtcs (monitor_manager);
for (l = crtcs; l; l = l->next)
{
MetaCrtc *crtc = &monitor_manager->crtcs[i];
MetaCrtc *crtc = l->data;
if (crtc->current_mode)
continue;