| OLD | NEW |
| 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 Loading... |
| 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 bool CopyBuffer(const scoped_refptr<ui::ScanoutBuffer>& source_buffer, |
| 55 scoped_refptr<ui::ScanoutBuffer>& target_buffer) { |
| 56 return true; |
| 57 } |
| 58 |
| 54 protected: | 59 protected: |
| 55 scoped_ptr<base::MessageLoop> message_loop_; | 60 scoped_ptr<base::MessageLoop> message_loop_; |
| 56 scoped_refptr<ui::MockDrmDevice> drm_; | 61 scoped_refptr<ui::MockDrmDevice> drm_; |
| 57 scoped_ptr<ui::MockScanoutBufferGenerator> buffer_generator_; | 62 scoped_ptr<ui::MockScanoutBufferGenerator> buffer_generator_; |
| 58 scoped_ptr<ui::ScreenManager> screen_manager_; | 63 scoped_ptr<ui::ScreenManager> screen_manager_; |
| 59 scoped_ptr<ui::DrmDeviceManager> drm_device_manager_; | 64 scoped_ptr<ui::DrmDeviceManager> drm_device_manager_; |
| 60 ui::MockHardwareDisplayPlaneManager* plane_manager_; | 65 ui::MockHardwareDisplayPlaneManager* plane_manager_; |
| 61 ui::DrmWindow* window_; | 66 ui::DrmWindow* window_; |
| 62 scoped_ptr<ui::DrmOverlayValidator> overlay_validator_; | 67 scoped_ptr<ui::DrmOverlayValidator> overlay_validator_; |
| 63 std::vector<ui::OverlayCheck_Params> overlay_params_; | 68 std::vector<ui::OverlayCheck_Params> overlay_params_; |
| 64 ui::OverlayPlaneList plane_list_; | 69 ui::OverlayPlaneList plane_list_; |
| 70 ui::OverlayPlane::CopyBufferCallback copy_buffer_handler_; |
| 65 | 71 |
| 66 int on_swap_buffers_count_; | 72 int on_swap_buffers_count_; |
| 67 gfx::SwapResult last_swap_buffers_result_; | 73 gfx::SwapResult last_swap_buffers_result_; |
| 68 gfx::Rect overlay_rect_; | 74 gfx::Rect overlay_rect_; |
| 69 gfx::Rect primary_rect_; | 75 gfx::Rect primary_rect_; |
| 70 | 76 |
| 71 private: | 77 private: |
| 72 DISALLOW_COPY_AND_ASSIGN(DrmOverlayValidatorTest); | 78 DISALLOW_COPY_AND_ASSIGN(DrmOverlayValidatorTest); |
| 73 }; | 79 }; |
| 74 | 80 |
| 75 void DrmOverlayValidatorTest::SetUp() { | 81 void DrmOverlayValidatorTest::SetUp() { |
| 76 on_swap_buffers_count_ = 0; | 82 on_swap_buffers_count_ = 0; |
| 77 last_swap_buffers_result_ = gfx::SwapResult::SWAP_FAILED; | 83 last_swap_buffers_result_ = gfx::SwapResult::SWAP_FAILED; |
| 84 copy_buffer_handler_ = |
| 85 base::Bind(&DrmOverlayValidatorTest::CopyBuffer, base::Unretained(this)); |
| 78 | 86 |
| 79 message_loop_.reset(new base::MessageLoopForUI); | 87 message_loop_.reset(new base::MessageLoopForUI); |
| 80 std::vector<uint32_t> crtcs; | 88 std::vector<uint32_t> crtcs; |
| 81 crtcs.push_back(kDefaultCrtc); | 89 crtcs.push_back(kDefaultCrtc); |
| 82 drm_ = new ui::MockDrmDevice(false, crtcs, kPlanesPerCrtc); | 90 drm_ = new ui::MockDrmDevice(false, crtcs, kPlanesPerCrtc); |
| 83 buffer_generator_.reset(new ui::MockScanoutBufferGenerator()); | 91 buffer_generator_.reset(new ui::MockScanoutBufferGenerator()); |
| 84 screen_manager_.reset(new ui::ScreenManager(buffer_generator_.get())); | 92 screen_manager_.reset(new ui::ScreenManager(buffer_generator_.get())); |
| 85 screen_manager_->AddDisplayController(drm_, kDefaultCrtc, kDefaultConnector); | 93 screen_manager_->AddDisplayController(drm_, kDefaultCrtc, kDefaultConnector); |
| 86 screen_manager_->ConfigureDisplayController( | 94 screen_manager_->ConfigureDisplayController( |
| 87 drm_, kDefaultCrtc, kDefaultConnector, gfx::Point(), kDefaultMode); | 95 drm_, kDefaultCrtc, kDefaultConnector, gfx::Point(), kDefaultMode); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 108 primary_candidate.buffer_size = primary_rect_.size(); | 116 primary_candidate.buffer_size = primary_rect_.size(); |
| 109 primary_candidate.display_rect = primary_rect_; | 117 primary_candidate.display_rect = primary_rect_; |
| 110 overlay_params_.push_back(primary_candidate); | 118 overlay_params_.push_back(primary_candidate); |
| 111 | 119 |
| 112 ui::OverlayCheck_Params overlay_candidate; | 120 ui::OverlayCheck_Params overlay_candidate; |
| 113 overlay_candidate.buffer_size = overlay_rect_.size(); | 121 overlay_candidate.buffer_size = overlay_rect_.size(); |
| 114 overlay_candidate.display_rect = overlay_rect_; | 122 overlay_candidate.display_rect = overlay_rect_; |
| 115 overlay_candidate.plane_z_order = 1; | 123 overlay_candidate.plane_z_order = 1; |
| 116 overlay_params_.push_back(overlay_candidate); | 124 overlay_params_.push_back(overlay_candidate); |
| 117 | 125 |
| 126 scoped_refptr<ui::DrmDevice> drm = |
| 127 window_->GetController()->GetAllocationDrmDevice(); |
| 118 for (const auto& param : overlay_params_) { | 128 for (const auto& param : overlay_params_) { |
| 119 ui::OverlayPlane plane(nullptr, param.plane_z_order, param.transform, | 129 scoped_refptr<ui::ScanoutBuffer> scanout_buffer = |
| 120 param.display_rect, param.crop_rect); | 130 buffer_generator_->Create(drm, param.format, param.buffer_size); |
| 131 ui::OverlayPlane plane(std::move(scanout_buffer), param.plane_z_order, |
| 132 param.transform, param.display_rect, param.crop_rect, |
| 133 copy_buffer_handler_); |
| 121 plane_list_.push_back(plane); | 134 plane_list_.push_back(plane); |
| 122 } | 135 } |
| 123 } | 136 } |
| 124 | 137 |
| 125 void DrmOverlayValidatorTest::TearDown() { | 138 void DrmOverlayValidatorTest::TearDown() { |
| 126 scoped_ptr<ui::DrmWindow> window = | 139 scoped_ptr<ui::DrmWindow> window = |
| 127 screen_manager_->RemoveWindow(kDefaultWidgetHandle); | 140 screen_manager_->RemoveWindow(kDefaultWidgetHandle); |
| 128 window->Shutdown(); | 141 window->Shutdown(); |
| 129 message_loop_.reset(); | 142 message_loop_.reset(); |
| 130 } | 143 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 ui::FakePlaneInfo primary_plane_info( | 189 ui::FakePlaneInfo primary_plane_info( |
| 177 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); | 190 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); |
| 178 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats); | 191 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats); |
| 179 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; | 192 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; |
| 180 plane_manager_->SetPlaneProperties(planes_info); | 193 plane_manager_->SetPlaneProperties(planes_info); |
| 181 overlay_validator_->ClearCache(); | 194 overlay_validator_->ClearCache(); |
| 182 | 195 |
| 183 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), | 196 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), |
| 184 buffer_generator_.get()); | 197 buffer_generator_.get()); |
| 185 | 198 |
| 186 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( | 199 ui::OverlayPlaneList plane_list = |
| 187 plane_list_.back(), plane_list_); | 200 overlay_validator_->ValidatePlanesForPageFlip(plane_list_, |
| 188 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); | 201 buffer_generator_.get()); |
| 202 EXPECT_EQ(DRM_FORMAT_UYVY, |
| 203 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 189 // Check if ClearCache actually clears the cache. | 204 // Check if ClearCache actually clears the cache. |
| 190 overlay_validator_->ClearCache(); | 205 overlay_validator_->ClearCache(); |
| 191 optimal_format = overlay_validator_->GetOptimalBufferFormat( | 206 plane_list = overlay_validator_->ValidatePlanesForPageFlip( |
| 192 plane_list_.back(), plane_list_); | 207 plane_list_, buffer_generator_.get()); |
| 193 // There should be no entry in cache for this configuration and should return | 208 // There should be no entry in cache for this configuration and should return |
| 194 // default value of DRM_FORMAT_XRGB8888. | 209 // default value of DRM_FORMAT_XRGB8888. |
| 195 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); | 210 EXPECT_EQ(DRM_FORMAT_XRGB8888, |
| 211 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 196 } | 212 } |
| 197 | 213 |
| 198 TEST_F(DrmOverlayValidatorTest, OptimalFormatForOverlayInFullScreen_XRGB) { | 214 TEST_F(DrmOverlayValidatorTest, OptimalFormatForOverlayInFullScreen_XRGB) { |
| 199 // Optimal format for Overlay configuration should be XRGB, when primary plane | 215 // Optimal format for Overlay configuration should be XRGB, when primary plane |
| 200 // supports only XRGB and overlay obscures primary. | 216 // supports only XRGB and overlay obscures primary. |
| 201 overlay_params_.back().buffer_size = primary_rect_.size(); | 217 overlay_params_.back().buffer_size = primary_rect_.size(); |
| 202 overlay_params_.back().display_rect = primary_rect_; | 218 overlay_params_.back().display_rect = primary_rect_; |
| 203 plane_list_.back().display_bounds = primary_rect_; | 219 plane_list_.back().display_bounds = primary_rect_; |
| 204 | 220 |
| 205 // Check optimal format for Overlay. | 221 // Check optimal format for Overlay. |
| 206 ui::FakePlaneInfo primary_plane_info( | 222 ui::FakePlaneInfo primary_plane_info( |
| 207 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); | 223 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); |
| 208 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, | 224 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, |
| 209 DRM_FORMAT_UYVY}; | 225 DRM_FORMAT_UYVY}; |
| 210 ui::FakePlaneInfo plane_info(101, 1 << 0, xrgb_yuv_packed_formats); | 226 ui::FakePlaneInfo plane_info(101, 1 << 0, xrgb_yuv_packed_formats); |
| 211 | 227 |
| 212 std::vector<ui::FakePlaneInfo> planes{primary_plane_info, plane_info}; | 228 std::vector<ui::FakePlaneInfo> planes{primary_plane_info, plane_info}; |
| 213 plane_manager_->SetPlaneProperties(planes); | 229 plane_manager_->SetPlaneProperties(planes); |
| 214 overlay_validator_->ClearCache(); | 230 overlay_validator_->ClearCache(); |
| 215 | 231 |
| 216 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), | 232 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), |
| 217 buffer_generator_.get()); | 233 buffer_generator_.get()); |
| 218 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( | 234 ui::OverlayPlaneList plane_list = |
| 219 plane_list_.back(), plane_list_); | 235 overlay_validator_->ValidatePlanesForPageFlip(plane_list_, |
| 220 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); | 236 buffer_generator_.get()); |
| 237 EXPECT_EQ(DRM_FORMAT_XRGB8888, |
| 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 buffer_generator_.get()); |
| 240 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( | 258 ui::OverlayPlaneList plane_list = |
| 241 plane_list_.back(), plane_list_); | 259 overlay_validator_->ValidatePlanesForPageFlip(plane_list_, |
| 260 buffer_generator_.get()); |
| 242 #if defined(USE_DRM_ATOMIC) | 261 #if defined(USE_DRM_ATOMIC) |
| 243 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); | 262 EXPECT_EQ(DRM_FORMAT_UYVY, |
| 263 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 244 #else | 264 #else |
| 245 // If Atomic support is disabled, ensure we choose DRM_FORMAT_XRGB8888 as the | 265 // 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. | 266 // optimal format even if other packed formats are supported by Primary. |
| 247 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); | 267 EXPECT_EQ(DRM_FORMAT_XRGB8888, |
| 268 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 248 #endif | 269 #endif |
| 249 } | 270 } |
| 250 | 271 |
| 251 TEST_F(DrmOverlayValidatorTest, OverlayPreferredFormat_YUV) { | 272 TEST_F(DrmOverlayValidatorTest, OverlayPreferredFormat_YUV) { |
| 252 plane_manager_->ResetPlaneCount(); | 273 plane_manager_->ResetPlaneCount(); |
| 253 // This test checks for optimal format in case of non full screen video case. | 274 // This test checks for optimal format in case of non full screen video case. |
| 254 // Prefer YUV as optimal format when Overlay supports it. | 275 // Prefer YUV as optimal format when Overlay supports it. |
| 255 overlay_params_.back().buffer_size = overlay_rect_.size(); | 276 overlay_params_.back().buffer_size = overlay_rect_.size(); |
| 256 overlay_params_.back().display_rect = overlay_rect_; | 277 overlay_params_.back().display_rect = overlay_rect_; |
| 257 plane_list_.back().display_bounds = overlay_rect_; | 278 plane_list_.back().display_bounds = overlay_rect_; |
| 258 | 279 |
| 259 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, | 280 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, |
| 260 DRM_FORMAT_UYVY}; | 281 DRM_FORMAT_UYVY}; |
| 261 ui::FakePlaneInfo primary_plane_info( | 282 ui::FakePlaneInfo primary_plane_info( |
| 262 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); | 283 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); |
| 263 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats); | 284 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats); |
| 264 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; | 285 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; |
| 265 plane_manager_->SetPlaneProperties(planes_info); | 286 plane_manager_->SetPlaneProperties(planes_info); |
| 266 overlay_validator_->ClearCache(); | 287 overlay_validator_->ClearCache(); |
| 267 | 288 |
| 268 std::vector<ui::OverlayCheck_Params> validated_params = | 289 std::vector<ui::OverlayCheck_Params> validated_params = |
| 269 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), | 290 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), |
| 270 buffer_generator_.get()); | 291 buffer_generator_.get()); |
| 271 | 292 |
| 272 for (const auto& param : validated_params) | 293 for (const auto& param : validated_params) |
| 273 EXPECT_EQ(true, param.is_overlay_candidate); | 294 EXPECT_EQ(true, param.is_overlay_candidate); |
| 274 | 295 |
| 275 EXPECT_EQ(5, plane_manager_->plane_count()); | 296 EXPECT_EQ(5, plane_manager_->plane_count()); |
| 276 | 297 |
| 277 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( | 298 ui::OverlayPlaneList plane_list = |
| 278 plane_list_.back(), plane_list_); | 299 overlay_validator_->ValidatePlanesForPageFlip(plane_list_, |
| 279 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); | 300 buffer_generator_.get()); |
| 301 EXPECT_EQ(DRM_FORMAT_UYVY, |
| 302 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 280 } | 303 } |
| 281 | 304 |
| 282 TEST_F(DrmOverlayValidatorTest, OverlayPreferredFormat_XRGB) { | 305 TEST_F(DrmOverlayValidatorTest, OverlayPreferredFormat_XRGB) { |
| 283 plane_manager_->ResetPlaneCount(); | 306 plane_manager_->ResetPlaneCount(); |
| 284 // This test checks for optimal format in case of non full screen video case. | 307 // 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. | 308 // This should be XRGB when overlay doesn't support YUV. |
| 286 overlay_params_.back().buffer_size = overlay_rect_.size(); | 309 overlay_params_.back().buffer_size = overlay_rect_.size(); |
| 287 overlay_params_.back().display_rect = overlay_rect_; | 310 overlay_params_.back().display_rect = overlay_rect_; |
| 288 plane_list_.back().display_bounds = overlay_rect_; | 311 plane_list_.back().display_bounds = overlay_rect_; |
| 289 | 312 |
| 290 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, | 313 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, |
| 291 DRM_FORMAT_UYVY}; | 314 DRM_FORMAT_UYVY}; |
| 292 ui::FakePlaneInfo primary_plane_info(100, 1 << 0, xrgb_yuv_packed_formats); | 315 ui::FakePlaneInfo primary_plane_info(100, 1 << 0, xrgb_yuv_packed_formats); |
| 293 ui::FakePlaneInfo overlay_info(101, 1 << 0, | 316 ui::FakePlaneInfo overlay_info(101, 1 << 0, |
| 294 std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); | 317 std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); |
| 295 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; | 318 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; |
| 296 plane_manager_->SetPlaneProperties(planes_info); | 319 plane_manager_->SetPlaneProperties(planes_info); |
| 297 overlay_validator_->ClearCache(); | 320 overlay_validator_->ClearCache(); |
| 298 | 321 |
| 299 std::vector<ui::OverlayCheck_Params> validated_params = | 322 std::vector<ui::OverlayCheck_Params> validated_params = |
| 300 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), | 323 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), |
| 301 buffer_generator_.get()); | 324 buffer_generator_.get()); |
| 302 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( | 325 ui::OverlayPlaneList plane_list = |
| 303 plane_list_.back(), plane_list_); | 326 overlay_validator_->ValidatePlanesForPageFlip(plane_list_, |
| 304 | 327 buffer_generator_.get()); |
| 305 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); | 328 EXPECT_EQ(DRM_FORMAT_XRGB8888, |
| 329 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 306 EXPECT_EQ(3, plane_manager_->plane_count()); | 330 EXPECT_EQ(3, plane_manager_->plane_count()); |
| 307 for (const auto& param : validated_params) | 331 for (const auto& param : validated_params) |
| 308 EXPECT_EQ(true, param.is_overlay_candidate); | 332 EXPECT_EQ(true, param.is_overlay_candidate); |
| 309 } | 333 } |
| 310 | 334 |
| 311 TEST_F(DrmOverlayValidatorTest, RejectYUVBuffersIfNotSupported) { | 335 TEST_F(DrmOverlayValidatorTest, RejectYUVBuffersIfNotSupported) { |
| 312 plane_manager_->ResetPlaneCount(); | 336 plane_manager_->ResetPlaneCount(); |
| 313 // Check case where buffer storage format is already UYVY but planes dont | 337 // Check case where buffer storage format is already UYVY but planes dont |
| 314 // support it. | 338 // support it. |
| 315 overlay_params_.back().buffer_size = overlay_rect_.size(); | 339 overlay_params_.back().buffer_size = overlay_rect_.size(); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 std::vector<ui::OverlayCheck_Params> validated_params = overlay_params_; | 392 std::vector<ui::OverlayCheck_Params> validated_params = overlay_params_; |
| 369 validated_params.back().format = gfx::BufferFormat::UYVY_422; | 393 validated_params.back().format = gfx::BufferFormat::UYVY_422; |
| 370 plane_manager_->ResetPlaneCount(); | 394 plane_manager_->ResetPlaneCount(); |
| 371 validated_params = overlay_validator_->TestPageFlip( | 395 validated_params = overlay_validator_->TestPageFlip( |
| 372 validated_params, ui::OverlayPlaneList(), buffer_generator_.get()); | 396 validated_params, ui::OverlayPlaneList(), buffer_generator_.get()); |
| 373 | 397 |
| 374 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); | 398 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); |
| 375 | 399 |
| 376 // Both controllers have Overlay which support DRM_FORMAT_UYVY, hence this | 400 // Both controllers have Overlay which support DRM_FORMAT_UYVY, hence this |
| 377 // should be picked as the optimal format. | 401 // should be picked as the optimal format. |
| 378 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( | 402 ui::OverlayPlaneList plane_list = |
| 379 plane_list_.back(), plane_list_); | 403 overlay_validator_->ValidatePlanesForPageFlip(plane_list_, |
| 380 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); | 404 buffer_generator_.get()); |
| 405 EXPECT_EQ(DRM_FORMAT_UYVY, |
| 406 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 381 | 407 |
| 382 // This configuration should not be promoted to Overlay when either of the | 408 // This configuration should not be promoted to Overlay when either of the |
| 383 // controllers dont support UYVY format. | 409 // controllers dont support UYVY format. |
| 384 | 410 |
| 385 // Check case where we dont have support for packed formats in Mirrored CRTC. | 411 // Check case where we dont have support for packed formats in Mirrored CRTC. |
| 386 planes_info.back().allowed_formats = only_rgb_format; | 412 planes_info.back().allowed_formats = only_rgb_format; |
| 387 plane_manager_->SetPlaneProperties(planes_info); | 413 plane_manager_->SetPlaneProperties(planes_info); |
| 388 overlay_validator_->ClearCache(); | 414 overlay_validator_->ClearCache(); |
| 389 | 415 |
| 390 validated_params = overlay_validator_->TestPageFlip( | 416 validated_params = overlay_validator_->TestPageFlip( |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 overlay_validator_->ClearCache(); | 462 overlay_validator_->ClearCache(); |
| 437 | 463 |
| 438 plane_manager_->ResetPlaneCount(); | 464 plane_manager_->ResetPlaneCount(); |
| 439 std::vector<ui::OverlayCheck_Params> validated_params = | 465 std::vector<ui::OverlayCheck_Params> validated_params = |
| 440 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), | 466 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), |
| 441 buffer_generator_.get()); | 467 buffer_generator_.get()); |
| 442 | 468 |
| 443 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); | 469 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); |
| 444 // Both controllers have Overlay which support DRM_FORMAT_UYVY, hence this | 470 // Both controllers have Overlay which support DRM_FORMAT_UYVY, hence this |
| 445 // should be picked as the optimal format. | 471 // should be picked as the optimal format. |
| 446 uint32_t optimal_format = overlay_validator_->GetOptimalBufferFormat( | 472 ui::OverlayPlaneList plane_list = |
| 447 plane_list_.back(), plane_list_); | 473 overlay_validator_->ValidatePlanesForPageFlip(plane_list_, |
| 448 EXPECT_EQ(DRM_FORMAT_UYVY, optimal_format); | 474 buffer_generator_.get()); |
| 475 EXPECT_EQ(DRM_FORMAT_UYVY, |
| 476 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 449 | 477 |
| 450 // DRM_FORMAT_XRGB8888 should be the preferred format when either of the | 478 // DRM_FORMAT_XRGB8888 should be the preferred format when either of the |
| 451 // controllers dont support UYVY format. | 479 // controllers dont support UYVY format. |
| 452 | 480 |
| 453 // Check case where we dont have support for packed formats in Mirrored CRTC. | 481 // Check case where we dont have support for packed formats in Mirrored CRTC. |
| 454 planes_info.back().allowed_formats = only_rgb_format; | 482 planes_info.back().allowed_formats = only_rgb_format; |
| 455 plane_manager_->SetPlaneProperties(planes_info); | 483 plane_manager_->SetPlaneProperties(planes_info); |
| 456 overlay_validator_->ClearCache(); | 484 overlay_validator_->ClearCache(); |
| 457 | 485 |
| 458 validated_params = overlay_validator_->TestPageFlip( | 486 validated_params = overlay_validator_->TestPageFlip( |
| 459 overlay_params_, ui::OverlayPlaneList(), buffer_generator_.get()); | 487 overlay_params_, ui::OverlayPlaneList(), buffer_generator_.get()); |
| 460 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); | 488 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); |
| 461 | 489 |
| 462 optimal_format = overlay_validator_->GetOptimalBufferFormat( | 490 plane_list = overlay_validator_->ValidatePlanesForPageFlip( |
| 463 plane_list_.back(), plane_list_); | 491 plane_list_, buffer_generator_.get()); |
| 464 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); | 492 EXPECT_EQ(DRM_FORMAT_XRGB8888, |
| 493 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 465 | 494 |
| 466 // Check case where we dont have support for packed formats in primary | 495 // Check case where we dont have support for packed formats in primary |
| 467 // display. | 496 // display. |
| 468 planes_info.back().allowed_formats = xrgb_yuv_packed_formats; | 497 planes_info.back().allowed_formats = xrgb_yuv_packed_formats; |
| 469 planes_info[1].allowed_formats = only_rgb_format; | 498 planes_info[1].allowed_formats = only_rgb_format; |
| 470 plane_manager_->SetPlaneProperties(planes_info); | 499 plane_manager_->SetPlaneProperties(planes_info); |
| 471 overlay_validator_->ClearCache(); | 500 overlay_validator_->ClearCache(); |
| 472 | 501 |
| 473 validated_params = overlay_validator_->TestPageFlip( | 502 validated_params = overlay_validator_->TestPageFlip( |
| 474 overlay_params_, ui::OverlayPlaneList(), buffer_generator_.get()); | 503 overlay_params_, ui::OverlayPlaneList(), buffer_generator_.get()); |
| 475 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); | 504 EXPECT_EQ(true, validated_params.back().is_overlay_candidate); |
| 476 | 505 |
| 477 optimal_format = overlay_validator_->GetOptimalBufferFormat( | 506 plane_list = overlay_validator_->ValidatePlanesForPageFlip( |
| 478 plane_list_.back(), plane_list_); | 507 plane_list_, buffer_generator_.get()); |
| 479 EXPECT_EQ(DRM_FORMAT_XRGB8888, optimal_format); | 508 EXPECT_EQ(DRM_FORMAT_XRGB8888, |
| 509 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 480 controller->RemoveCrtc(drm_, kSecondaryCrtc); | 510 controller->RemoveCrtc(drm_, kSecondaryCrtc); |
| 481 } | 511 } |
| 512 |
| 513 TEST_F(DrmOverlayValidatorTest, OptimizeOnlyIfProcessingCallbackPresent) { |
| 514 // This test checks that we dont manipulate overlay buffers in case Processing |
| 515 // callback is not present. |
| 516 overlay_params_.back().buffer_size = overlay_rect_.size(); |
| 517 overlay_params_.back().display_rect = overlay_rect_; |
| 518 plane_list_.back().display_bounds = overlay_rect_; |
| 519 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, |
| 520 DRM_FORMAT_UYVY}; |
| 521 |
| 522 ui::FakePlaneInfo primary_plane_info( |
| 523 100, 1 << 0, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888)); |
| 524 ui::FakePlaneInfo overlay_info(101, 1 << 0, xrgb_yuv_packed_formats); |
| 525 std::vector<ui::FakePlaneInfo> planes_info{primary_plane_info, overlay_info}; |
| 526 plane_manager_->SetPlaneProperties(planes_info); |
| 527 overlay_validator_->ClearCache(); |
| 528 |
| 529 overlay_validator_->TestPageFlip(overlay_params_, ui::OverlayPlaneList(), |
| 530 buffer_generator_.get()); |
| 531 |
| 532 ui::OverlayPlaneList plane_list = |
| 533 overlay_validator_->ValidatePlanesForPageFlip(plane_list_, |
| 534 buffer_generator_.get()); |
| 535 EXPECT_EQ(DRM_FORMAT_UYVY, |
| 536 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 537 plane_list_.back().processing_callback.Reset(); |
| 538 plane_list = overlay_validator_->ValidatePlanesForPageFlip( |
| 539 plane_list_, buffer_generator_.get()); |
| 540 EXPECT_EQ(plane_list_.back().buffer->GetFramebufferPixelFormat(), |
| 541 plane_list.back().buffer->GetFramebufferPixelFormat()); |
| 542 plane_list_.back().processing_callback = copy_buffer_handler_; |
| 543 } |
| OLD | NEW |