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 "ui/ozone/platform/drm/gpu/drm_overlay_validator.h" |
| 6 |
5 #include <drm_fourcc.h> | 7 #include <drm_fourcc.h> |
6 | 8 |
| 9 #include <memory> |
7 #include <utility> | 10 #include <utility> |
8 | 11 |
9 #include "base/memory/scoped_ptr.h" | |
10 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
12 #include "ui/ozone/common/gpu/ozone_gpu_message_params.h" | 14 #include "ui/ozone/common/gpu/ozone_gpu_message_params.h" |
13 #include "ui/ozone/platform/drm/common/drm_util.h" | 15 #include "ui/ozone/platform/drm/common/drm_util.h" |
14 #include "ui/ozone/platform/drm/gpu/crtc_controller.h" | 16 #include "ui/ozone/platform/drm/gpu/crtc_controller.h" |
15 #include "ui/ozone/platform/drm/gpu/drm_device_generator.h" | 17 #include "ui/ozone/platform/drm/gpu/drm_device_generator.h" |
16 #include "ui/ozone/platform/drm/gpu/drm_device_manager.h" | 18 #include "ui/ozone/platform/drm/gpu/drm_device_manager.h" |
17 #include "ui/ozone/platform/drm/gpu/drm_overlay_validator.h" | |
18 #include "ui/ozone/platform/drm/gpu/drm_window.h" | 19 #include "ui/ozone/platform/drm/gpu/drm_window.h" |
19 #include "ui/ozone/platform/drm/gpu/fake_plane_info.h" | 20 #include "ui/ozone/platform/drm/gpu/fake_plane_info.h" |
20 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h" | 21 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h" |
21 #include "ui/ozone/platform/drm/gpu/mock_drm_device.h" | 22 #include "ui/ozone/platform/drm/gpu/mock_drm_device.h" |
22 #include "ui/ozone/platform/drm/gpu/mock_hardware_display_plane_manager.h" | 23 #include "ui/ozone/platform/drm/gpu/mock_hardware_display_plane_manager.h" |
23 #include "ui/ozone/platform/drm/gpu/mock_scanout_buffer.h" | 24 #include "ui/ozone/platform/drm/gpu/mock_scanout_buffer.h" |
24 #include "ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.h" | 25 #include "ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.h" |
25 #include "ui/ozone/platform/drm/gpu/screen_manager.h" | 26 #include "ui/ozone/platform/drm/gpu/screen_manager.h" |
26 | 27 |
27 namespace { | 28 namespace { |
(...skipping 29 matching lines...) Expand all Loading... |
57 ui::GetBufferFormatFromFourCCFormat(format); | 58 ui::GetBufferFormatFromFourCCFormat(format); |
58 return buffer_generator_->Create(drm_, buffer_format, size); | 59 return buffer_generator_->Create(drm_, buffer_format, size); |
59 } | 60 } |
60 | 61 |
61 scoped_refptr<ui::ScanoutBuffer> ReturnNullBuffer(const gfx::Size& size, | 62 scoped_refptr<ui::ScanoutBuffer> ReturnNullBuffer(const gfx::Size& size, |
62 uint32_t format) { | 63 uint32_t format) { |
63 return nullptr; | 64 return nullptr; |
64 } | 65 } |
65 | 66 |
66 protected: | 67 protected: |
67 scoped_ptr<base::MessageLoop> message_loop_; | 68 std::unique_ptr<base::MessageLoop> message_loop_; |
68 scoped_refptr<ui::MockDrmDevice> drm_; | 69 scoped_refptr<ui::MockDrmDevice> drm_; |
69 scoped_ptr<ui::MockScanoutBufferGenerator> buffer_generator_; | 70 std::unique_ptr<ui::MockScanoutBufferGenerator> buffer_generator_; |
70 scoped_ptr<ui::ScreenManager> screen_manager_; | 71 std::unique_ptr<ui::ScreenManager> screen_manager_; |
71 scoped_ptr<ui::DrmDeviceManager> drm_device_manager_; | 72 std::unique_ptr<ui::DrmDeviceManager> drm_device_manager_; |
72 ui::MockHardwareDisplayPlaneManager* plane_manager_; | 73 ui::MockHardwareDisplayPlaneManager* plane_manager_; |
73 ui::DrmWindow* window_; | 74 ui::DrmWindow* window_; |
74 scoped_ptr<ui::DrmOverlayValidator> overlay_validator_; | 75 std::unique_ptr<ui::DrmOverlayValidator> overlay_validator_; |
75 std::vector<ui::OverlayCheck_Params> overlay_params_; | 76 std::vector<ui::OverlayCheck_Params> overlay_params_; |
76 ui::OverlayPlaneList plane_list_; | 77 ui::OverlayPlaneList plane_list_; |
77 ui::OverlayPlane::ProcessBufferCallback process_buffer_handler_; | 78 ui::OverlayPlane::ProcessBufferCallback process_buffer_handler_; |
78 | 79 |
79 int on_swap_buffers_count_; | 80 int on_swap_buffers_count_; |
80 gfx::SwapResult last_swap_buffers_result_; | 81 gfx::SwapResult last_swap_buffers_result_; |
81 gfx::Rect overlay_rect_; | 82 gfx::Rect overlay_rect_; |
82 gfx::Rect primary_rect_; | 83 gfx::Rect primary_rect_; |
83 | 84 |
84 private: | 85 private: |
(...skipping 11 matching lines...) Expand all Loading... |
96 crtcs.push_back(kDefaultCrtc); | 97 crtcs.push_back(kDefaultCrtc); |
97 drm_ = new ui::MockDrmDevice(false, crtcs, kPlanesPerCrtc); | 98 drm_ = new ui::MockDrmDevice(false, crtcs, kPlanesPerCrtc); |
98 buffer_generator_.reset(new ui::MockScanoutBufferGenerator()); | 99 buffer_generator_.reset(new ui::MockScanoutBufferGenerator()); |
99 screen_manager_.reset(new ui::ScreenManager(buffer_generator_.get())); | 100 screen_manager_.reset(new ui::ScreenManager(buffer_generator_.get())); |
100 screen_manager_->AddDisplayController(drm_, kDefaultCrtc, kDefaultConnector); | 101 screen_manager_->AddDisplayController(drm_, kDefaultCrtc, kDefaultConnector); |
101 screen_manager_->ConfigureDisplayController( | 102 screen_manager_->ConfigureDisplayController( |
102 drm_, kDefaultCrtc, kDefaultConnector, gfx::Point(), kDefaultMode); | 103 drm_, kDefaultCrtc, kDefaultConnector, gfx::Point(), kDefaultMode); |
103 | 104 |
104 drm_device_manager_.reset(new ui::DrmDeviceManager(nullptr)); | 105 drm_device_manager_.reset(new ui::DrmDeviceManager(nullptr)); |
105 | 106 |
106 scoped_ptr<ui::DrmWindow> window(new ui::DrmWindow( | 107 std::unique_ptr<ui::DrmWindow> window(new ui::DrmWindow( |
107 kDefaultWidgetHandle, drm_device_manager_.get(), screen_manager_.get())); | 108 kDefaultWidgetHandle, drm_device_manager_.get(), screen_manager_.get())); |
108 window->Initialize(buffer_generator_.get()); | 109 window->Initialize(buffer_generator_.get()); |
109 window->SetBounds( | 110 window->SetBounds( |
110 gfx::Rect(gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay))); | 111 gfx::Rect(gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay))); |
111 screen_manager_->AddWindow(kDefaultWidgetHandle, std::move(window)); | 112 screen_manager_->AddWindow(kDefaultWidgetHandle, std::move(window)); |
112 plane_manager_ = | 113 plane_manager_ = |
113 static_cast<ui::MockHardwareDisplayPlaneManager*>(drm_->plane_manager()); | 114 static_cast<ui::MockHardwareDisplayPlaneManager*>(drm_->plane_manager()); |
114 window_ = screen_manager_->GetWindow(kDefaultWidgetHandle); | 115 window_ = screen_manager_->GetWindow(kDefaultWidgetHandle); |
115 overlay_validator_.reset( | 116 overlay_validator_.reset( |
116 new ui::DrmOverlayValidator(window_, buffer_generator_.get())); | 117 new ui::DrmOverlayValidator(window_, buffer_generator_.get())); |
(...skipping 20 matching lines...) Expand all Loading... |
137 scoped_refptr<ui::ScanoutBuffer> scanout_buffer = | 138 scoped_refptr<ui::ScanoutBuffer> scanout_buffer = |
138 buffer_generator_->Create(drm, param.format, param.buffer_size); | 139 buffer_generator_->Create(drm, param.format, param.buffer_size); |
139 ui::OverlayPlane plane(std::move(scanout_buffer), param.plane_z_order, | 140 ui::OverlayPlane plane(std::move(scanout_buffer), param.plane_z_order, |
140 param.transform, param.display_rect, param.crop_rect, | 141 param.transform, param.display_rect, param.crop_rect, |
141 process_buffer_handler_); | 142 process_buffer_handler_); |
142 plane_list_.push_back(plane); | 143 plane_list_.push_back(plane); |
143 } | 144 } |
144 } | 145 } |
145 | 146 |
146 void DrmOverlayValidatorTest::TearDown() { | 147 void DrmOverlayValidatorTest::TearDown() { |
147 scoped_ptr<ui::DrmWindow> window = | 148 std::unique_ptr<ui::DrmWindow> window = |
148 screen_manager_->RemoveWindow(kDefaultWidgetHandle); | 149 screen_manager_->RemoveWindow(kDefaultWidgetHandle); |
149 window->Shutdown(); | 150 window->Shutdown(); |
150 message_loop_.reset(); | 151 message_loop_.reset(); |
151 } | 152 } |
152 | 153 |
153 TEST_F(DrmOverlayValidatorTest, WindowWithNoController) { | 154 TEST_F(DrmOverlayValidatorTest, WindowWithNoController) { |
154 // We should never promote layers to overlay when controller is not | 155 // We should never promote layers to overlay when controller is not |
155 // present. | 156 // present. |
156 ui::HardwareDisplayController* controller = window_->GetController(); | 157 ui::HardwareDisplayController* controller = window_->GetController(); |
157 window_->SetController(nullptr); | 158 window_->SetController(nullptr); |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 | 423 |
423 TEST_F(DrmOverlayValidatorTest, | 424 TEST_F(DrmOverlayValidatorTest, |
424 RejectYUVBuffersIfNotSupported_MirroredControllers) { | 425 RejectYUVBuffersIfNotSupported_MirroredControllers) { |
425 std::vector<uint32_t> crtcs{kDefaultCrtc, kSecondaryCrtc}; | 426 std::vector<uint32_t> crtcs{kDefaultCrtc, kSecondaryCrtc}; |
426 plane_manager_->SetCrtcInfo(crtcs); | 427 plane_manager_->SetCrtcInfo(crtcs); |
427 | 428 |
428 std::vector<uint32_t> only_rgb_format{DRM_FORMAT_XRGB8888}; | 429 std::vector<uint32_t> only_rgb_format{DRM_FORMAT_XRGB8888}; |
429 std::vector<uint32_t> xrgb_yuv_packed_formats{DRM_FORMAT_XRGB8888, | 430 std::vector<uint32_t> xrgb_yuv_packed_formats{DRM_FORMAT_XRGB8888, |
430 DRM_FORMAT_UYVY}; | 431 DRM_FORMAT_UYVY}; |
431 ui::HardwareDisplayController* controller = window_->GetController(); | 432 ui::HardwareDisplayController* controller = window_->GetController(); |
432 controller->AddCrtc(scoped_ptr<ui::CrtcController>( | 433 controller->AddCrtc(std::unique_ptr<ui::CrtcController>( |
433 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); | 434 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); |
434 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 435 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
435 new ui::MockScanoutBuffer(primary_rect_.size()))); | 436 new ui::MockScanoutBuffer(primary_rect_.size()))); |
436 EXPECT_TRUE(controller->Modeset(plane1, kDefaultMode)); | 437 EXPECT_TRUE(controller->Modeset(plane1, kDefaultMode)); |
437 | 438 |
438 gfx::RectF crop_rect = gfx::RectF(0, 0, 0.5, 0.5); | 439 gfx::RectF crop_rect = gfx::RectF(0, 0, 0.5, 0.5); |
439 overlay_params_.back().buffer_size = overlay_rect_.size(); | 440 overlay_params_.back().buffer_size = overlay_rect_.size(); |
440 overlay_params_.back().display_rect = overlay_rect_; | 441 overlay_params_.back().display_rect = overlay_rect_; |
441 overlay_params_.back().crop_rect = crop_rect; | 442 overlay_params_.back().crop_rect = crop_rect; |
442 plane_list_.back().display_bounds = overlay_rect_; | 443 plane_list_.back().display_bounds = overlay_rect_; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 EXPECT_FALSE(validated_params.back().is_overlay_candidate); | 494 EXPECT_FALSE(validated_params.back().is_overlay_candidate); |
494 controller->RemoveCrtc(drm_, kSecondaryCrtc); | 495 controller->RemoveCrtc(drm_, kSecondaryCrtc); |
495 } | 496 } |
496 | 497 |
497 TEST_F(DrmOverlayValidatorTest, OptimalFormatYUV_MirroredControllers) { | 498 TEST_F(DrmOverlayValidatorTest, OptimalFormatYUV_MirroredControllers) { |
498 std::vector<uint32_t> crtcs{kDefaultCrtc, kSecondaryCrtc}; | 499 std::vector<uint32_t> crtcs{kDefaultCrtc, kSecondaryCrtc}; |
499 plane_manager_->SetCrtcInfo(crtcs); | 500 plane_manager_->SetCrtcInfo(crtcs); |
500 overlay_validator_->ClearCache(); | 501 overlay_validator_->ClearCache(); |
501 | 502 |
502 ui::HardwareDisplayController* controller = window_->GetController(); | 503 ui::HardwareDisplayController* controller = window_->GetController(); |
503 controller->AddCrtc(scoped_ptr<ui::CrtcController>( | 504 controller->AddCrtc(std::unique_ptr<ui::CrtcController>( |
504 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); | 505 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); |
505 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( | 506 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( |
506 new ui::MockScanoutBuffer(primary_rect_.size()))); | 507 new ui::MockScanoutBuffer(primary_rect_.size()))); |
507 EXPECT_TRUE(controller->Modeset(plane1, kDefaultMode)); | 508 EXPECT_TRUE(controller->Modeset(plane1, kDefaultMode)); |
508 | 509 |
509 overlay_params_.back().buffer_size = overlay_rect_.size(); | 510 overlay_params_.back().buffer_size = overlay_rect_.size(); |
510 overlay_params_.back().display_rect = overlay_rect_; | 511 overlay_params_.back().display_rect = overlay_rect_; |
511 plane_list_.back().display_bounds = overlay_rect_; | 512 plane_list_.back().display_bounds = overlay_rect_; |
512 std::vector<uint32_t> only_rgb_format = {DRM_FORMAT_XRGB8888}; | 513 std::vector<uint32_t> only_rgb_format = {DRM_FORMAT_XRGB8888}; |
513 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, | 514 std::vector<uint32_t> xrgb_yuv_packed_formats = {DRM_FORMAT_XRGB8888, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 plane_list.back().buffer->GetFramebufferPixelFormat()); | 627 plane_list.back().buffer->GetFramebufferPixelFormat()); |
627 plane_list_.back().processing_callback = base::Bind( | 628 plane_list_.back().processing_callback = base::Bind( |
628 &DrmOverlayValidatorTest::ReturnNullBuffer, base::Unretained(this)); | 629 &DrmOverlayValidatorTest::ReturnNullBuffer, base::Unretained(this)); |
629 | 630 |
630 plane_list = overlay_validator_->PrepareBuffersForPageFlip(plane_list_); | 631 plane_list = overlay_validator_->PrepareBuffersForPageFlip(plane_list_); |
631 EXPECT_EQ(plane_list_.back().buffer->GetFramebufferPixelFormat(), | 632 EXPECT_EQ(plane_list_.back().buffer->GetFramebufferPixelFormat(), |
632 plane_list.back().buffer->GetFramebufferPixelFormat()); | 633 plane_list.back().buffer->GetFramebufferPixelFormat()); |
633 plane_list_.back().processing_callback = base::Bind( | 634 plane_list_.back().processing_callback = base::Bind( |
634 &DrmOverlayValidatorTest::ProcessBuffer, base::Unretained(this)); | 635 &DrmOverlayValidatorTest::ProcessBuffer, base::Unretained(this)); |
635 } | 636 } |
OLD | NEW |