backends: Make KMS EDID information equal to X11's
EDID parsing has been refactored to a common meta_output_parse_edid() function, which ensures the extracted information is the same on both KMS and X11 backend, so it can be used consistently on eg. settings values. https://bugzilla.gnome.org/show_bug.cgi?id=742882
This commit is contained in:
parent
f71315eb1e
commit
625d3de2ee
4 changed files with 38 additions and 46 deletions
|
@ -35,6 +35,7 @@
|
||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include "util-private.h"
|
#include "util-private.h"
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
|
#include "edid.h"
|
||||||
#include "meta-monitor-config.h"
|
#include "meta-monitor-config.h"
|
||||||
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
||||||
#include "meta-backend-private.h"
|
#include "meta-backend-private.h"
|
||||||
|
@ -1210,6 +1211,38 @@ meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager)
|
||||||
g_free (old_monitor_infos);
|
g_free (old_monitor_infos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_output_parse_edid (MetaOutput *meta_output,
|
||||||
|
GBytes *edid)
|
||||||
|
{
|
||||||
|
MonitorInfo *parsed_edid;
|
||||||
|
gsize len;
|
||||||
|
|
||||||
|
parsed_edid = decode_edid (g_bytes_get_data (edid, &len));
|
||||||
|
|
||||||
|
if (parsed_edid)
|
||||||
|
{
|
||||||
|
meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4);
|
||||||
|
if (parsed_edid->dsc_product_name[0])
|
||||||
|
meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14);
|
||||||
|
else
|
||||||
|
meta_output->product = g_strdup_printf ("0x%04x", (unsigned) parsed_edid->product_code);
|
||||||
|
if (parsed_edid->dsc_serial_number[0])
|
||||||
|
meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14);
|
||||||
|
else
|
||||||
|
meta_output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number);
|
||||||
|
|
||||||
|
g_free (parsed_edid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!meta_output->vendor)
|
||||||
|
{
|
||||||
|
meta_output->vendor = g_strdup ("unknown");
|
||||||
|
meta_output->product = g_strdup ("unknown");
|
||||||
|
meta_output->serial = g_strdup ("unknown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_monitor_manager_on_hotplug (MetaMonitorManager *manager)
|
meta_monitor_manager_on_hotplug (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
|
|
|
@ -361,6 +361,9 @@ void meta_monitor_manager_apply_configuration (MetaMonitorManager
|
||||||
void meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager,
|
void meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager,
|
||||||
gboolean ok);
|
gboolean ok);
|
||||||
|
|
||||||
|
void meta_output_parse_edid (MetaOutput *output,
|
||||||
|
GBytes *edid);
|
||||||
|
|
||||||
void meta_crtc_info_free (MetaCRTCInfo *info);
|
void meta_crtc_info_free (MetaCRTCInfo *info);
|
||||||
void meta_output_info_free (MetaOutputInfo *info);
|
void meta_output_info_free (MetaOutputInfo *info);
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,6 @@
|
||||||
|
|
||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "edid.h"
|
|
||||||
|
|
||||||
#include <gudev/gudev.h>
|
#include <gudev/gudev.h>
|
||||||
|
|
||||||
|
@ -515,27 +514,9 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
||||||
edid = read_output_edid (manager_kms, meta_output);
|
edid = read_output_edid (manager_kms, meta_output);
|
||||||
if (edid)
|
if (edid)
|
||||||
{
|
{
|
||||||
MonitorInfo *parsed_edid;
|
meta_output_parse_edid (meta_output, edid);
|
||||||
gsize len;
|
|
||||||
|
|
||||||
parsed_edid = decode_edid (g_bytes_get_data (edid, &len));
|
|
||||||
if (parsed_edid)
|
|
||||||
{
|
|
||||||
meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4);
|
|
||||||
meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14);
|
|
||||||
meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14);
|
|
||||||
|
|
||||||
g_free (parsed_edid);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_bytes_unref (edid);
|
g_bytes_unref (edid);
|
||||||
}
|
}
|
||||||
if (!meta_output->vendor)
|
|
||||||
{
|
|
||||||
meta_output->vendor = g_strdup ("unknown");
|
|
||||||
meta_output->product = g_strdup ("unknown");
|
|
||||||
meta_output->serial = g_strdup ("unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MetaConnectorType matches DRM's connector types */
|
/* MetaConnectorType matches DRM's connector types */
|
||||||
meta_output->connector_type = (MetaConnectorType) connector->connector_type;
|
meta_output->connector_type = (MetaConnectorType) connector->connector_type;
|
||||||
|
|
|
@ -41,7 +41,6 @@
|
||||||
#include "meta-backend-x11.h"
|
#include "meta-backend-x11.h"
|
||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "edid.h"
|
|
||||||
#include "meta-monitor-config.h"
|
#include "meta-monitor-config.h"
|
||||||
|
|
||||||
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
||||||
|
@ -689,7 +688,6 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
||||||
if (output->connection != RR_Disconnected)
|
if (output->connection != RR_Disconnected)
|
||||||
{
|
{
|
||||||
GBytes *edid;
|
GBytes *edid;
|
||||||
MonitorInfo *parsed_edid;
|
|
||||||
|
|
||||||
meta_output->winsys_id = resources->outputs[i];
|
meta_output->winsys_id = resources->outputs[i];
|
||||||
meta_output->name = g_strdup (output->name);
|
meta_output->name = g_strdup (output->name);
|
||||||
|
@ -697,33 +695,10 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
||||||
edid = read_output_edid (manager_xrandr, meta_output->winsys_id);
|
edid = read_output_edid (manager_xrandr, meta_output->winsys_id);
|
||||||
if (edid)
|
if (edid)
|
||||||
{
|
{
|
||||||
gsize len;
|
meta_output_parse_edid (meta_output, edid);
|
||||||
|
|
||||||
parsed_edid = decode_edid (g_bytes_get_data (edid, &len));
|
|
||||||
if (parsed_edid)
|
|
||||||
{
|
|
||||||
meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4);
|
|
||||||
if (parsed_edid->dsc_product_name[0])
|
|
||||||
meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14);
|
|
||||||
else
|
|
||||||
meta_output->product = g_strdup_printf ("0x%04x", (unsigned)parsed_edid->product_code);
|
|
||||||
if (parsed_edid->dsc_serial_number[0])
|
|
||||||
meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14);
|
|
||||||
else
|
|
||||||
meta_output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number);
|
|
||||||
|
|
||||||
g_free (parsed_edid);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_bytes_unref (edid);
|
g_bytes_unref (edid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!meta_output->vendor)
|
|
||||||
{
|
|
||||||
meta_output->vendor = g_strdup ("unknown");
|
|
||||||
meta_output->product = g_strdup ("unknown");
|
|
||||||
meta_output->serial = g_strdup ("unknown");
|
|
||||||
}
|
|
||||||
meta_output->width_mm = output->mm_width;
|
meta_output->width_mm = output->mm_width;
|
||||||
meta_output->height_mm = output->mm_height;
|
meta_output->height_mm = output->mm_height;
|
||||||
meta_output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
meta_output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||||
|
|
Loading…
Reference in a new issue