| 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 |