summaryrefslogtreecommitdiffstats
path: root/chromium/ui/ozone/platform/dri/dri_wrapper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/ozone/platform/dri/dri_wrapper.cc')
-rw-r--r--chromium/ui/ozone/platform/dri/dri_wrapper.cc164
1 files changed, 164 insertions, 0 deletions
diff --git a/chromium/ui/ozone/platform/dri/dri_wrapper.cc b/chromium/ui/ozone/platform/dri/dri_wrapper.cc
new file mode 100644
index 00000000000..5231bd0ea02
--- /dev/null
+++ b/chromium/ui/ozone/platform/dri/dri_wrapper.cc
@@ -0,0 +1,164 @@
+// 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/dri_wrapper.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <xf86drm.h>
+#include <xf86drmMode.h>
+
+#include "base/logging.h"
+
+namespace ui {
+
+DriWrapper::DriWrapper(const char* device_path) {
+ fd_ = open(device_path, O_RDWR | O_CLOEXEC);
+}
+
+DriWrapper::~DriWrapper() {
+ if (fd_ >= 0)
+ close(fd_);
+}
+
+drmModeCrtc* DriWrapper::GetCrtc(uint32_t crtc_id) {
+ CHECK(fd_ >= 0);
+ return drmModeGetCrtc(fd_, crtc_id);
+}
+
+void DriWrapper::FreeCrtc(drmModeCrtc* crtc) {
+ drmModeFreeCrtc(crtc);
+}
+
+bool DriWrapper::SetCrtc(uint32_t crtc_id,
+ uint32_t framebuffer,
+ uint32_t* connectors,
+ drmModeModeInfo* mode) {
+ CHECK(fd_ >= 0);
+ return !drmModeSetCrtc(fd_, crtc_id, framebuffer, 0, 0, connectors, 1, mode);
+}
+
+bool DriWrapper::SetCrtc(drmModeCrtc* crtc, uint32_t* connectors) {
+ CHECK(fd_ >= 0);
+ return !drmModeSetCrtc(fd_,
+ crtc->crtc_id,
+ crtc->buffer_id,
+ crtc->x,
+ crtc->y,
+ connectors,
+ 1,
+ &crtc->mode);
+}
+
+bool DriWrapper::DisableCrtc(uint32_t crtc_id) {
+ CHECK(fd_ >= 0);
+ return !drmModeSetCrtc(fd_, crtc_id, 0, 0, 0, NULL, 0, NULL);
+}
+
+bool DriWrapper::AddFramebuffer(uint32_t width,
+ uint32_t height,
+ uint8_t depth,
+ uint8_t bpp,
+ uint32_t stride,
+ uint32_t handle,
+ uint32_t* framebuffer) {
+ CHECK(fd_ >= 0);
+ return !drmModeAddFB(fd_,
+ width,
+ height,
+ depth,
+ bpp,
+ stride,
+ handle,
+ framebuffer);
+}
+
+bool DriWrapper::RemoveFramebuffer(uint32_t framebuffer) {
+ CHECK(fd_ >= 0);
+ return !drmModeRmFB(fd_, framebuffer);
+}
+
+bool DriWrapper::PageFlip(uint32_t crtc_id,
+ uint32_t framebuffer,
+ void* data) {
+ CHECK(fd_ >= 0);
+ return !drmModePageFlip(fd_,
+ crtc_id,
+ framebuffer,
+ DRM_MODE_PAGE_FLIP_EVENT,
+ data);
+}
+
+drmModePropertyRes* DriWrapper::GetProperty(drmModeConnector* connector,
+ const char* name) {
+ for (int i = 0; i < connector->count_props; ++i) {
+ drmModePropertyRes* property = drmModeGetProperty(fd_, connector->props[i]);
+ if (!property)
+ continue;
+
+ if (strcmp(property->name, name) == 0)
+ return property;
+
+ drmModeFreeProperty(property);
+ }
+
+ return NULL;
+}
+
+bool DriWrapper::SetProperty(uint32_t connector_id,
+ uint32_t property_id,
+ uint64_t value) {
+ CHECK(fd_ >= 0);
+ return !drmModeConnectorSetProperty(fd_, connector_id, property_id, value);
+}
+
+void DriWrapper::FreeProperty(drmModePropertyRes* prop) {
+ drmModeFreeProperty(prop);
+}
+
+drmModePropertyBlobRes* DriWrapper::GetPropertyBlob(drmModeConnector* connector,
+ const char* name) {
+ CHECK(fd_ >= 0);
+ for (int i = 0; i < connector->count_props; ++i) {
+ drmModePropertyRes* property = drmModeGetProperty(fd_, connector->props[i]);
+ if (!property)
+ continue;
+
+ if (strcmp(property->name, name) == 0 &&
+ property->flags & DRM_MODE_PROP_BLOB) {
+ drmModePropertyBlobRes* blob =
+ drmModeGetPropertyBlob(fd_, connector->prop_values[i]);
+ drmModeFreeProperty(property);
+ return blob;
+ }
+
+ drmModeFreeProperty(property);
+ }
+
+ return NULL;
+}
+
+void DriWrapper::FreePropertyBlob(drmModePropertyBlobRes* blob) {
+ drmModeFreePropertyBlob(blob);
+}
+
+bool DriWrapper::SetCursor(uint32_t crtc_id,
+ uint32_t handle,
+ uint32_t width,
+ uint32_t height) {
+ CHECK(fd_ >= 0);
+ return !drmModeSetCursor(fd_, crtc_id, handle, width, height);
+}
+
+bool DriWrapper::MoveCursor(uint32_t crtc_id, int x, int y) {
+ CHECK(fd_ >= 0);
+ return !drmModeMoveCursor(fd_, crtc_id, x, y);
+}
+
+void DriWrapper::HandleEvent(drmEventContext& event) {
+ CHECK(fd_ >= 0);
+ drmHandleEvent(fd_, &event);
+}
+
+} // namespace ui