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.
5 #include "ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h"
8 #include "ui/display/types/chromeos/native_display_observer.h"
9 #include "ui/events/ozone/device/device_event.h"
10 #include "ui/events/ozone/device/device_manager.h"
11 #include "ui/ozone/platform/dri/chromeos/display_mode_dri.h"
12 #include "ui/ozone/platform/dri/chromeos/display_snapshot_dri.h"
13 #include "ui/ozone/platform/dri/dri_surface_factory.h"
14 #include "ui/ozone/platform/dri/dri_util.h"
15 #include "ui/ozone/platform/dri/dri_wrapper.h"
20 const size_t kMaxDisplayCount = 2;
23 NativeDisplayDelegateDri::NativeDisplayDelegateDri(
24 DriSurfaceFactory* surface_factory, DeviceManager* device_manager)
25 : surface_factory_(surface_factory),
26 device_manager_(device_manager) {}
28 NativeDisplayDelegateDri::~NativeDisplayDelegateDri() {
29 device_manager_->RemoveObserver(this);
32 void NativeDisplayDelegateDri::Initialize() {
33 gfx::SurfaceFactoryOzone::HardwareState state =
34 surface_factory_->InitializeHardware();
36 CHECK_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, state)
37 << "Failed to initialize hardware";
39 device_manager_->AddObserver(this);
42 void NativeDisplayDelegateDri::GrabServer() {}
44 void NativeDisplayDelegateDri::UngrabServer() {}
46 void NativeDisplayDelegateDri::SyncWithServer() {}
48 void NativeDisplayDelegateDri::SetBackgroundColor(uint32_t color_argb) {
52 void NativeDisplayDelegateDri::ForceDPMSOn() {
53 for (size_t i = 0; i < cached_displays_.size(); ++i) {
54 DisplaySnapshotDri* dri_output = cached_displays_[i];
55 if (dri_output->dpms_property())
56 surface_factory_->drm()->SetProperty(
57 dri_output->connector(),
58 dri_output->dpms_property()->prop_id,
63 std::vector<DisplaySnapshot*> NativeDisplayDelegateDri::GetDisplays() {
64 ScopedVector<DisplaySnapshotDri> old_displays(cached_displays_.Pass());
65 cached_modes_.clear();
67 drmModeRes* resources = drmModeGetResources(
68 surface_factory_->drm()->get_fd());
69 DCHECK(resources) << "Failed to get DRM resources";
70 ScopedVector<HardwareDisplayControllerInfo> displays =
71 GetAvailableDisplayControllerInfos(
72 surface_factory_->drm()->get_fd(),
75 i < displays.size() && cached_displays_.size() < kMaxDisplayCount; ++i) {
76 DisplaySnapshotDri* display = new DisplaySnapshotDri(
77 surface_factory_->drm(),
78 displays[i]->connector(),
81 cached_displays_.push_back(display);
82 // Modes can be shared between different displays, so we need to keep track
83 // of them independently for cleanup.
84 cached_modes_.insert(cached_modes_.end(),
85 display->modes().begin(),
86 display->modes().end());
89 drmModeFreeResources(resources);
91 for (size_t i = 0; i < old_displays.size(); ++i) {
93 for (size_t j = 0; j < cached_displays_.size(); ++j) {
94 if (old_displays[i]->connector() == cached_displays_[j]->connector() &&
95 old_displays[i]->crtc() == cached_displays_[j]->crtc()) {
102 surface_factory_->DestroyHardwareDisplayController(
103 old_displays[i]->connector(), old_displays[i]->crtc());
107 std::vector<DisplaySnapshot*> generic_displays(cached_displays_.begin(),
108 cached_displays_.end());
109 return generic_displays;
112 void NativeDisplayDelegateDri::AddMode(const DisplaySnapshot& output,
113 const DisplayMode* mode) {}
115 bool NativeDisplayDelegateDri::Configure(const DisplaySnapshot& output,
116 const DisplayMode* mode,
117 const gfx::Point& origin) {
118 const DisplaySnapshotDri& dri_output =
119 static_cast<const DisplaySnapshotDri&>(output);
121 VLOG(1) << "DRM configuring: crtc=" << dri_output.crtc()
122 << " connector=" << dri_output.connector()
123 << " origin=" << origin.ToString()
124 << " size=" << mode->size().ToString();
127 if (!surface_factory_->CreateHardwareDisplayController(
128 dri_output.connector(),
130 static_cast<const DisplayModeDri*>(mode)->mode_info())) {
131 VLOG(1) << "Failed to configure: crtc=" << dri_output.crtc()
132 << " connector=" << dri_output.connector();
136 if (!surface_factory_->DisableHardwareDisplayController(
137 dri_output.crtc())) {
138 VLOG(1) << "Failed to disable crtc=" << dri_output.crtc();
146 void NativeDisplayDelegateDri::CreateFrameBuffer(const gfx::Size& size) {}
148 bool NativeDisplayDelegateDri::GetHDCPState(const DisplaySnapshot& output,
154 bool NativeDisplayDelegateDri::SetHDCPState(const DisplaySnapshot& output,
160 std::vector<ui::ColorCalibrationProfile>
161 NativeDisplayDelegateDri::GetAvailableColorCalibrationProfiles(
162 const ui::DisplaySnapshot& output) {
164 return std::vector<ui::ColorCalibrationProfile>();
167 bool NativeDisplayDelegateDri::SetColorCalibrationProfile(
168 const ui::DisplaySnapshot& output,
169 ui::ColorCalibrationProfile new_profile) {
174 void NativeDisplayDelegateDri::AddObserver(NativeDisplayObserver* observer) {
175 observers_.AddObserver(observer);
178 void NativeDisplayDelegateDri::RemoveObserver(NativeDisplayObserver* observer) {
179 observers_.RemoveObserver(observer);
182 void NativeDisplayDelegateDri::OnDeviceEvent(const DeviceEvent& event) {
183 if (event.device_type() != DeviceEvent::DISPLAY)
186 if (event.action_type() == DeviceEvent::CHANGE) {
187 VLOG(1) << "Got display changed event";
189 NativeDisplayObserver, observers_, OnConfigurationChanged());