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

Side by Side Diff: ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc

Issue 1426993003: Ozone: Dont hardcode format to YUV when using Overlay Composition. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review fixes Created 4 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 <drm_fourcc.h> 5 #include <drm_fourcc.h>
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 DrmOverlayValidatorTest() {} 44 DrmOverlayValidatorTest() {}
45 45
46 void SetUp() override; 46 void SetUp() override;
47 void TearDown() override; 47 void TearDown() override;
48 48
49 void OnSwapBuffers(gfx::SwapResult result) { 49 void OnSwapBuffers(gfx::SwapResult result) {
50 on_swap_buffers_count_++; 50 on_swap_buffers_count_++;
51 last_swap_buffers_result_ = result; 51 last_swap_buffers_result_ = result;
52 } 52 }
53 53
54 scoped_refptr<ui::ScanoutBuffer> ProcessBuffer(const gfx::Size& size,
55 uint32_t format) {
56 gfx::BufferFormat buffer_format =
57 ui::GetBufferFormatFromFourCCFormat(format);
58 return buffer_generator_->Create(drm_, buffer_format, size);
59 }
60
61 scoped_refptr<ui::ScanoutBuffer> ReturnNullBuffer(const gfx::Size& size,
62 uint32_t format) {
63 return nullptr;
64 }
65
54 protected: 66 protected:
55 scoped_ptr<base::MessageLoop> message_loop_; 67 scoped_ptr<base::MessageLoop> message_loop_;
56 scoped_refptr<ui::MockDrmDevice> drm_; 68 scoped_refptr<ui::MockDrmDevice> drm_;
57 scoped_ptr<ui::MockScanoutBufferGenerator> buffer_generator_; 69 scoped_ptr<ui::MockScanoutBufferGenerator> buffer_generator_;
58 scoped_ptr<ui::ScreenManager> screen_manager_; 70 scoped_ptr<ui::ScreenManager> screen_manager_;
59 scoped_ptr<ui::DrmDeviceManager> drm_device_manager_; 71 scoped_ptr<ui::DrmDeviceManager> drm_device_manager_;
60 ui::MockHardwareDisplayPlaneManager* plane_manager_; 72 ui::MockHardwareDisplayPlaneManager* plane_manager_;
61 ui::DrmWindow* window_; 73 ui::DrmWindow* window_;
62 scoped_ptr<ui::DrmOverlayValidator> overlay_validator_; 74 scoped_ptr<ui::DrmOverlayValidator> overlay_validator_;
63 std::vector<ui::OverlayCheck_Params> overlay_params_; 75 std::vector<ui::OverlayCheck_Params> overlay_params_;
64 ui::OverlayPlaneList plane_list_; 76 ui::OverlayPlaneList plane_list_;
77 ui::OverlayPlane::ProcessBufferCallback process_buffer_handler_;
65 78
66 int on_swap_buffers_count_; 79 int on_swap_buffers_count_;
67 gfx::SwapResult last_swap_buffers_result_; 80 gfx::SwapResult last_swap_buffers_result_;
68 gfx::Rect overlay_rect_; 81 gfx::Rect overlay_rect_;
69 gfx::Rect primary_rect_; 82 gfx::Rect primary_rect_;
70 83
71 private: 84 private:
72 DISALLOW_COPY_AND_ASSIGN(DrmOverlayValidatorTest); 85 DISALLOW_COPY_AND_ASSIGN(DrmOverlayValidatorTest);
73 }; 86 };
74 87
75 void DrmOverlayValidatorTest::SetUp() { 88 void DrmOverlayValidatorTest::SetUp() {
76 on_swap_buffers_count_ = 0; 89 on_swap_buffers_count_ = 0;
77 last_swap_buffers_result_ = gfx::SwapResult::SWAP_FAILED; 90 last_swap_buffers_result_ = gfx::SwapResult::SWAP_FAILED;
91 process_buffer_handler_ = base::Bind(&DrmOverlayValidatorTest::ProcessBuffer,
92 base::Unretained(this));
78 93
79 message_loop_.reset(new base::MessageLoopForUI); 94 message_loop_.reset(new base::MessageLoopForUI);
80 std::vector<uint32_t> crtcs; 95 std::vector<uint32_t> crtcs;
81 crtcs.push_back(kDefaultCrtc); 96 crtcs.push_back(kDefaultCrtc);
82 drm_ = new ui::MockDrmDevice(false, crtcs, kPlanesPerCrtc); 97 drm_ = new ui::MockDrmDevice(false, crtcs, kPlanesPerCrtc);
83 buffer_generator_.reset(new ui::MockScanoutBufferGenerator()); 98 buffer_generator_.reset(new ui::MockScanoutBufferGenerator());
84 screen_manager_.reset(new ui::ScreenManager(buffer_generator_.get())); 99 screen_manager_.reset(new ui::ScreenManager(buffer_generator_.get()));
85 screen_manager_->AddDisplayController(drm_, kDefaultCrtc, kDefaultConnector); 100 screen_manager_->AddDisplayController(drm_, kDefaultCrtc, kDefaultConnector);
86 screen_manager_->ConfigureDisplayController( 101 screen_manager_->ConfigureDisplayController(
87 drm_, kDefaultCrtc, kDefaultConnector, gfx::Point(), kDefaultMode); 102 drm_, kDefaultCrtc, kDefaultConnector, gfx::Point(), kDefaultMode);
88 103
89 drm_device_manager_.reset(new ui::DrmDeviceManager(nullptr)); 104 drm_device_manager_.reset(new ui::DrmDeviceManager(nullptr));
90 105
91 scoped_ptr<ui::DrmWindow> window(new ui::DrmWindow( 106 scoped_ptr<ui::DrmWindow> window(new ui::DrmWindow(
92 kDefaultWidgetHandle, drm_device_manager_.get(), screen_manager_.get())); 107 kDefaultWidgetHandle, drm_device_manager_.get(), screen_manager_.get()));
93 window->Initialize(); 108 window->Initialize(buffer_generator_.get());
94 window->SetBounds( 109 window->SetBounds(
95 gfx::Rect(gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay))); 110 gfx::Rect(gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay)));
96 screen_manager_->AddWindow(kDefaultWidgetHandle, std::move(window)); 111 screen_manager_->AddWindow(kDefaultWidgetHandle, std::move(window));
97 plane_manager_ = 112 plane_manager_ =
98 static_cast<ui::MockHardwareDisplayPlaneManager*>(drm_->plane_manager()); 113 static_cast<ui::MockHardwareDisplayPlaneManager*>(drm_->plane_manager());
99 window_ = screen_manager_->GetWindow(kDefaultWidgetHandle); 114 window_ = screen_manager_->GetWindow(kDefaultWidgetHandle);
100 overlay_validator_.reset(new ui::DrmOverlayValidator(window_)); 115 overlay_validator_.reset(
116 new ui::DrmOverlayValidator(window_, buffer_generator_.get()));
101 117
102 overlay_rect_ = 118 overlay_rect_ =
103 gfx::Rect(0, 0, kDefaultMode.hdisplay / 2, kDefaultMode.vdisplay / 2); 119 gfx::Rect(0, 0, kDefaultMode.hdisplay / 2, kDefaultMode.vdisplay / 2);
104 120
105 primary_rect_ = gfx::Rect(0, 0, kDefaultMode.hdisplay, kDefaultMode.vdisplay); 121 primary_rect_ = gfx::Rect(0, 0, kDefaultMode.hdisplay, kDefaultMode.vdisplay);
106 122
107 ui::OverlayCheck_Params primary_candidate; 123 ui::OverlayCheck_Params primary_candidate;
108 primary_candidate.buffer_size = primary_rect_.size(); 124 primary_candidate.buffer_size = primary_rect_.size();
109 primary_candidate.display_rect = primary_rect_; 125 primary_candidate.display_rect = primary_rect_;
110 overlay_params_.push_back(primary_candidate); 126 overlay_params_.push_back(primary_candidate);
111 127
112 ui::OverlayCheck_Params overlay_candidate; 128 ui::OverlayCheck_Params overlay_candidate;
113 overlay_candidate.buffer_size = overlay_rect_.size(); 129 overlay_candidate.buffer_size = overlay_rect_.size();
114 overlay_candidate.display_rect = overlay_rect_; 130 overlay_candidate.display_rect = overlay_rect_;
115 overlay_candidate.plane_z_order = 1; 131 overlay_candidate.plane_z_order = 1;
116 overlay_params_.push_back(overlay_candidate); 132 overlay_params_.push_back(overlay_candidate);
117 133
134 scoped_refptr<ui::DrmDevice> drm =
135 window_->GetController()->GetAllocationDrmDevice();
118 for (const auto& param : overlay_params_) { 136 for (const auto& param : overlay_params_) {
119 ui::OverlayPlane plane(nullptr, param.plane_z_order, param.transform, 137 scoped_refptr<ui::ScanoutBuffer> scanout_buffer =
120 param.display_rect, param.crop_rect); 138 buffer_generator_->Create(drm, param.format, param.buffer_size);
139 ui::OverlayPlane plane(std::move(scanout_buffer), param.plane_z_order,
140 param.transform, param.display_rect, param.crop_rect,
141 process_buffer_handler_);
121 plane_list_.push_back(plane); 142 plane_list_.push_back(plane);
122 } 143 }
123 } 144 }
124 145
125 void DrmOverlayValidatorTest::TearDown() { 146 void DrmOverlayValidatorTest::TearDown() {
126 scoped_ptr<ui::DrmWindow> window = 147 scoped_ptr<ui::DrmWindow> window =
127 screen_manager_->RemoveWindow(kDefaultWidgetHandle); 148 screen_manager_->RemoveWindow(kDefaultWidgetHandle);
128 window->Shutdown(); 149 window->Shutdown();
129 message_loop_.reset(); 150 message_loop_.reset();
130 } 151 }
131 152
132 TEST_F(DrmOverlayValidatorTest, WindowWithNoController) { 153 TEST_F(DrmOverlayValidatorTest, WindowWithNoController) {
133 // We should never promote layers to overlay when controller is not 154 // We should never promote layers to overlay when controller is not
134 // present. 155 // present.
135 ui::HardwareDisplayController* controller = window_->GetController(); 156 ui::HardwareDisplayController* controller = window_->GetController();
136 window_->SetController(nullptr); 157 window_->SetController(nullptr);
137 std::vector<ui::OverlayCheck_Params> validated_params = 158 std::vector<ui::OverlayCheck_Params> validated_params =
138 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), 159 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
139 buffer_generator_.get());
140 EXPECT_EQ(false, validated_params.front().is_overlay_candidate); 160 EXPECT_EQ(false, validated_params.front().is_overlay_candidate);
141 EXPECT_EQ(false, validated_params.back().is_overlay_candidate); 161 EXPECT_EQ(false, validated_params.back().is_overlay_candidate);
142 window_->SetController(controller); 162 window_->SetController(controller);
143 } 163 }
144 164
145 TEST_F(DrmOverlayValidatorTest, DontPromoteMoreLayersThanAvailablePlanes) { 165 TEST_F(DrmOverlayValidatorTest, DontPromoteMoreLayersThanAvailablePlanes) {
146 std::vector<ui::OverlayCheck_Params> validated_params = 166 std::vector<ui::OverlayCheck_Params> validated_params =
147 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), 167 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
148 buffer_generator_.get());
149 EXPECT_EQ(true, validated_params.front().is_overlay_candidate); 168 EXPECT_EQ(true, validated_params.front().is_overlay_candidate);
150 EXPECT_EQ(false, validated_params.back().is_overlay_candidate); 169 EXPECT_EQ(false, validated_params.back().is_overlay_candidate);
151 } 170 }
152 171
153 TEST_F(DrmOverlayValidatorTest, DontCollapseOverlayToPrimaryInFullScreen) { 172 TEST_F(DrmOverlayValidatorTest, DontCollapseOverlayToPrimaryInFullScreen) {
154 // Overlay Validator should not collapse planes during validation. 173 // Overlay Validator should not collapse planes during validation.
155 overlay_params_.back().buffer_size = primary_rect_.size(); 174 overlay_params_.back().buffer_size = primary_rect_.size();
156 overlay_params_.back().display_rect = primary_rect_; 175 overlay_params_.back().display_rect = primary_rect_;
157 plane_list_.back().display_bounds = primary_rect_; 176 plane_list_.back().display_bounds = primary_rect_;
158 177
159 std::vector<ui::OverlayCheck_Params> validated_params = 178 std::vector<ui::OverlayCheck_Params> validated_params =
160 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), 179 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
161 buffer_generator_.get());
162 // Second candidate should be marked as Invalid as we have only one plane 180 // Second candidate should be marked as Invalid as we have only one plane
163 // per CRTC. 181 // per CRTC.
164 EXPECT_EQ(true, validated_params.front().is_overlay_candidate); 182 EXPECT_EQ(true, validated_params.front().is_overlay_candidate);
165 EXPECT_EQ(false, validated_params.back().is_overlay_candidate); 183 EXPECT_EQ(false, validated_params.back().is_overlay_candidate);
166 } 184 }
167 185
168 TEST_F(DrmOverlayValidatorTest, ClearCacheOnReset) { 186 TEST_F(DrmOverlayValidatorTest, ClearCacheOnReset) {
169 // This test checks if we invalidate cache when Reset is called. 187 // This test checks if we invalidate cache when Reset is called.
170 overlay_params_.back().buffer_size = overlay_rect_.size(); 188 overlay_params_.back().buffer_size = overlay_rect_.size();
171 overlay_params_.back().display_rect = overlay_rect_; 189 overlay_params_.back().display_rect = overlay_rect_;
172 plane_list_.back().display_bounds = overlay_rect_; 190 plane_list_.back().display_bounds = overlay_rect_;
173 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, 191 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888,
174 DRM_FORMAT_UYVY}; 192 DRM_FORMAT_UYVY};
175 193
176 ui::FakePlaneInfo primary_plane_info( 194 ui::FakePlaneInfo primary_plane_info(
177 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); 195 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888));
178 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats); 196 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats);
179 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; 197 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info};
180 plane_manager_->SetPlaneProperties(planes_info); 198 plane_manager_->SetPlaneProperties(planes_info);
181 overlay_validator_->ClearCache(); 199 overlay_validator_->ClearCache();
182 200
183 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), 201 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
184 buffer_generator_.get());
185 202
186 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( 203 ui::OverlayPlaneList plane_list =
187 plane_list_.back(), plane_list_); 204 overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
188 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); 205 EXPECT_EQ(DRM_FORMAT_UYVY,
206 plane_list.back().buffer->GetFramebufferPixelFormat());
189 // Check if ClearCache actually clears the cache. 207 // Check if ClearCache actually clears the cache.
190 overlay_validator_->ClearCache(); 208 overlay_validator_->ClearCache();
191 optimal_format = overlay_validator_->GetOptimalBufferFormat( 209 plane_list = overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
192 plane_list_.back(), plane_list_);
193 // There should be no entry in cache for this configuration and should return 210 // There should be no entry in cache for this configuration and should return
194 // default value of DRM_FORMAT_XRGB8888. 211 // default value of DRM_FORMAT_XRGB8888.
195 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); 212 EXPECT_EQ(DRM_FORMAT_XRGB8888,
213 plane_list.back().buffer->GetFramebufferPixelFormat());
196 } 214 }
197 215
198 TEST_F(DrmOverlayValidatorTest, OptimalFormatForOverlayInFullScreen_XRGB) { 216 TEST_F(DrmOverlayValidatorTest, OptimalFormatForOverlayInFullScreen_XRGB) {
199 // Optimal format for Overlay configuration should be XRGB, when primary plane 217 // Optimal format for Overlay configuration should be XRGB, when primary plane
200 // supports only XRGB and overlay obscures primary. 218 // supports only XRGB and overlay obscures primary.
201 overlay_params_.back().buffer_size = primary_rect_.size(); 219 overlay_params_.back().buffer_size = primary_rect_.size();
202 overlay_params_.back().display_rect = primary_rect_; 220 overlay_params_.back().display_rect = primary_rect_;
203 plane_list_.back().display_bounds = primary_rect_; 221 plane_list_.back().display_bounds = primary_rect_;
204 222
205 // Check optimal format for Overlay. 223 // Check optimal format for Overlay.
206 ui::FakePlaneInfo primary_plane_info( 224 ui::FakePlaneInfo primary_plane_info(
207 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); 225 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888));
208 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, 226 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888,
209 DRM_FORMAT_UYVY}; 227 DRM_FORMAT_UYVY};
210 ui::FakePlaneInfo plane_info(101, 1 << 0, xrgb_yuv_packed_formats); 228 ui::FakePlaneInfo plane_info(101, 1 << 0, xrgb_yuv_packed_formats);
211 229
212 std::vector<ui::FakePlaneInfo> planes{primary_plane_info, plane_info}; 230 std::vector<ui::FakePlaneInfo> planes{primary_plane_info, plane_info};
213 plane_manager_->SetPlaneProperties(planes); 231 plane_manager_->SetPlaneProperties(planes);
214 overlay_validator_->ClearCache(); 232 overlay_validator_->ClearCache();
215 233
216 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), 234 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
217 buffer_generator_.get()); 235 ui::OverlayPlaneList plane_list =
218 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( 236 overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
219 plane_list_.back(), plane_list_); 237 EXPECT_EQ(DRM_FORMAT_XRGB8888,
220 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); 238 plane_list.back().buffer->GetFramebufferPixelFormat());
221 } 239 }
222 240
223 TEST_F(DrmOverlayValidatorTest, OptimalFormatForOverlayInFullScreen_YUV) { 241 TEST_F(DrmOverlayValidatorTest, OptimalFormatForOverlayInFullScreen_YUV) {
224 overlay_params_.back().buffer_size = primary_rect_.size(); 242 overlay_params_.back().buffer_size = primary_rect_.size();
225 overlay_params_.back().display_rect = primary_rect_; 243 overlay_params_.back().display_rect = primary_rect_;
226 plane_list_.back().display_bounds = primary_rect_; 244 plane_list_.back().display_bounds = primary_rect_;
227 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, 245 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888,
228 DRM_FORMAT_UYVY}; 246 DRM_FORMAT_UYVY};
229 247
230 // We should prefer YUV when primary can support it. 248 // We should prefer YUV when primary can support it.
231 ui::FakePlaneInfo primary_plane_info(100, 1 << 0, xrgb_yuv_packed_formats); 249 ui::FakePlaneInfo primary_plane_info(100, 1 << 0, xrgb_yuv_packed_formats);
232 ui::FakePlaneInfo plane_info(101, 1 << 0, xrgb_yuv_packed_formats); 250 ui::FakePlaneInfo plane_info(101, 1 << 0, xrgb_yuv_packed_formats);
233 251
234 std::vector<ui::FakePlaneInfo> planes{primary_plane_info, plane_info}; 252 std::vector<ui::FakePlaneInfo> planes{primary_plane_info, plane_info};
235 plane_manager_->SetPlaneProperties(planes); 253 plane_manager_->SetPlaneProperties(planes);
236 overlay_validator_->ClearCache(); 254 overlay_validator_->ClearCache();
237 255
238 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), 256 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
239 buffer_generator_.get()); 257 ui::OverlayPlaneList plane_list =
240 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( 258 overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
241 plane_list_.back(), plane_list_);
242 #if defined(USE_DRM_ATOMIC) 259 #if defined(USE_DRM_ATOMIC)
243 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); 260 EXPECT_EQ(DRM_FORMAT_UYVY,
261 plane_list.back().buffer->GetFramebufferPixelFormat());
244 #else 262 #else
245 // If Atomic support is disabled, ensure we choose DRM_FORMAT_XRGB8888 as the 263 // If Atomic support is disabled, ensure we choose DRM_FORMAT_XRGB8888 as the
246 // optimal format even if other packed formats are supported by Primary. 264 // optimal format even if other packed formats are supported by Primary.
247 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); 265 EXPECT_EQ(DRM_FORMAT_XRGB8888,
266 plane_list.back().buffer->GetFramebufferPixelFormat());
248 #endif 267 #endif
249 } 268 }
250 269
251 TEST_F(DrmOverlayValidatorTest, OverlayPreferredFormat_YUV) { 270 TEST_F(DrmOverlayValidatorTest, OverlayPreferredFormat_YUV) {
252 plane_manager_->ResetPlaneCount(); 271 plane_manager_->ResetPlaneCount();
253 // This test checks for optimal format in case of non full screen video case. 272 // This test checks for optimal format in case of non full screen video case.
254 // Prefer YUV as optimal format when Overlay supports it. 273 // Prefer YUV as optimal format when Overlay supports it.
255 overlay_params_.back().buffer_size = overlay_rect_.size(); 274 overlay_params_.back().buffer_size = overlay_rect_.size();
256 overlay_params_.back().display_rect = overlay_rect_; 275 overlay_params_.back().display_rect = overlay_rect_;
257 plane_list_.back().display_bounds = overlay_rect_; 276 plane_list_.back().display_bounds = overlay_rect_;
258 277
259 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, 278 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888,
260 DRM_FORMAT_UYVY}; 279 DRM_FORMAT_UYVY};
261 ui::FakePlaneInfo primary_plane_info( 280 ui::FakePlaneInfo primary_plane_info(
262 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); 281 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888));
263 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats); 282 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats);
264 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; 283 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info};
265 plane_manager_->SetPlaneProperties(planes_info); 284 plane_manager_->SetPlaneProperties(planes_info);
266 overlay_validator_->ClearCache(); 285 overlay_validator_->ClearCache();
267 286
268 std::vector<ui::OverlayCheck_Params> validated_params = 287 std::vector<ui::OverlayCheck_Params> validated_params =
269 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), 288 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
270 buffer_generator_.get());
271 289
272 for (const auto& param : validated_params) 290 for (const auto& param : validated_params)
273 EXPECT_EQ(true, param.is_overlay_candidate); 291 EXPECT_EQ(true, param.is_overlay_candidate);
274 292
275 EXPECT_EQ(5, plane_manager_->plane_count()); 293 EXPECT_EQ(5, plane_manager_->plane_count());
276 294
277 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( 295 ui::OverlayPlaneList plane_list =
278 plane_list_.back(), plane_list_); 296 overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
279 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); 297 EXPECT_EQ(DRM_FORMAT_UYVY,
298 plane_list.back().buffer->GetFramebufferPixelFormat());
280 } 299 }
281 300
282 TEST_F(DrmOverlayValidatorTest, OverlayPreferredFormat_XRGB) { 301 TEST_F(DrmOverlayValidatorTest, OverlayPreferredFormat_XRGB) {
283 plane_manager_->ResetPlaneCount(); 302 plane_manager_->ResetPlaneCount();
284 // This test checks for optimal format in case of non full screen video case. 303 // This test checks for optimal format in case of non full screen video case.
285 // This should be XRGB when overlay doesn't support YUV. 304 // This should be XRGB when overlay doesn't support YUV.
286 overlay_params_.back().buffer_size = overlay_rect_.size(); 305 overlay_params_.back().buffer_size = overlay_rect_.size();
287 overlay_params_.back().display_rect = overlay_rect_; 306 overlay_params_.back().display_rect = overlay_rect_;
288 plane_list_.back().display_bounds = overlay_rect_; 307 plane_list_.back().display_bounds = overlay_rect_;
289 308
290 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, 309 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888,
291 DRM_FORMAT_UYVY}; 310 DRM_FORMAT_UYVY};
292 ui::FakePlaneInfo primary_plane_info(100, 1 << 0, xrgb_yuv_packed_formats); 311 ui::FakePlaneInfo primary_plane_info(100, 1 << 0, xrgb_yuv_packed_formats);
293 ui::FakePlaneInfo overlay_info(101, 1 << 0, 312 ui::FakePlaneInfo overlay_info(101, 1 << 0,
294 std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); 313 std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888));
295 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; 314 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info};
296 plane_manager_->SetPlaneProperties(planes_info); 315 plane_manager_->SetPlaneProperties(planes_info);
297 overlay_validator_->ClearCache(); 316 overlay_validator_->ClearCache();
298 317
299 std::vector<ui::OverlayCheck_Params> validated_params = 318 std::vector<ui::OverlayCheck_Params> validated_params =
300 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), 319 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
301 buffer_generator_.get()); 320 ui::OverlayPlaneList plane_list =
302 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( 321 overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
303 plane_list_.back(), plane_list_); 322 EXPECT_EQ(DRM_FORMAT_XRGB8888,
304 323 plane_list.back().buffer->GetFramebufferPixelFormat());
305 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format);
306 EXPECT_EQ(3, plane_manager_->plane_count()); 324 EXPECT_EQ(3, plane_manager_->plane_count());
307 for (const auto& param : validated_params) 325 for (const auto& param : validated_params)
308 EXPECT_EQ(true, param.is_overlay_candidate); 326 EXPECT_EQ(true, param.is_overlay_candidate);
309 } 327 }
310 328
311 TEST_F(DrmOverlayValidatorTest, RejectYUVBuffersIfNotSupported) { 329 TEST_F(DrmOverlayValidatorTest, RejectYUVBuffersIfNotSupported) {
312 plane_manager_->ResetPlaneCount(); 330 plane_manager_->ResetPlaneCount();
313 // Check case where buffer storage format is already UYVY but planes dont 331 // Check case where buffer storage format is already UYVY but planes dont
314 // support it. 332 // support it.
315 overlay_params_.back().buffer_size = overlay_rect_.size(); 333 overlay_params_.back().buffer_size = overlay_rect_.size();
316 overlay_params_.back().display_rect = overlay_rect_; 334 overlay_params_.back().display_rect = overlay_rect_;
317 plane_list_.back().display_bounds = overlay_rect_; 335 plane_list_.back().display_bounds = overlay_rect_;
318 336
319 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, 337 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888,
320 DRM_FORMAT_UYVY}; 338 DRM_FORMAT_UYVY};
321 ui::FakePlaneInfo primary_plane_info(100, 1 << 0, xrgb_yuv_packed_formats); 339 ui::FakePlaneInfo primary_plane_info(100, 1 << 0, xrgb_yuv_packed_formats);
322 ui::FakePlaneInfo overlay_info(101, 1 << 0, 340 ui::FakePlaneInfo overlay_info(101, 1 << 0,
323 std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); 341 std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888));
324 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; 342 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info};
325 plane_manager_->SetPlaneProperties(planes_info); 343 plane_manager_->SetPlaneProperties(planes_info);
326 overlay_validator_->ClearCache(); 344 overlay_validator_->ClearCache();
327 345
328 std::vector<ui::OverlayCheck_Params> validated_params = overlay_params_; 346 std::vector<ui::OverlayCheck_Params> validated_params = overlay_params_;
329 validated_params.back().format = gfx::BufferFormat::UYVY_422; 347 validated_params.back().format = gfx::BufferFormat::UYVY_422;
330 plane_manager_->ResetPlaneCount(); 348 plane_manager_->ResetPlaneCount();
331 validated_params = overlay_validator_->TestPageFlip( 349 validated_params = overlay_validator_->TestPageFlip(validated_params,
332 validated_params, ui::OverlayPlaneList(), buffer_generator_.get()); 350 ui::OverlayPlaneList());
333 351
334 EXPECT_EQ(false, validated_params.back().is_overlay_candidate); 352 EXPECT_EQ(false, validated_params.back().is_overlay_candidate);
335 } 353 }
336 354
337 TEST_F(DrmOverlayValidatorTest, 355 TEST_F(DrmOverlayValidatorTest,
338 RejectYUVBuffersIfNotSupported_MirroredControllers) { 356 RejectYUVBuffersIfNotSupported_MirroredControllers) {
339 std::vector<uint32_t> crtcs{kDefaultCrtc, kSecondaryCrtc}; 357 std::vector<uint32_t> crtcs{kDefaultCrtc, kSecondaryCrtc};
340 plane_manager_->SetCrtcInfo(crtcs); 358 plane_manager_->SetCrtcInfo(crtcs);
341 359
342 std::vector<uint32_t> only_rgb_format{DRM_FORMAT_XRGB8888}; 360 std::vector<uint32_t> only_rgb_format{DRM_FORMAT_XRGB8888};
(...skipping 18 matching lines...) Expand all
361 379
362 std::vector<ui::FakePlaneInfo> planes_info{ 380 std::vector<ui::FakePlaneInfo> planes_info{
363 primary_crtc_primary_plane, primary_crtc_overlay, 381 primary_crtc_primary_plane, primary_crtc_overlay,
364 secondary_crtc_primary_plane, secondary_crtc_overlay}; 382 secondary_crtc_primary_plane, secondary_crtc_overlay};
365 plane_manager_->SetPlaneProperties(planes_info); 383 plane_manager_->SetPlaneProperties(planes_info);
366 overlay_validator_->ClearCache(); 384 overlay_validator_->ClearCache();
367 385
368 std::vector<ui::OverlayCheck_Params> validated_params = overlay_params_; 386 std::vector<ui::OverlayCheck_Params> validated_params = overlay_params_;
369 validated_params.back().format = gfx::BufferFormat::UYVY_422; 387 validated_params.back().format = gfx::BufferFormat::UYVY_422;
370 plane_manager_->ResetPlaneCount(); 388 plane_manager_->ResetPlaneCount();
371 validated_params = overlay_validator_->TestPageFlip( 389 validated_params = overlay_validator_->TestPageFlip(validated_params,
372 validated_params, ui::OverlayPlaneList(), buffer_generator_.get()); 390 ui::OverlayPlaneList());
373 391
374 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); 392 EXPECT_EQ(true, validated_params.back().is_overlay_candidate);
375 393
376 // Both controllers have Overlay which support DRM_FORMAT_UYVY, hence this 394 // Both controllers have Overlay which support DRM_FORMAT_UYVY, hence this
377 // should be picked as the optimal format. 395 // should be picked as the optimal format.
378 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( 396 ui::OverlayPlaneList plane_list =
379 plane_list_.back(), plane_list_); 397 overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
380 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); 398 EXPECT_EQ(DRM_FORMAT_UYVY,
399 plane_list.back().buffer->GetFramebufferPixelFormat());
381 400
382 // This configuration should not be promoted to Overlay when either of the 401 // This configuration should not be promoted to Overlay when either of the
383 // controllers dont support UYVY format. 402 // controllers dont support UYVY format.
384 403
385 // Check case where we dont have support for packed formats in Mirrored CRTC. 404 // Check case where we dont have support for packed formats in Mirrored CRTC.
386 planes_info.back().allowed_formats = only_rgb_format; 405 planes_info.back().allowed_formats = only_rgb_format;
387 plane_manager_->SetPlaneProperties(planes_info); 406 plane_manager_->SetPlaneProperties(planes_info);
388 overlay_validator_->ClearCache(); 407 overlay_validator_->ClearCache();
389 408
390 validated_params = overlay_validator_->TestPageFlip( 409 validated_params = overlay_validator_->TestPageFlip(validated_params,
391 validated_params, ui::OverlayPlaneList(), buffer_generator_.get()); 410 ui::OverlayPlaneList());
392 EXPECT_EQ(false, validated_params.back().is_overlay_candidate); 411 EXPECT_EQ(false, validated_params.back().is_overlay_candidate);
393 412
394 // Check case where we dont have support for packed formats in primary 413 // Check case where we dont have support for packed formats in primary
395 // display. 414 // display.
396 planes_info.back().allowed_formats = xrgb_yuv_packed_formats; 415 planes_info.back().allowed_formats = xrgb_yuv_packed_formats;
397 planes_info[1].allowed_formats = only_rgb_format; 416 planes_info[1].allowed_formats = only_rgb_format;
398 plane_manager_->SetPlaneProperties(planes_info); 417 plane_manager_->SetPlaneProperties(planes_info);
399 overlay_validator_->ClearCache(); 418 overlay_validator_->ClearCache();
400 419
401 validated_params = overlay_validator_->TestPageFlip( 420 validated_params = overlay_validator_->TestPageFlip(validated_params,
402 validated_params, ui::OverlayPlaneList(), buffer_generator_.get()); 421 ui::OverlayPlaneList());
403 EXPECT_EQ(false, validated_params.back().is_overlay_candidate); 422 EXPECT_EQ(false, validated_params.back().is_overlay_candidate);
404 controller->RemoveCrtc(drm_, kSecondaryCrtc); 423 controller->RemoveCrtc(drm_, kSecondaryCrtc);
405 } 424 }
406 425
407 TEST_F(DrmOverlayValidatorTest, OptimalFormatYUV_MirroredControllers) { 426 TEST_F(DrmOverlayValidatorTest, OptimalFormatYUV_MirroredControllers) {
408 std::vector<uint32_t> crtcs{kDefaultCrtc, kSecondaryCrtc}; 427 std::vector<uint32_t> crtcs{kDefaultCrtc, kSecondaryCrtc};
409 plane_manager_->SetCrtcInfo(crtcs); 428 plane_manager_->SetCrtcInfo(crtcs);
410 overlay_validator_->ClearCache(); 429 overlay_validator_->ClearCache();
411 430
412 ui::HardwareDisplayController* controller = window_->GetController(); 431 ui::HardwareDisplayController* controller = window_->GetController();
(...skipping 17 matching lines...) Expand all
430 xrgb_yuv_packed_formats); 449 xrgb_yuv_packed_formats);
431 450
432 std::vector<ui::FakePlaneInfo> planes_info{ 451 std::vector<ui::FakePlaneInfo> planes_info{
433 primary_crtc_primary_plane, primary_crtc_overlay, 452 primary_crtc_primary_plane, primary_crtc_overlay,
434 secondary_crtc_primary_plane, secondary_crtc_overlay}; 453 secondary_crtc_primary_plane, secondary_crtc_overlay};
435 plane_manager_->SetPlaneProperties(planes_info); 454 plane_manager_->SetPlaneProperties(planes_info);
436 overlay_validator_->ClearCache(); 455 overlay_validator_->ClearCache();
437 456
438 plane_manager_->ResetPlaneCount(); 457 plane_manager_->ResetPlaneCount();
439 std::vector<ui::OverlayCheck_Params> validated_params = 458 std::vector<ui::OverlayCheck_Params> validated_params =
440 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), 459 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
441 buffer_generator_.get());
442 460
443 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); 461 EXPECT_EQ(true, validated_params.back().is_overlay_candidate);
444 // Both controllers have Overlay which support DRM_FORMAT_UYVY, hence this 462 // Both controllers have Overlay which support DRM_FORMAT_UYVY, hence this
445 // should be picked as the optimal format. 463 // should be picked as the optimal format.
446 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( 464 ui::OverlayPlaneList plane_list =
447 plane_list_.back(), plane_list_); 465 overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
448 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); 466 EXPECT_EQ(DRM_FORMAT_UYVY,
467 plane_list.back().buffer->GetFramebufferPixelFormat());
449 468
450 // DRM_FORMAT_XRGB8888 should be the preferred format when either of the 469 // DRM_FORMAT_XRGB8888 should be the preferred format when either of the
451 // controllers dont support UYVY format. 470 // controllers dont support UYVY format.
452 471
453 // Check case where we dont have support for packed formats in Mirrored CRTC. 472 // Check case where we dont have support for packed formats in Mirrored CRTC.
454 planes_info.back().allowed_formats = only_rgb_format; 473 planes_info.back().allowed_formats = only_rgb_format;
455 plane_manager_->SetPlaneProperties(planes_info); 474 plane_manager_->SetPlaneProperties(planes_info);
456 overlay_validator_->ClearCache(); 475 overlay_validator_->ClearCache();
457 476
458 validated_params = overlay_validator_->TestPageFlip( 477 validated_params =
459 overlay_params_, ui::OverlayPlaneList(), buffer_generator_.get()); 478 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
460 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); 479 EXPECT_EQ(true, validated_params.back().is_overlay_candidate);
461 480
462 optimal_format = overlay_validator_->GetOptimalBufferFormat( 481 plane_list = overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
463 plane_list_.back(), plane_list_); 482 EXPECT_EQ(DRM_FORMAT_XRGB8888,
464 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); 483 plane_list.back().buffer->GetFramebufferPixelFormat());
465 484
466 // Check case where we dont have support for packed formats in primary 485 // Check case where we dont have support for packed formats in primary
467 // display. 486 // display.
468 planes_info.back().allowed_formats = xrgb_yuv_packed_formats; 487 planes_info.back().allowed_formats = xrgb_yuv_packed_formats;
469 planes_info[1].allowed_formats = only_rgb_format; 488 planes_info[1].allowed_formats = only_rgb_format;
470 plane_manager_->SetPlaneProperties(planes_info); 489 plane_manager_->SetPlaneProperties(planes_info);
471 overlay_validator_->ClearCache(); 490 overlay_validator_->ClearCache();
472 491
473 validated_params = overlay_validator_->TestPageFlip( 492 validated_params =
474 overlay_params_, ui::OverlayPlaneList(), buffer_generator_.get()); 493 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
475 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); 494 EXPECT_EQ(true, validated_params.back().is_overlay_candidate);
476 495
477 optimal_format = overlay_validator_->GetOptimalBufferFormat( 496 plane_list = overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
478 plane_list_.back(), plane_list_); 497 EXPECT_EQ(DRM_FORMAT_XRGB8888,
479 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); 498 plane_list.back().buffer->GetFramebufferPixelFormat());
480 controller->RemoveCrtc(drm_, kSecondaryCrtc); 499 controller->RemoveCrtc(drm_, kSecondaryCrtc);
481 } 500 }
501
502 TEST_F(DrmOverlayValidatorTest, OptimizeOnlyIfProcessingCallbackPresent) {
503 // This test checks that we dont manipulate overlay buffers in case Processing
504 // callback is not present.
505 overlay_params_.back().buffer_size = overlay_rect_.size();
506 overlay_params_.back().display_rect = overlay_rect_;
507 plane_list_.back().display_bounds = overlay_rect_;
508 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888,
509 DRM_FORMAT_UYVY};
510
511 ui::FakePlaneInfo primary_plane_info(
512 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888));
513 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats);
514 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info};
515 plane_manager_->SetPlaneProperties(planes_info);
516 overlay_validator_->ClearCache();
517
518 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
519
520 ui::OverlayPlaneList plane_list =
521 overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
522 EXPECT_EQ(DRM_FORMAT_UYVY,
523 plane_list.back().buffer->GetFramebufferPixelFormat());
524 plane_list_.back().processing_callback.Reset();
525 plane_list = overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
526 EXPECT_EQ(plane_list_.back().buffer->GetFramebufferPixelFormat(),
527 plane_list.back().buffer->GetFramebufferPixelFormat());
528 plane_list_.back().processing_callback = process_buffer_handler_;
529 }
530
531 TEST_F(DrmOverlayValidatorTest, DontResetOriginalBufferIfProcessedIsInvalid) {
532 // This test checks that we dont manipulate overlay buffers in case Processing
533 // callback is not present.
534 overlay_params_.back().buffer_size = overlay_rect_.size();
535 overlay_params_.back().display_rect = overlay_rect_;
536 plane_list_.back().display_bounds = overlay_rect_;
537 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888,
538 DRM_FORMAT_UYVY};
539
540 ui::FakePlaneInfo primary_plane_info(
541 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888));
542 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats);
543 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info};
544 plane_manager_->SetPlaneProperties(planes_info);
545 overlay_validator_->ClearCache();
546
547 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList());
548
549 ui::OverlayPlaneList plane_list =
550 overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
551 EXPECT_EQ(DRM_FORMAT_UYVY,
552 plane_list.back().buffer->GetFramebufferPixelFormat());
553 plane_list_.back().processing_callback = base::Bind(
554 &DrmOverlayValidatorTest::ReturnNullBuffer, base::Unretained(this));
555
556 plane_list = overlay_validator_->PrepareBuffersForPageFlip(plane_list_);
557 EXPECT_EQ(plane_list_.back().buffer->GetFramebufferPixelFormat(),
558 plane_list.back().buffer->GetFramebufferPixelFormat());
559 plane_list_.back().processing_callback = base::Bind(
560 &DrmOverlayValidatorTest::ProcessBuffer, base::Unretained(this));
561 }
OLDNEW
« no previous file with comments | « ui/ozone/platform/drm/gpu/drm_overlay_validator.cc ('k') | ui/ozone/platform/drm/gpu/drm_thread.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698