OLD | NEW |
---|---|
(Empty) | |
1 #include "ui/ozone/platform/drm/host/drm_host_overlay_candidates.h" | |
2 | |
3 #include <algorithm> | |
4 | |
5 #include "ui/gfx/geometry/rect_conversions.h" | |
6 #include "ui/ozone/common/gpu/ozone_gpu_messages.h" | |
7 #include "ui/ozone/platform/drm/host/drm_gpu_platform_support_host.h" | |
8 | |
9 namespace ui { | |
10 | |
11 namespace { | |
12 const size_t kMaxCacheSize = 10000; | |
13 } // namespace | |
14 | |
15 DrmHostOverlayCandidates::PendingCheck::PendingCheck( | |
16 uint32_t id, | |
17 const OverlayCheck_Params& overlay) | |
18 : request_id(id), overlay(overlay) { | |
19 } | |
20 DrmHostOverlayCandidates::PendingCheck::~PendingCheck() { | |
21 } | |
22 | |
23 bool DrmHostOverlayCandidates::OverlayCompare::operator()( | |
24 const OverlayCheck_Params& l, | |
25 const OverlayCheck_Params& r) { | |
26 return l.plane_z_order < r.plane_z_order || | |
27 (l.plane_z_order == r.plane_z_order && | |
28 (l.display_rect < r.display_rect || | |
29 (l.display_rect == r.display_rect && | |
30 (l.format < r.format || | |
31 (l.format == r.format && | |
32 (l.transform < r.transform || | |
33 (l.transform == r.transform && | |
34 (l.buffer_size.width() < r.buffer_size.width() || | |
35 (l.buffer_size.width() == r.buffer_size.width() && | |
36 l.buffer_size.height() < r.buffer_size.height()))))))))); | |
37 } | |
38 | |
39 DrmHostOverlayCandidates::DrmHostOverlayCandidates( | |
40 gfx::AcceleratedWidget widget, | |
41 DrmGpuPlatformSupportHost* platform_support) | |
42 : channel_established_(false), | |
43 next_request_id_(1), | |
44 widget_(widget), | |
45 platform_support_(platform_support) { | |
46 platform_support_->RegisterHandler(this); | |
47 } | |
48 | |
49 DrmHostOverlayCandidates::~DrmHostOverlayCandidates() { | |
50 platform_support_->UnregisterHandler(this); | |
51 } | |
52 | |
53 void DrmHostOverlayCandidates::CheckOverlaySupport( | |
54 OverlaySurfaceCandidateList* candidates) { | |
55 if (candidates->size() == 2) | |
56 CheckSingleOverlay(candidates); | |
57 } | |
58 | |
59 void DrmHostOverlayCandidates::CheckSingleOverlay( | |
60 OverlaySurfaceCandidateList* candidates) { | |
61 OverlayCandidatesOzone::OverlaySurfaceCandidate* first = &(*candidates)[0]; | |
62 OverlayCandidatesOzone::OverlaySurfaceCandidate* second = &(*candidates)[1]; | |
63 OverlayCandidatesOzone::OverlaySurfaceCandidate* overlay; | |
64 if (first->plane_z_order == 0) { | |
65 overlay = second; | |
66 } else if (second->plane_z_order == 0) { | |
67 overlay = first; | |
68 } else { | |
69 return; | |
70 } | |
71 // 0.01 constant chosen to match DCHECKs in gfx::ToNearestRect and avoid | |
72 // that code asserting on quads that we accept. | |
73 if (!gfx::IsNearestRectWithinDistance(overlay->display_rect, 0.01f)) | |
74 return; | |
75 if (overlay->transform == gfx::OVERLAY_TRANSFORM_INVALID) | |
76 return; | |
77 | |
78 OverlayCheck_Params lookup(*overlay); | |
79 auto iter = cache_.find(lookup); | |
80 if (iter == cache_.end()) { | |
81 if (cache_.size() > kMaxCacheSize) | |
82 cache_.clear(); | |
83 cache_[lookup] = false; | |
84 SendRequest(*candidates, PendingCheck(next_request_id_++, lookup)); | |
dnicoara
2015/05/28 21:09:54
The more I read, the clearer it is to me that the
achaulk
2015/05/29 18:49:20
Done.
| |
85 } else { | |
86 overlay->overlay_handled = iter->second; | |
87 } | |
88 } | |
89 | |
90 void DrmHostOverlayCandidates::OnChannelEstablished( | |
dnicoara
2015/05/28 21:09:54
Also, you'll want to clear all pending requests if
achaulk
2015/05/29 18:49:20
If the GPU process goes away nothing matters becau
dnicoara
2015/05/29 19:28:23
I thought the compositor for the primary widget ju
achaulk
2015/05/29 19:36:36
No, the OutputSurface at least gets re-created in
| |
91 int host_id, | |
92 scoped_refptr<base::SingleThreadTaskRunner> send_runner, | |
93 const base::Callback<void(IPC::Message*)>& sender) { | |
94 channel_established_ = true; | |
dnicoara
2015/05/28 21:09:54
You can use DrmGpuPlatformSupportHost::IsConnected
achaulk
2015/05/29 18:49:20
Done.
| |
95 send_callback_ = sender; | |
96 } | |
97 | |
98 void DrmHostOverlayCandidates::OnChannelDestroyed(int host_id) { | |
99 channel_established_ = false; | |
100 } | |
101 | |
102 bool DrmHostOverlayCandidates::OnMessageReceived(const IPC::Message& message) { | |
103 bool handled = false; | |
104 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(DrmHostOverlayCandidates, message, &handled) | |
105 IPC_MESSAGE_FORWARD(OzoneHostMsg_OverlayCapabilitiesReceived, this, | |
106 DrmHostOverlayCandidates::OnOverlayResult) | |
107 IPC_END_MESSAGE_MAP() | |
108 return handled; | |
109 } | |
110 | |
111 void DrmHostOverlayCandidates::SendRequest( | |
112 const OverlaySurfaceCandidateList& candidates, | |
113 const PendingCheck& check) { | |
114 if (!channel_established_) | |
115 return; | |
116 pending_checks_.push_back(check); | |
117 std::vector<OverlayCheck_Params> list; | |
118 for (const auto& candidate : candidates) | |
119 list.push_back(OverlayCheck_Params(candidate)); | |
120 send_callback_.Run(new OzoneGpuMsg_CheckOverlayCapabilities( | |
dnicoara
2015/05/28 21:09:54
Should this post taks using the |send_runner|?
FY
achaulk
2015/05/29 18:49:20
Done.
| |
121 widget_, check.request_id, list)); | |
122 } | |
123 | |
124 void DrmHostOverlayCandidates::OnOverlayResult(bool* handled, | |
125 gfx::AcceleratedWidget widget, | |
126 uint32_t id, | |
127 bool result) { | |
128 if (widget != widget_) | |
129 return; | |
130 *handled = true; | |
131 auto iter = | |
132 std::find_if(pending_checks_.begin(), pending_checks_.end(), | |
133 [id](const PendingCheck& l) { return l.request_id == id; }); | |
134 if (iter == pending_checks_.end()) | |
135 return; | |
136 ProcessResult(*iter, result); | |
137 pending_checks_.erase(iter); | |
138 } | |
139 | |
140 void DrmHostOverlayCandidates::ProcessResult(const PendingCheck& check, | |
141 bool result) { | |
142 if (result) | |
143 cache_[check.overlay] = true; | |
144 } | |
145 | |
146 } // namespace ui | |
OLD | NEW |