kms: Add connector representation

Represents drmModeConnector; both connected and disconnected. Currently
only provides non-changing meta data. MetaOutputKms is changed to use
MetaKmsConnector to get basic metadata, but variable metadata, those
changing depending on what is connected (e.g. physical dimension, EDID,
etc), are still manually retrieved by MetaOutputKms.

https://gitlab.gnome.org/GNOME/mutter/issues/548
https://gitlab.gnome.org/GNOME/mutter/merge_requests/525
This commit is contained in:
Jonas Ådahl
2019-03-08 16:23:15 +01:00
committed by Georges Basile Stavracas Neto
parent 5d5d296551
commit f59d62bc8f
12 changed files with 304 additions and 61 deletions

View File

@@ -29,6 +29,7 @@
#include <string.h>
#include "backends/meta-crtc.h"
#include "backends/native/meta-kms-connector.h"
#include "backends/native/meta-crtc-kms.h"
#include "meta-default-modes.h"
@@ -39,6 +40,8 @@ typedef struct _MetaOutputKms
{
MetaOutput parent;
MetaKmsConnector *kms_connector;
drmModeConnector *connector;
/*
@@ -122,7 +125,7 @@ meta_output_kms_get_connector_id (MetaOutput *output)
{
MetaOutputKms *output_kms = output->driver_private;
return output_kms->connector->connector_id;
return meta_kms_connector_get_id (output_kms->kms_connector);
}
void
@@ -368,39 +371,6 @@ find_connector_properties (MetaGpuKms *gpu_kms,
}
}
static char *
make_output_name (drmModeConnector *connector)
{
static const char * const connector_type_names[] = {
"None",
"VGA",
"DVI-I",
"DVI-D",
"DVI-A",
"Composite",
"SVIDEO",
"LVDS",
"Component",
"DIN",
"DP",
"HDMI",
"HDMI-B",
"TV",
"eDP",
"Virtual",
"DSI",
};
if (connector->connector_type < G_N_ELEMENTS (connector_type_names))
return g_strdup_printf ("%s-%d",
connector_type_names[connector->connector_type],
connector->connector_type_id);
else
return g_strdup_printf ("Unknown%d-%d",
connector->connector_type,
connector->connector_type_id);
}
static void
meta_output_destroy_notify (MetaOutput *output)
{
@@ -544,6 +514,7 @@ init_output_modes (MetaOutput *output,
MetaOutput *
meta_create_kms_output (MetaGpuKms *gpu_kms,
MetaKmsConnector *kms_connector,
drmModeConnector *connector,
MetaKmsResources *resources,
MetaOutput *old_output,
@@ -552,13 +523,14 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
MetaGpu *gpu = META_GPU (gpu_kms);
MetaOutput *output;
MetaOutputKms *output_kms;
uint32_t connector_id;
GArray *crtcs;
GBytes *edid;
GList *l;
unsigned int i;
unsigned int crtc_mask;
int fd;
uint32_t id;
uint32_t gpu_id;
unsigned int n_encoders;
drmModeEncoderPtr *encoders;
drmModeEncoderPtr current_encoder = NULL;
@@ -570,10 +542,11 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
output->driver_notify = (GDestroyNotify) meta_output_destroy_notify;
output->gpu = gpu;
output->name = make_output_name (connector);
output->name = g_strdup (meta_kms_connector_get_name (kms_connector));
id = meta_gpu_kms_get_id (gpu_kms);
output->winsys_id = ((uint64_t) id << 32) | connector->connector_id;
gpu_id = meta_gpu_kms_get_id (gpu_kms);
connector_id = meta_kms_connector_get_id (kms_connector);
output->winsys_id = ((uint64_t) gpu_id << 32) | connector_id;
switch (connector->subpixel)
{
@@ -598,6 +571,8 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
break;
}
output_kms->kms_connector = kms_connector;
output_kms->connector = connector;
find_connector_properties (gpu_kms, output);
@@ -710,8 +685,7 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
meta_output_parse_edid (output, edid);
g_bytes_unref (edid);
/* MetaConnectorType matches DRM's connector types */
output->connector_type = (MetaConnectorType) connector->connector_type;
output->connector_type = meta_kms_connector_get_connector_type (kms_connector);
output_get_tile_info (gpu_kms, output);