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

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

Issue 1314553002: Move Format checks to HardwareDisplayPlane (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review fixes Created 5 years, 3 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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>
6
5 #include <vector> 7 #include <vector>
6 8
7 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
8 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
9 #include "ui/ozone/platform/drm/gpu/crtc_controller.h" 11 #include "ui/ozone/platform/drm/gpu/crtc_controller.h"
10 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h" 12 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h"
11 #include "ui/ozone/platform/drm/gpu/hardware_display_plane.h" 13 #include "ui/ozone/platform/drm/gpu/hardware_display_plane.h"
12 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h" 14 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h"
13 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h" 15 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h"
14 #include "ui/ozone/platform/drm/gpu/overlay_plane.h" 16 #include "ui/ozone/platform/drm/gpu/overlay_plane.h"
15 #include "ui/ozone/platform/drm/gpu/scanout_buffer.h" 17 #include "ui/ozone/platform/drm/gpu/scanout_buffer.h"
16 #include "ui/ozone/platform/drm/test/mock_drm_device.h" 18 #include "ui/ozone/platform/drm/test/mock_drm_device.h"
17 19
18 namespace { 20 namespace {
19 21
20 struct FakePlaneInfo { 22 struct FakePlaneInfo {
21 uint32_t id; 23 uint32_t id;
22 uint32_t allowed_crtc_mask; 24 uint32_t allowed_crtc_mask;
23 }; 25 };
24 26
25 const FakePlaneInfo kOnePlanePerCrtc[] = {{10, 1}, {20, 2}}; 27 const FakePlaneInfo kOnePlanePerCrtc[] = {{10, 1}, {20, 2}};
26 const FakePlaneInfo kTwoPlanesPerCrtc[] = {{10, 1}, {11, 1}, {20, 2}, {21, 2}}; 28 const FakePlaneInfo kTwoPlanesPerCrtc[] = {{10, 1}, {11, 1}, {20, 2}, {21, 2}};
27 const FakePlaneInfo kOnePlanePerCrtcWithShared[] = {{10, 1}, {20, 2}, {50, 3}}; 29 const FakePlaneInfo kOnePlanePerCrtcWithShared[] = {{10, 1}, {20, 2}, {50, 3}};
30 const uint32_t kDummyFormat = 0;
28 31
29 class FakeScanoutBuffer : public ui::ScanoutBuffer { 32 class FakeScanoutBuffer : public ui::ScanoutBuffer {
30 public: 33 public:
31 FakeScanoutBuffer() {} 34 FakeScanoutBuffer(uint32_t format) : format_(format) {}
32 35
33 // ui::ScanoutBuffer: 36 // ui::ScanoutBuffer:
34 uint32_t GetFramebufferId() const override { return 1; } 37 uint32_t GetFramebufferId() const override { return 1; }
35 uint32_t GetHandle() const override { return 0; } 38 uint32_t GetHandle() const override { return 0; }
36 gfx::Size GetSize() const override { return gfx::Size(1, 1); } 39 gfx::Size GetSize() const override { return gfx::Size(1, 1); }
37 uint32_t GetFormat() const override { return 0; } 40 void SetFramebufferPixelFormat(uint32_t format) { format_ = format; }
41 uint32_t GetFramebufferPixelFormat() const override { return format_; }
38 42
39 protected: 43 protected:
40 ~FakeScanoutBuffer() override {} 44 ~FakeScanoutBuffer() override {}
45 uint32_t format_;
41 }; 46 };
42 47
43 class FakePlaneManager : public ui::HardwareDisplayPlaneManager { 48 class FakePlaneManager : public ui::HardwareDisplayPlaneManager {
44 public: 49 public:
45 FakePlaneManager() : plane_count_(0) {} 50 FakePlaneManager() : plane_count_(0) {}
46 ~FakePlaneManager() override {} 51 ~FakePlaneManager() override {}
47 52
48 // Normally we'd use DRM to figure out the controller configuration. But we 53 // Normally we'd use DRM to figure out the controller configuration. But we
49 // can't use DRM in unit tests, so we just create a fake configuration. 54 // can't use DRM in unit tests, so we just create a fake configuration.
50 void InitForTest(const FakePlaneInfo* planes, 55 void InitForTest(const FakePlaneInfo* planes,
51 size_t count, 56 size_t count,
52 const std::vector<uint32_t>& crtcs) { 57 const std::vector<uint32_t>& crtcs) {
53 crtcs_ = crtcs; 58 crtcs_ = crtcs;
54 for (size_t i = 0; i < count; i++) { 59 for (size_t i = 0; i < count; i++) {
55 planes_.push_back(new ui::HardwareDisplayPlane( 60 scoped_ptr<ui::HardwareDisplayPlane> plane(new ui::HardwareDisplayPlane(
56 planes[i].id, planes[i].allowed_crtc_mask)); 61 planes[i].id, planes[i].allowed_crtc_mask));
62 // Add support to test more formats.
63 plane->Initialize(drm_, std::vector<uint32_t>(1, DRM_FORMAT_XRGB8888),
64 false, true);
65 planes_.push_back(plane.Pass());
57 } 66 }
58 // The real HDPM uses sorted planes, so sort them for consistency. 67 // The real HDPM uses sorted planes, so sort them for consistency.
59 std::sort(planes_.begin(), planes_.end(), 68 std::sort(planes_.begin(), planes_.end(),
60 [](ui::HardwareDisplayPlane* l, ui::HardwareDisplayPlane* r) { 69 [](ui::HardwareDisplayPlane* l, ui::HardwareDisplayPlane* r) {
61 return l->plane_id() < r->plane_id(); 70 return l->plane_id() < r->plane_id();
62 }); 71 });
63 } 72 }
64 73
65 bool Commit(ui::HardwareDisplayPlaneList* plane_list, 74 bool Commit(ui::HardwareDisplayPlaneList* plane_list,
66 bool is_sync, 75 bool is_sync,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 scoped_ptr<FakePlaneManager> plane_manager_; 109 scoped_ptr<FakePlaneManager> plane_manager_;
101 ui::HardwareDisplayPlaneList state_; 110 ui::HardwareDisplayPlaneList state_;
102 std::vector<uint32_t> default_crtcs_; 111 std::vector<uint32_t> default_crtcs_;
103 scoped_refptr<ui::ScanoutBuffer> fake_buffer_; 112 scoped_refptr<ui::ScanoutBuffer> fake_buffer_;
104 113
105 private: 114 private:
106 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManagerTest); 115 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManagerTest);
107 }; 116 };
108 117
109 void HardwareDisplayPlaneManagerTest::SetUp() { 118 void HardwareDisplayPlaneManagerTest::SetUp() {
110 fake_buffer_ = new FakeScanoutBuffer(); 119 fake_buffer_ = new FakeScanoutBuffer(DRM_FORMAT_XRGB8888);
111 plane_manager_.reset(new FakePlaneManager()); 120 plane_manager_.reset(new FakePlaneManager());
112 default_crtcs_.push_back(100); 121 default_crtcs_.push_back(100);
113 default_crtcs_.push_back(200); 122 default_crtcs_.push_back(200);
114 } 123 }
115 124
116 TEST_F(HardwareDisplayPlaneManagerTest, SinglePlaneAssignment) { 125 TEST_F(HardwareDisplayPlaneManagerTest, SinglePlaneAssignment) {
117 ui::OverlayPlaneList assigns; 126 ui::OverlayPlaneList assigns;
118 assigns.push_back(ui::OverlayPlane(fake_buffer_)); 127 assigns.push_back(ui::OverlayPlane(fake_buffer_));
119 plane_manager_->InitForTest(kOnePlanePerCrtc, arraysize(kOnePlanePerCrtc), 128 plane_manager_->InitForTest(kOnePlanePerCrtc, arraysize(kOnePlanePerCrtc),
120 default_crtcs_); 129 default_crtcs_);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 default_crtcs_); 234 default_crtcs_);
226 235
227 EXPECT_TRUE(plane_manager_->AssignOverlayPlanes(&state_, assigns, 236 EXPECT_TRUE(plane_manager_->AssignOverlayPlanes(&state_, assigns,
228 default_crtcs_[1], nullptr)); 237 default_crtcs_[1], nullptr));
229 EXPECT_EQ(2, plane_manager_->plane_count()); 238 EXPECT_EQ(2, plane_manager_->plane_count());
230 // The shared plane is now unavailable for use by the other CRTC. 239 // The shared plane is now unavailable for use by the other CRTC.
231 EXPECT_FALSE(plane_manager_->AssignOverlayPlanes(&state_, assigns, 240 EXPECT_FALSE(plane_manager_->AssignOverlayPlanes(&state_, assigns,
232 default_crtcs_[0], nullptr)); 241 default_crtcs_[0], nullptr));
233 } 242 }
234 243
244 TEST_F(HardwareDisplayPlaneManagerTest, CheckFramebufferFormatMatch) {
245 ui::OverlayPlaneList assigns;
246 scoped_refptr<FakeScanoutBuffer> buffer = new FakeScanoutBuffer(kDummyFormat);
247 assigns.push_back(ui::OverlayPlane(buffer));
248 plane_manager_->InitForTest(kOnePlanePerCrtc, arraysize(kOnePlanePerCrtc),
249 default_crtcs_);
250 plane_manager_->BeginFrame(&state_);
251 // This should return false as plane manager creates planes which support
252 // DRM_FORMAT_XRGB8888 while buffer returns kDummyFormat as its pixelFormat.
253 EXPECT_FALSE(plane_manager_->AssignOverlayPlanes(&state_, assigns,
254 default_crtcs_[0], nullptr));
255 buffer->SetFramebufferPixelFormat(DRM_FORMAT_XRGB8888);
256 plane_manager_->BeginFrame(&state_);
257 EXPECT_TRUE(plane_manager_->AssignOverlayPlanes(&state_, assigns,
258 default_crtcs_[0], nullptr));
259 buffer->SetFramebufferPixelFormat(DRM_FORMAT_ARGB8888);
260 plane_manager_->BeginFrame(&state_);
261 EXPECT_FALSE(plane_manager_->AssignOverlayPlanes(&state_, assigns,
262 default_crtcs_[0], nullptr));
263 }
264
235 TEST(HardwareDisplayPlaneManagerLegacyTest, UnusedPlanesAreReleased) { 265 TEST(HardwareDisplayPlaneManagerLegacyTest, UnusedPlanesAreReleased) {
236 std::vector<uint32_t> crtcs; 266 std::vector<uint32_t> crtcs;
237 crtcs.push_back(100); 267 crtcs.push_back(100);
238 scoped_refptr<ui::MockDrmDevice> drm = new ui::MockDrmDevice(false, crtcs, 2); 268 scoped_refptr<ui::MockDrmDevice> drm = new ui::MockDrmDevice(false, crtcs, 2);
239 ui::OverlayPlaneList assigns; 269 ui::OverlayPlaneList assigns;
240 scoped_refptr<FakeScanoutBuffer> fake_buffer = new FakeScanoutBuffer(); 270 scoped_refptr<FakeScanoutBuffer> fake_buffer =
271 new FakeScanoutBuffer(DRM_FORMAT_XRGB8888);
241 assigns.push_back(ui::OverlayPlane(fake_buffer)); 272 assigns.push_back(ui::OverlayPlane(fake_buffer));
242 assigns.push_back(ui::OverlayPlane(fake_buffer)); 273 assigns.push_back(ui::OverlayPlane(fake_buffer));
243 ui::HardwareDisplayPlaneList hdpl; 274 ui::HardwareDisplayPlaneList hdpl;
244 ui::CrtcController crtc(drm, crtcs[0], 0); 275 ui::CrtcController crtc(drm, crtcs[0], 0);
245 drm->plane_manager()->BeginFrame(&hdpl); 276 drm->plane_manager()->BeginFrame(&hdpl);
246 EXPECT_TRUE(drm->plane_manager()->AssignOverlayPlanes(&hdpl, assigns, 277 EXPECT_TRUE(drm->plane_manager()->AssignOverlayPlanes(&hdpl, assigns,
247 crtcs[0], &crtc)); 278 crtcs[0], &crtc));
248 EXPECT_TRUE(drm->plane_manager()->Commit(&hdpl, false, false)); 279 EXPECT_TRUE(drm->plane_manager()->Commit(&hdpl, false, false));
249 assigns.clear(); 280 assigns.clear();
250 assigns.push_back(ui::OverlayPlane(fake_buffer)); 281 assigns.push_back(ui::OverlayPlane(fake_buffer));
251 drm->plane_manager()->BeginFrame(&hdpl); 282 drm->plane_manager()->BeginFrame(&hdpl);
252 EXPECT_TRUE(drm->plane_manager()->AssignOverlayPlanes(&hdpl, assigns, 283 EXPECT_TRUE(drm->plane_manager()->AssignOverlayPlanes(&hdpl, assigns,
253 crtcs[0], &crtc)); 284 crtcs[0], &crtc));
254 EXPECT_EQ(0, drm->get_overlay_clear_call_count()); 285 EXPECT_EQ(0, drm->get_overlay_clear_call_count());
255 EXPECT_TRUE(drm->plane_manager()->Commit(&hdpl, false, false)); 286 EXPECT_TRUE(drm->plane_manager()->Commit(&hdpl, false, false));
256 EXPECT_EQ(1, drm->get_overlay_clear_call_count()); 287 EXPECT_EQ(1, drm->get_overlay_clear_call_count());
257 } 288 }
258 289
259 } // namespace 290 } // namespace
OLDNEW
« no previous file with comments | « ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc ('k') | ui/ozone/platform/drm/gpu/scanout_buffer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698