Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1473)

Side by Side Diff: ui/ozone/platform/dri/native_display_delegate_dri.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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/native_display_delegate_dri.h"
6
7 #include "base/bind.h"
8 #include "third_party/skia/include/core/SkCanvas.h"
9 #include "ui/display/types/native_display_observer.h"
10 #include "ui/events/ozone/device/device_event.h"
11 #include "ui/events/ozone/device/device_manager.h"
12 #include "ui/ozone/platform/dri/display_mode_dri.h"
13 #include "ui/ozone/platform/dri/display_snapshot_dri.h"
14 #include "ui/ozone/platform/dri/dri_console_buffer.h"
15 #include "ui/ozone/platform/dri/dri_util.h"
16 #include "ui/ozone/platform/dri/dri_wrapper.h"
17 #include "ui/ozone/platform/dri/screen_manager.h"
18
19 namespace ui {
20
21 namespace {
22
23 const size_t kMaxDisplayCount = 2;
24
25 const char kContentProtection[] = "Content Protection";
26
27 struct ContentProtectionMapping {
28 const char* name;
29 HDCPState state;
30 };
31
32 const ContentProtectionMapping kContentProtectionStates[] = {
33 {"Undesired", HDCP_STATE_UNDESIRED},
34 {"Desired", HDCP_STATE_DESIRED},
35 {"Enabled", HDCP_STATE_ENABLED}};
36
37 uint32_t GetContentProtectionValue(drmModePropertyRes* property,
38 HDCPState state) {
39 std::string name;
40 for (size_t i = 0; i < arraysize(kContentProtectionStates); ++i) {
41 if (kContentProtectionStates[i].state == state) {
42 name = kContentProtectionStates[i].name;
43 break;
44 }
45 }
46
47 for (int i = 0; i < property->count_enums; ++i)
48 if (name == property->enums[i].name)
49 return i;
50
51 NOTREACHED();
52 return 0;
53 }
54
55 class DisplaySnapshotComparator {
56 public:
57 DisplaySnapshotComparator(const DisplaySnapshotDri* snapshot)
58 : snapshot_(snapshot) {}
59
60 bool operator()(const DisplaySnapshotDri* other) const {
61 if (snapshot_->connector() == other->connector() &&
62 snapshot_->crtc() == other->crtc())
63 return true;
64
65 return false;
66 }
67
68 private:
69 const DisplaySnapshotDri* snapshot_;
70 };
71
72 } // namespace
73
74 NativeDisplayDelegateDri::NativeDisplayDelegateDri(
75 DriWrapper* dri,
76 ScreenManager* screen_manager,
77 DeviceManager* device_manager)
78 : dri_(dri),
79 screen_manager_(screen_manager),
80 device_manager_(device_manager) {
81 // TODO(dnicoara): Remove when async display configuration is supported.
82 screen_manager_->ForceInitializationOfPrimaryDisplay();
83 }
84
85 NativeDisplayDelegateDri::~NativeDisplayDelegateDri() {
86 if (device_manager_)
87 device_manager_->RemoveObserver(this);
88 }
89
90 DisplaySnapshot* NativeDisplayDelegateDri::FindDisplaySnapshot(int64_t id) {
91 for (size_t i = 0; i < cached_displays_.size(); ++i)
92 if (cached_displays_[i]->display_id() == id)
93 return cached_displays_[i];
94
95 return NULL;
96 }
97
98 const DisplayMode* NativeDisplayDelegateDri::FindDisplayMode(
99 const gfx::Size& size,
100 bool is_interlaced,
101 float refresh_rate) {
102 for (size_t i = 0; i < cached_modes_.size(); ++i)
103 if (cached_modes_[i]->size() == size &&
104 cached_modes_[i]->is_interlaced() == is_interlaced &&
105 cached_modes_[i]->refresh_rate() == refresh_rate)
106 return cached_modes_[i];
107
108 return NULL;
109 }
110
111 void NativeDisplayDelegateDri::Initialize() {
112 if (device_manager_)
113 device_manager_->AddObserver(this);
114
115 ScopedVector<HardwareDisplayControllerInfo> displays =
116 GetAvailableDisplayControllerInfos(dri_->get_fd());
117
118 // By default all displays show the same console buffer.
119 console_buffer_.reset(
120 new DriConsoleBuffer(dri_, displays[0]->crtc()->buffer_id));
121 if (!console_buffer_->Initialize()) {
122 VLOG(1) << "Failed to initialize console buffer";
123 console_buffer_.reset();
124 } else {
125 // Clear the console buffer such that restarting Chrome will show a
126 // predetermined background.
127 //
128 // Black was chosen since Chrome's first buffer paints start with a black
129 // background.
130 console_buffer_->canvas()->clear(SK_ColorBLACK);
131 }
132 }
133
134 void NativeDisplayDelegateDri::GrabServer() {
135 }
136
137 void NativeDisplayDelegateDri::UngrabServer() {
138 }
139
140 void NativeDisplayDelegateDri::SyncWithServer() {
141 }
142
143 void NativeDisplayDelegateDri::SetBackgroundColor(uint32_t color_argb) {
144 if (console_buffer_)
145 console_buffer_->canvas()->clear(color_argb);
146 }
147
148 void NativeDisplayDelegateDri::ForceDPMSOn() {
149 for (size_t i = 0; i < cached_displays_.size(); ++i) {
150 DisplaySnapshotDri* dri_output = cached_displays_[i];
151 if (dri_output->dpms_property())
152 dri_->SetProperty(dri_output->connector(),
153 dri_output->dpms_property()->prop_id,
154 DRM_MODE_DPMS_ON);
155 }
156 }
157
158 std::vector<DisplaySnapshot*> NativeDisplayDelegateDri::GetDisplays() {
159 ScopedVector<DisplaySnapshotDri> old_displays(cached_displays_.Pass());
160 cached_modes_.clear();
161
162 ScopedVector<HardwareDisplayControllerInfo> displays =
163 GetAvailableDisplayControllerInfos(dri_->get_fd());
164 for (size_t i = 0;
165 i < displays.size() && cached_displays_.size() < kMaxDisplayCount;
166 ++i) {
167 DisplaySnapshotDri* display = new DisplaySnapshotDri(
168 dri_, displays[i]->connector(), displays[i]->crtc(), i);
169 cached_displays_.push_back(display);
170 cached_modes_.insert(
171 cached_modes_.end(), display->modes().begin(), display->modes().end());
172 }
173
174 NotifyScreenManager(cached_displays_.get(), old_displays.get());
175
176 std::vector<DisplaySnapshot*> generic_displays(cached_displays_.begin(),
177 cached_displays_.end());
178 return generic_displays;
179 }
180
181 void NativeDisplayDelegateDri::AddMode(const DisplaySnapshot& output,
182 const DisplayMode* mode) {
183 }
184
185 bool NativeDisplayDelegateDri::Configure(const DisplaySnapshot& output,
186 const DisplayMode* mode,
187 const gfx::Point& origin) {
188 const DisplaySnapshotDri& dri_output =
189 static_cast<const DisplaySnapshotDri&>(output);
190
191 VLOG(1) << "DRM configuring: crtc=" << dri_output.crtc()
192 << " connector=" << dri_output.connector()
193 << " origin=" << origin.ToString()
194 << " size=" << (mode ? mode->size().ToString() : "0x0");
195
196 if (mode) {
197 if (!screen_manager_->ConfigureDisplayController(
198 dri_output.crtc(),
199 dri_output.connector(),
200 origin,
201 static_cast<const DisplayModeDri*>(mode)->mode_info())) {
202 VLOG(1) << "Failed to configure: crtc=" << dri_output.crtc()
203 << " connector=" << dri_output.connector();
204 return false;
205 }
206 } else {
207 if (!screen_manager_->DisableDisplayController(dri_output.crtc())) {
208 VLOG(1) << "Failed to disable crtc=" << dri_output.crtc();
209 return false;
210 }
211 }
212
213 return true;
214 }
215
216 void NativeDisplayDelegateDri::CreateFrameBuffer(const gfx::Size& size) {
217 }
218
219 bool NativeDisplayDelegateDri::GetHDCPState(const DisplaySnapshot& output,
220 HDCPState* state) {
221 const DisplaySnapshotDri& dri_output =
222 static_cast<const DisplaySnapshotDri&>(output);
223
224 ScopedDrmConnectorPtr connector(dri_->GetConnector(dri_output.connector()));
225 if (!connector) {
226 LOG(ERROR) << "Failed to get connector " << dri_output.connector();
227 return false;
228 }
229
230 ScopedDrmPropertyPtr hdcp_property(
231 dri_->GetProperty(connector.get(), kContentProtection));
232 if (!hdcp_property) {
233 LOG(ERROR) << "'" << kContentProtection << "' property doesn't exist.";
234 return false;
235 }
236
237 DCHECK_LT(static_cast<int>(hdcp_property->prop_id), connector->count_props);
238 int hdcp_state_idx = connector->prop_values[hdcp_property->prop_id];
239 DCHECK_LT(hdcp_state_idx, hdcp_property->count_enums);
240
241 std::string name(hdcp_property->enums[hdcp_state_idx].name);
242 for (size_t i = 0; i < arraysize(kContentProtectionStates); ++i) {
243 if (name == kContentProtectionStates[i].name) {
244 *state = kContentProtectionStates[i].state;
245 VLOG(3) << "HDCP state: " << *state << " (" << name << ")";
246 return true;
247 }
248 }
249
250 LOG(ERROR) << "Unknown content protection value '" << name << "'";
251 return false;
252 }
253
254 bool NativeDisplayDelegateDri::SetHDCPState(const DisplaySnapshot& output,
255 HDCPState state) {
256 const DisplaySnapshotDri& dri_output =
257 static_cast<const DisplaySnapshotDri&>(output);
258
259 ScopedDrmConnectorPtr connector(dri_->GetConnector(dri_output.connector()));
260 if (!connector) {
261 LOG(ERROR) << "Failed to get connector " << dri_output.connector();
262 return false;
263 }
264
265 ScopedDrmPropertyPtr hdcp_property(
266 dri_->GetProperty(connector.get(), kContentProtection));
267 if (!hdcp_property) {
268 LOG(ERROR) << "'" << kContentProtection << "' property doesn't exist.";
269 return false;
270 }
271
272 return dri_->SetProperty(
273 dri_output.connector(),
274 hdcp_property->prop_id,
275 GetContentProtectionValue(hdcp_property.get(), state));
276 }
277
278 std::vector<ui::ColorCalibrationProfile>
279 NativeDisplayDelegateDri::GetAvailableColorCalibrationProfiles(
280 const ui::DisplaySnapshot& output) {
281 NOTIMPLEMENTED();
282 return std::vector<ui::ColorCalibrationProfile>();
283 }
284
285 bool NativeDisplayDelegateDri::SetColorCalibrationProfile(
286 const ui::DisplaySnapshot& output,
287 ui::ColorCalibrationProfile new_profile) {
288 NOTIMPLEMENTED();
289 return false;
290 }
291
292 void NativeDisplayDelegateDri::AddObserver(NativeDisplayObserver* observer) {
293 observers_.AddObserver(observer);
294 }
295
296 void NativeDisplayDelegateDri::RemoveObserver(NativeDisplayObserver* observer) {
297 observers_.RemoveObserver(observer);
298 }
299
300 void NativeDisplayDelegateDri::OnDeviceEvent(const DeviceEvent& event) {
301 if (event.device_type() != DeviceEvent::DISPLAY)
302 return;
303
304 if (event.action_type() == DeviceEvent::CHANGE) {
305 VLOG(1) << "Got display changed event";
306 FOR_EACH_OBSERVER(
307 NativeDisplayObserver, observers_, OnConfigurationChanged());
308 }
309 }
310
311 void NativeDisplayDelegateDri::NotifyScreenManager(
312 const std::vector<DisplaySnapshotDri*>& new_displays,
313 const std::vector<DisplaySnapshotDri*>& old_displays) const {
314 for (size_t i = 0; i < old_displays.size(); ++i) {
315 const std::vector<DisplaySnapshotDri*>::const_iterator it =
316 std::find_if(new_displays.begin(),
317 new_displays.end(),
318 DisplaySnapshotComparator(old_displays[i]));
319
320 if (it == new_displays.end())
321 screen_manager_->RemoveDisplayController(old_displays[i]->crtc());
322 }
323
324 for (size_t i = 0; i < new_displays.size(); ++i) {
325 const std::vector<DisplaySnapshotDri*>::const_iterator it =
326 std::find_if(old_displays.begin(),
327 old_displays.end(),
328 DisplaySnapshotComparator(new_displays[i]));
329
330 if (it == old_displays.end())
331 screen_manager_->AddDisplayController(
332 dri_, new_displays[i]->crtc(), new_displays[i]->connector());
333 }
334 }
335
336 } // namespace ui
OLDNEW
« no previous file with comments | « ui/ozone/platform/dri/native_display_delegate_dri.h ('k') | ui/ozone/platform/dri/native_display_delegate_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698