1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/ozone/platform/dri/hardware_display_plane_manager.h"
6
7#include <drm.h>
8#include <errno.h>
9#include <xf86drm.h>
10
11#include "base/logging.h"
12#include "ui/gfx/geometry/rect.h"
13#include "ui/ozone/platform/dri/dri_wrapper.h"
14
15namespace ui {
16
17HardwareDisplayPlaneManager::HardwareDisplayPlaneManager(DriWrapper* drm)
18    : drm_(drm), property_set_(NULL) {
19}
20
21HardwareDisplayPlaneManager::~HardwareDisplayPlaneManager() {
22  if (property_set_)
23    drmModePropertySetFree(property_set_);
24}
25
26bool HardwareDisplayPlaneManager::Initialize() {
27  ScopedDrmPlaneResPtr plane_resources(
28      drmModeGetPlaneResources(drm_->get_fd()));
29  if (!plane_resources) {
30    LOG(ERROR) << "Failed to get plane resources.";
31    return false;
32  }
33
34  property_set_ = drmModePropertySetAlloc();
35  if (!property_set_) {
36    LOG(ERROR) << "Failed to allocate property set.";
37    return false;
38  }
39
40  uint32_t num_planes = plane_resources->count_planes;
41  for (uint32_t i = 0; i < num_planes; ++i) {
42    ScopedDrmPlanePtr drm_plane(
43        drmModeGetPlane(drm_->get_fd(), plane_resources->planes[i]));
44    if (!drm_plane) {
45      LOG(ERROR) << "Failed to get plane " << i << ".";
46      return false;
47    }
48    scoped_ptr<HardwareDisplayPlane> plane(
49        new HardwareDisplayPlane(drm_, property_set_, drm_plane.Pass()));
50    if (plane->Initialize())
51      planes_.push_back(plane.release());
52  }
53
54  return true;
55}
56
57}  // namespace ui
58