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

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

Issue 800743002: [Ozone-DRI] Add support for asynchronous display configuration (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@async-refactor6
Patch Set: Remove unneeded code Created 6 years 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
« no previous file with comments | « ui/ozone/platform/dri/native_display_delegate_proxy.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/ozone/platform/dri/native_display_delegate_proxy.h" 5 #include "ui/ozone/platform/dri/native_display_delegate_proxy.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "ui/display/types/display_snapshot.h" 10 #include "ui/display/types/display_snapshot.h"
(...skipping 29 matching lines...) Expand all
40 }; 40 };
41 41
42 } // namespace 42 } // namespace
43 43
44 NativeDisplayDelegateProxy::NativeDisplayDelegateProxy( 44 NativeDisplayDelegateProxy::NativeDisplayDelegateProxy(
45 DriGpuPlatformSupportHost* proxy, 45 DriGpuPlatformSupportHost* proxy,
46 DeviceManager* device_manager, 46 DeviceManager* device_manager,
47 DisplayManager* display_manager) 47 DisplayManager* display_manager)
48 : proxy_(proxy), 48 : proxy_(proxy),
49 device_manager_(device_manager), 49 device_manager_(device_manager),
50 display_manager_(display_manager) { 50 display_manager_(display_manager),
51 has_dummy_display_(false) {
51 proxy_->RegisterHandler(this); 52 proxy_->RegisterHandler(this);
52 } 53 }
53 54
54 NativeDisplayDelegateProxy::~NativeDisplayDelegateProxy() { 55 NativeDisplayDelegateProxy::~NativeDisplayDelegateProxy() {
55 device_manager_->RemoveObserver(this); 56 device_manager_->RemoveObserver(this);
56 proxy_->UnregisterHandler(this); 57 proxy_->UnregisterHandler(this);
57 } 58 }
58 59
59 void NativeDisplayDelegateProxy::Initialize() { 60 void NativeDisplayDelegateProxy::Initialize() {
60 device_manager_->AddObserver(this); 61 device_manager_->AddObserver(this);
61 device_manager_->ScanDevices(this); 62 device_manager_->ScanDevices(this);
62 63
63 if (!displays_.empty()) 64 if (!displays_.empty())
64 return; 65 return;
65 66
66 DisplaySnapshot_Params params = CreateSnapshotFromCommandLine(); 67 DisplaySnapshot_Params params = CreateSnapshotFromCommandLine();
67 if (params.type != DISPLAY_CONNECTION_TYPE_NONE) 68 if (params.type != DISPLAY_CONNECTION_TYPE_NONE) {
68 displays_.push_back(new DriDisplaySnapshotProxy(params, display_manager_)); 69 displays_.push_back(new DriDisplaySnapshotProxy(params, display_manager_));
70 has_dummy_display_ = true;
71 }
69 } 72 }
70 73
71 void NativeDisplayDelegateProxy::GrabServer() { 74 void NativeDisplayDelegateProxy::GrabServer() {
72 } 75 }
73 76
74 void NativeDisplayDelegateProxy::UngrabServer() { 77 void NativeDisplayDelegateProxy::UngrabServer() {
75 } 78 }
76 79
77 bool NativeDisplayDelegateProxy::TakeDisplayControl() { 80 bool NativeDisplayDelegateProxy::TakeDisplayControl() {
78 proxy_->Send(new OzoneGpuMsg_TakeDisplayControl()); 81 proxy_->Send(new OzoneGpuMsg_TakeDisplayControl());
(...skipping 12 matching lines...) Expand all
91 NOTIMPLEMENTED(); 94 NOTIMPLEMENTED();
92 } 95 }
93 96
94 void NativeDisplayDelegateProxy::ForceDPMSOn() { 97 void NativeDisplayDelegateProxy::ForceDPMSOn() {
95 proxy_->Send(new OzoneGpuMsg_ForceDPMSOn()); 98 proxy_->Send(new OzoneGpuMsg_ForceDPMSOn());
96 } 99 }
97 100
98 void NativeDisplayDelegateProxy::GetDisplays( 101 void NativeDisplayDelegateProxy::GetDisplays(
99 const GetDisplaysCallback& callback) { 102 const GetDisplaysCallback& callback) {
100 // GetDisplays() is supposed to force a refresh of the display list. 103 // GetDisplays() is supposed to force a refresh of the display list.
101 proxy_->Send(new OzoneGpuMsg_RefreshNativeDisplays( 104 if (proxy_->Send(new OzoneGpuMsg_RefreshNativeDisplays()))
102 std::vector<DisplaySnapshot_Params>())); 105 get_displays_callback_ = callback;
103 callback.Run(displays_.get()); 106 else
107 callback.Run(displays_.get());
104 } 108 }
105 109
106 void NativeDisplayDelegateProxy::AddMode(const DisplaySnapshot& output, 110 void NativeDisplayDelegateProxy::AddMode(const DisplaySnapshot& output,
107 const DisplayMode* mode) { 111 const DisplayMode* mode) {
108 } 112 }
109 113
110 void NativeDisplayDelegateProxy::Configure(const DisplaySnapshot& output, 114 void NativeDisplayDelegateProxy::Configure(const DisplaySnapshot& output,
111 const DisplayMode* mode, 115 const DisplayMode* mode,
112 const gfx::Point& origin, 116 const gfx::Point& origin,
113 const ConfigureCallback& callback) { 117 const ConfigureCallback& callback) {
114 // TODO(dnicoara) Should handle an asynchronous response. 118 if (has_dummy_display_) {
115 if (mode) 119 callback.Run(true);
116 proxy_->Send(new OzoneGpuMsg_ConfigureNativeDisplay( 120 return;
121 }
122
123 bool status = false;
124 if (mode) {
125 status = proxy_->Send(new OzoneGpuMsg_ConfigureNativeDisplay(
117 output.display_id(), GetDisplayModeParams(*mode), origin)); 126 output.display_id(), GetDisplayModeParams(*mode), origin));
127 } else {
128 status =
129 proxy_->Send(new OzoneGpuMsg_DisableNativeDisplay(output.display_id()));
130 }
131
132 if (status)
133 configure_callback_map_[output.display_id()] = callback;
118 else 134 else
119 proxy_->Send(new OzoneGpuMsg_DisableNativeDisplay(output.display_id())); 135 callback.Run(false);
120
121 callback.Run(true);
122 } 136 }
123 137
124 void NativeDisplayDelegateProxy::CreateFrameBuffer(const gfx::Size& size) { 138 void NativeDisplayDelegateProxy::CreateFrameBuffer(const gfx::Size& size) {
125 } 139 }
126 140
127 bool NativeDisplayDelegateProxy::GetHDCPState(const DisplaySnapshot& output, 141 bool NativeDisplayDelegateProxy::GetHDCPState(const DisplaySnapshot& output,
128 HDCPState* state) { 142 HDCPState* state) {
129 NOTIMPLEMENTED(); 143 NOTIMPLEMENTED();
130 return false; 144 return false;
131 } 145 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 if (event.device_type() != DeviceEvent::DISPLAY) 177 if (event.device_type() != DeviceEvent::DISPLAY)
164 return; 178 return;
165 179
166 switch (event.action_type()) { 180 switch (event.action_type()) {
167 case DeviceEvent::ADD: 181 case DeviceEvent::ADD:
168 VLOG(1) << "Got display added event for " << event.path().value(); 182 VLOG(1) << "Got display added event for " << event.path().value();
169 proxy_->Send(new OzoneGpuMsg_AddGraphicsDevice(event.path())); 183 proxy_->Send(new OzoneGpuMsg_AddGraphicsDevice(event.path()));
170 break; 184 break;
171 case DeviceEvent::CHANGE: 185 case DeviceEvent::CHANGE:
172 VLOG(1) << "Got display changed event for " << event.path().value(); 186 VLOG(1) << "Got display changed event for " << event.path().value();
173 proxy_->Send(new OzoneGpuMsg_RefreshNativeDisplays(
174 std::vector<DisplaySnapshot_Params>()));
175 break; 187 break;
176 case DeviceEvent::REMOVE: 188 case DeviceEvent::REMOVE:
177 VLOG(1) << "Got display removed event for " << event.path().value(); 189 VLOG(1) << "Got display removed event for " << event.path().value();
178 proxy_->Send(new OzoneGpuMsg_RemoveGraphicsDevice(event.path())); 190 proxy_->Send(new OzoneGpuMsg_RemoveGraphicsDevice(event.path()));
179 break; 191 break;
180 } 192 }
193
194 FOR_EACH_OBSERVER(NativeDisplayObserver, observers_,
195 OnConfigurationChanged());
181 } 196 }
182 197
183 void NativeDisplayDelegateProxy::OnChannelEstablished(int host_id, 198 void NativeDisplayDelegateProxy::OnChannelEstablished(int host_id,
184 IPC::Sender* sender) { 199 IPC::Sender* sender) {
185 std::vector<DisplaySnapshot_Params> display_params; 200 FOR_EACH_OBSERVER(NativeDisplayObserver, observers_,
186 for (size_t i = 0; i < displays_.size(); ++i) 201 OnConfigurationChanged());
187 display_params.push_back(GetDisplaySnapshotParams(*displays_[i]));
188
189 // Force an initial configure such that the browser process can get the actual
190 // state. Pass in the current display state since the GPU process may have
191 // crashed and we want to re-synchronize the state between processes.
192 proxy_->Send(new OzoneGpuMsg_RefreshNativeDisplays(display_params));
193 } 202 }
194 203
195 void NativeDisplayDelegateProxy::OnChannelDestroyed(int host_id) { 204 void NativeDisplayDelegateProxy::OnChannelDestroyed(int host_id) {
205 // If the channel got destroyed in the middle of a configuration then just
206 // respond with failure.
207 if (!get_displays_callback_.is_null()) {
208 get_displays_callback_.Run(std::vector<DisplaySnapshot*>());
209 get_displays_callback_.Reset();
210 }
211
212 for (const auto& pair : configure_callback_map_) {
213 pair.second.Run(false);
214 }
215
216 configure_callback_map_.clear();
196 } 217 }
197 218
198 bool NativeDisplayDelegateProxy::OnMessageReceived( 219 bool NativeDisplayDelegateProxy::OnMessageReceived(
199 const IPC::Message& message) { 220 const IPC::Message& message) {
200 bool handled = true; 221 bool handled = true;
201 222
202 IPC_BEGIN_MESSAGE_MAP(NativeDisplayDelegateProxy, message) 223 IPC_BEGIN_MESSAGE_MAP(NativeDisplayDelegateProxy, message)
203 IPC_MESSAGE_HANDLER(OzoneHostMsg_UpdateNativeDisplays, OnUpdateNativeDisplays) 224 IPC_MESSAGE_HANDLER(OzoneHostMsg_UpdateNativeDisplays, OnUpdateNativeDisplays)
225 IPC_MESSAGE_HANDLER(OzoneHostMsg_DisplayConfigured, OnDisplayConfigured)
204 IPC_MESSAGE_UNHANDLED(handled = false) 226 IPC_MESSAGE_UNHANDLED(handled = false)
205 IPC_END_MESSAGE_MAP() 227 IPC_END_MESSAGE_MAP()
206 228
207 return handled; 229 return handled;
208 } 230 }
209 231
210 void NativeDisplayDelegateProxy::OnUpdateNativeDisplays( 232 void NativeDisplayDelegateProxy::OnUpdateNativeDisplays(
211 const std::vector<DisplaySnapshot_Params>& displays) { 233 const std::vector<DisplaySnapshot_Params>& displays) {
212 bool has_new_displays = displays.size() != displays_.size(); 234 has_dummy_display_ = false;
213 if (!has_new_displays) {
214 for (DisplaySnapshot* display : displays_) {
215 auto it = std::find_if(displays.begin(), displays.end(),
216 FindDisplayById(display->display_id()));
217 if (it == displays.end()) {
218 has_new_displays = true;
219 break;
220 }
221 }
222 }
223
224 // If the configuration hasn't changed do not update.
225 if (!has_new_displays)
226 return;
227
228 displays_.clear(); 235 displays_.clear();
229 for (size_t i = 0; i < displays.size(); ++i) 236 for (size_t i = 0; i < displays.size(); ++i)
230 displays_.push_back( 237 displays_.push_back(
231 new DriDisplaySnapshotProxy(displays[i], display_manager_)); 238 new DriDisplaySnapshotProxy(displays[i], display_manager_));
232 239
233 FOR_EACH_OBSERVER(NativeDisplayObserver, observers_, 240 if (!get_displays_callback_.is_null())
234 OnConfigurationChanged()); 241 get_displays_callback_.Run(displays_.get());
242 }
243
244 void NativeDisplayDelegateProxy::OnDisplayConfigured(int64_t display_id,
245 bool status) {
246 auto it = configure_callback_map_.find(display_id);
247 if (it != configure_callback_map_.end()) {
248 it->second.Run(status);
249 configure_callback_map_.erase(it);
250 }
235 } 251 }
236 252
237 } // namespace ui 253 } // namespace ui
OLDNEW
« no previous file with comments | « ui/ozone/platform/dri/native_display_delegate_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698