summaryrefslogtreecommitdiffstats
path: root/chromium/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc')
-rw-r--r--chromium/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc127
1 files changed, 127 insertions, 0 deletions
diff --git a/chromium/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc b/chromium/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc
new file mode 100644
index 00000000000..b14c590376a
--- /dev/null
+++ b/chromium/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc
@@ -0,0 +1,127 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/dri/chromeos/display_snapshot_dri.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <xf86drmMode.h>
+
+#include "base/format_macros.h"
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
+#include "ui/display/util/edid_parser.h"
+#include "ui/ozone/platform/dri/chromeos/display_mode_dri.h"
+#include "ui/ozone/platform/dri/dri_util.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
+
+namespace ui {
+
+namespace {
+
+DisplayConnectionType GetDisplayType(drmModeConnector* connector) {
+ switch (connector->connector_type) {
+ case DRM_MODE_CONNECTOR_VGA:
+ return DISPLAY_CONNECTION_TYPE_VGA;
+ case DRM_MODE_CONNECTOR_DVII:
+ case DRM_MODE_CONNECTOR_DVID:
+ case DRM_MODE_CONNECTOR_DVIA:
+ return DISPLAY_CONNECTION_TYPE_DVI;
+ case DRM_MODE_CONNECTOR_LVDS:
+ case DRM_MODE_CONNECTOR_eDP:
+ return DISPLAY_CONNECTION_TYPE_INTERNAL;
+ case DRM_MODE_CONNECTOR_DisplayPort:
+ return DISPLAY_CONNECTION_TYPE_DISPLAYPORT;
+ case DRM_MODE_CONNECTOR_HDMIA:
+ case DRM_MODE_CONNECTOR_HDMIB:
+ return DISPLAY_CONNECTION_TYPE_HDMI;
+ default:
+ return DISPLAY_CONNECTION_TYPE_UNKNOWN;
+ }
+}
+
+bool IsAspectPreserving(DriWrapper* drm, drmModeConnector* connector) {
+ drmModePropertyRes* property = drm->GetProperty(connector, "scaling mode");
+ if (property) {
+ for (int j = 0; j < property->count_enums; ++j) {
+ if (property->enums[j].value ==
+ connector->prop_values[property->prop_id] &&
+ strcmp(property->enums[j].name, "Full aspect") == 0) {
+ drm->FreeProperty(property);
+ return true;
+ }
+ }
+
+ drm->FreeProperty(property);
+ }
+
+ return false;
+}
+
+} // namespace
+
+DisplaySnapshotDri::DisplaySnapshotDri(
+ DriWrapper* drm,
+ drmModeConnector* connector,
+ drmModeCrtc* crtc,
+ uint32_t index)
+ : DisplaySnapshot(index,
+ false,
+ gfx::Point(crtc->x, crtc->y),
+ gfx::Size(connector->mmWidth, connector->mmHeight),
+ GetDisplayType(connector),
+ IsAspectPreserving(drm, connector),
+ false,
+ std::string(),
+ std::vector<const DisplayMode*>(),
+ NULL,
+ NULL),
+ connector_(connector->connector_id),
+ crtc_(crtc->crtc_id),
+ dpms_property_(drm->GetProperty(connector, "DPMS")) {
+ drmModePropertyBlobRes* edid_blob = drm->GetPropertyBlob(connector, "EDID");
+
+ if (edid_blob) {
+ std::vector<uint8_t> edid(
+ static_cast<uint8_t*>(edid_blob->data),
+ static_cast<uint8_t*>(edid_blob->data) + edid_blob->length);
+
+ has_proper_display_id_ = GetDisplayIdFromEDID(edid, index, &display_id_);
+ ParseOutputDeviceData(edid, NULL, &display_name_);
+ ParseOutputOverscanFlag(edid, &overscan_flag_);
+
+ drm->FreePropertyBlob(edid_blob);
+ } else {
+ VLOG(1) << "Failed to get EDID blob for connector "
+ << connector->connector_id;
+ }
+
+ for (int i = 0; i < connector->count_modes; ++i) {
+ drmModeModeInfo& mode = connector->modes[i];
+ modes_.push_back(new DisplayModeDri(mode));
+
+ if (crtc->mode_valid && SameMode(crtc->mode, mode))
+ current_mode_ = modes_.back();
+
+ if (mode.type & DRM_MODE_TYPE_PREFERRED)
+ native_mode_ = modes_.back();
+ }
+}
+
+DisplaySnapshotDri::~DisplaySnapshotDri() {
+ if (dpms_property_)
+ drmModeFreeProperty(dpms_property_);
+}
+
+std::string DisplaySnapshotDri::ToString() const {
+ return base::StringPrintf(
+ "[type=%d, connector=%" PRIu32 ", crtc=%" PRIu32 ", mode=%s, dim=%s]",
+ type_,
+ connector_,
+ crtc_,
+ current_mode_ ? current_mode_->ToString().c_str() : "NULL",
+ physical_size_.ToString().c_str());
+}
+
+} // namespace ui