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

Side by Side Diff: ui/ozone/platform/dri/hardware_display_controller_unittest.cc

Issue 821023003: [Ozone-DRI] Listen for swap events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@async-swap
Patch Set: Added comment Created 5 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 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 "base/bind.h"
5 #include "testing/gtest/include/gtest/gtest.h" 6 #include "testing/gtest/include/gtest/gtest.h"
6 #include "third_party/skia/include/core/SkCanvas.h" 7 #include "third_party/skia/include/core/SkCanvas.h"
7 #include "ui/ozone/platform/dri/crtc_controller.h" 8 #include "ui/ozone/platform/dri/crtc_controller.h"
8 #include "ui/ozone/platform/dri/dri_buffer.h" 9 #include "ui/ozone/platform/dri/dri_buffer.h"
9 #include "ui/ozone/platform/dri/dri_wrapper.h" 10 #include "ui/ozone/platform/dri/dri_wrapper.h"
10 #include "ui/ozone/platform/dri/hardware_display_controller.h" 11 #include "ui/ozone/platform/dri/hardware_display_controller.h"
11 #include "ui/ozone/platform/dri/test/mock_dri_wrapper.h" 12 #include "ui/ozone/platform/dri/test/mock_dri_wrapper.h"
12 #include "ui/ozone/public/native_pixmap.h" 13 #include "ui/ozone/public/native_pixmap.h"
13 14
14 namespace { 15 namespace {
(...skipping 25 matching lines...) Expand all
40 41
41 gfx::Size size_; 42 gfx::Size size_;
42 43
43 DISALLOW_COPY_AND_ASSIGN(MockScanoutBuffer); 44 DISALLOW_COPY_AND_ASSIGN(MockScanoutBuffer);
44 }; 45 };
45 46
46 } // namespace 47 } // namespace
47 48
48 class HardwareDisplayControllerTest : public testing::Test { 49 class HardwareDisplayControllerTest : public testing::Test {
49 public: 50 public:
50 HardwareDisplayControllerTest() {} 51 HardwareDisplayControllerTest() : page_flips_(0) {}
51 ~HardwareDisplayControllerTest() override {} 52 ~HardwareDisplayControllerTest() override {}
52 53
53 void SetUp() override; 54 void SetUp() override;
54 void TearDown() override; 55 void TearDown() override;
55 56
57 void PageFlipCallback();
58
56 protected: 59 protected:
57 scoped_ptr<ui::HardwareDisplayController> controller_; 60 scoped_ptr<ui::HardwareDisplayController> controller_;
58 scoped_ptr<ui::MockDriWrapper> drm_; 61 scoped_ptr<ui::MockDriWrapper> drm_;
59 62
63 int page_flips_;
64
60 private: 65 private:
61 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayControllerTest); 66 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayControllerTest);
62 }; 67 };
63 68
64 void HardwareDisplayControllerTest::SetUp() { 69 void HardwareDisplayControllerTest::SetUp() {
65 std::vector<uint32_t> crtcs; 70 std::vector<uint32_t> crtcs;
66 crtcs.push_back(kPrimaryCrtc); 71 crtcs.push_back(kPrimaryCrtc);
67 crtcs.push_back(kSecondaryCrtc); 72 crtcs.push_back(kSecondaryCrtc);
68 drm_.reset(new ui::MockDriWrapper(3, crtcs, kPlanesPerCrtc)); 73 drm_.reset(new ui::MockDriWrapper(3, false, crtcs, kPlanesPerCrtc));
69 controller_.reset(new ui::HardwareDisplayController( 74 controller_.reset(new ui::HardwareDisplayController(
70 scoped_ptr<ui::CrtcController>(new ui::CrtcController( 75 scoped_ptr<ui::CrtcController>(new ui::CrtcController(
71 drm_.get(), kPrimaryCrtc, kPrimaryConnector)))); 76 drm_.get(), kPrimaryCrtc, kPrimaryConnector))));
72 } 77 }
73 78
74 void HardwareDisplayControllerTest::TearDown() { 79 void HardwareDisplayControllerTest::TearDown() {
75 controller_.reset(); 80 controller_.reset();
76 drm_.reset(); 81 drm_.reset();
77 } 82 }
78 83
84 void HardwareDisplayControllerTest::PageFlipCallback() {
85 page_flips_++;
86 }
87
79 TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) { 88 TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) {
80 ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>( 89 ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>(
81 new MockScanoutBuffer(kDefaultModeSize))); 90 new MockScanoutBuffer(kDefaultModeSize)));
82 91
83 EXPECT_TRUE(controller_->Modeset(plane, kDefaultMode)); 92 EXPECT_TRUE(controller_->Modeset(plane, kDefaultMode));
84 EXPECT_FALSE(plane.buffer->HasOneRef()); 93 EXPECT_FALSE(plane.buffer->HasOneRef());
85 } 94 }
86 95
87 TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) { 96 TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
88 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( 97 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
89 new MockScanoutBuffer(kDefaultModeSize))); 98 new MockScanoutBuffer(kDefaultModeSize)));
90 99
91 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); 100 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
92 101
93 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( 102 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
94 new MockScanoutBuffer(kDefaultModeSize))); 103 new MockScanoutBuffer(kDefaultModeSize)));
95 controller_->QueueOverlayPlane(plane2); 104 controller_->QueueOverlayPlane(plane2);
96 EXPECT_TRUE(controller_->SchedulePageFlip()); 105 EXPECT_TRUE(controller_->SchedulePageFlip(
97 controller_->WaitForPageFlipEvent(); 106 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
107 base::Unretained(this))));
108 drm_->RunCallbacks();
98 EXPECT_TRUE(plane1.buffer->HasOneRef()); 109 EXPECT_TRUE(plane1.buffer->HasOneRef());
99 EXPECT_FALSE(plane2.buffer->HasOneRef()); 110 EXPECT_FALSE(plane2.buffer->HasOneRef());
100 111
101 EXPECT_EQ(1, drm_->get_page_flip_call_count()); 112 EXPECT_EQ(1, drm_->get_page_flip_call_count());
102 EXPECT_EQ(0, drm_->get_overlay_flip_call_count()); 113 EXPECT_EQ(0, drm_->get_overlay_flip_call_count());
103 } 114 }
104 115
105 TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) { 116 TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) {
106 drm_->set_set_crtc_expectation(false); 117 drm_->set_set_crtc_expectation(false);
107 118
108 ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer( 119 ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(
109 kDefaultModeSize))); 120 kDefaultModeSize)));
110 121
111 EXPECT_FALSE(controller_->Modeset(plane, kDefaultMode)); 122 EXPECT_FALSE(controller_->Modeset(plane, kDefaultMode));
112 } 123 }
113 124
114 TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) { 125 TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) {
115 drm_->set_page_flip_expectation(false); 126 drm_->set_page_flip_expectation(false);
116 127
117 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( 128 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
118 new MockScanoutBuffer(kDefaultModeSize))); 129 new MockScanoutBuffer(kDefaultModeSize)));
119 130
120 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); 131 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
121 132
122 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( 133 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
123 new MockScanoutBuffer(kDefaultModeSize))); 134 new MockScanoutBuffer(kDefaultModeSize)));
124 controller_->QueueOverlayPlane(plane2); 135 controller_->QueueOverlayPlane(plane2);
125 EXPECT_FALSE(controller_->SchedulePageFlip()); 136 EXPECT_FALSE(controller_->SchedulePageFlip(
126 EXPECT_FALSE(plane1.buffer->HasOneRef()); 137 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
127 EXPECT_FALSE(plane2.buffer->HasOneRef()); 138 base::Unretained(this))));
139 drm_->RunCallbacks();
128 140
129 controller_->WaitForPageFlipEvent();
130 EXPECT_FALSE(plane1.buffer->HasOneRef()); 141 EXPECT_FALSE(plane1.buffer->HasOneRef());
131 EXPECT_TRUE(plane2.buffer->HasOneRef()); 142 EXPECT_TRUE(plane2.buffer->HasOneRef());
132 } 143 }
133 144
134 TEST_F(HardwareDisplayControllerTest, VerifyNoDRMCallsWhenDisabled) { 145 TEST_F(HardwareDisplayControllerTest, VerifyNoDRMCallsWhenDisabled) {
135 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( 146 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
136 new MockScanoutBuffer(kDefaultModeSize))); 147 new MockScanoutBuffer(kDefaultModeSize)));
137 148
138 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); 149 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
139 controller_->Disable(); 150 controller_->Disable();
140 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( 151 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
141 new MockScanoutBuffer(kDefaultModeSize))); 152 new MockScanoutBuffer(kDefaultModeSize)));
142 controller_->QueueOverlayPlane(plane2); 153 controller_->QueueOverlayPlane(plane2);
143 EXPECT_TRUE(controller_->SchedulePageFlip()); 154 EXPECT_TRUE(controller_->SchedulePageFlip(
144 controller_->WaitForPageFlipEvent(); 155 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
156 base::Unretained(this))));
157 drm_->RunCallbacks();
145 EXPECT_EQ(0, drm_->get_page_flip_call_count()); 158 EXPECT_EQ(0, drm_->get_page_flip_call_count());
146 159
147 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); 160 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
148 controller_->QueueOverlayPlane(plane2); 161 controller_->QueueOverlayPlane(plane2);
149 EXPECT_TRUE(controller_->SchedulePageFlip()); 162 EXPECT_TRUE(controller_->SchedulePageFlip(
150 controller_->WaitForPageFlipEvent(); 163 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
164 base::Unretained(this))));
165 drm_->RunCallbacks();
151 EXPECT_EQ(1, drm_->get_page_flip_call_count()); 166 EXPECT_EQ(1, drm_->get_page_flip_call_count());
152 } 167 }
153 168
154 TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) { 169 TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) {
155 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( 170 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
156 new MockScanoutBuffer(kDefaultModeSize))); 171 new MockScanoutBuffer(kDefaultModeSize)));
157 ui::OverlayPlane plane2( 172 ui::OverlayPlane plane2(
158 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)), 173 scoped_refptr<ui::ScanoutBuffer>(new MockScanoutBuffer(kDefaultModeSize)),
159 1, 174 1,
160 gfx::OVERLAY_TRANSFORM_NONE, 175 gfx::OVERLAY_TRANSFORM_NONE,
161 gfx::Rect(kDefaultModeSize), 176 gfx::Rect(kDefaultModeSize),
162 gfx::RectF(kDefaultModeSizeF)); 177 gfx::RectF(kDefaultModeSizeF));
163 178
164 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); 179 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
165 180
166 controller_->QueueOverlayPlane(plane1); 181 controller_->QueueOverlayPlane(plane1);
167 controller_->QueueOverlayPlane(plane2); 182 controller_->QueueOverlayPlane(plane2);
168 183
169 EXPECT_TRUE(controller_->SchedulePageFlip()); 184 EXPECT_TRUE(controller_->SchedulePageFlip(
170 controller_->WaitForPageFlipEvent(); 185 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
186 base::Unretained(this))));
187 drm_->RunCallbacks();
171 EXPECT_EQ(1, drm_->get_page_flip_call_count()); 188 EXPECT_EQ(1, drm_->get_page_flip_call_count());
172 EXPECT_EQ(1, drm_->get_overlay_flip_call_count()); 189 EXPECT_EQ(1, drm_->get_overlay_flip_call_count());
173 } 190 }
174 191
175 TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) { 192 TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) {
176 controller_->AddCrtc(scoped_ptr<ui::CrtcController>( 193 controller_->AddCrtc(scoped_ptr<ui::CrtcController>(
177 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector))); 194 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector)));
178 195
179 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( 196 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
180 new MockScanoutBuffer(kDefaultModeSize))); 197 new MockScanoutBuffer(kDefaultModeSize)));
181 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); 198 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
182 EXPECT_EQ(2, drm_->get_set_crtc_call_count()); 199 EXPECT_EQ(2, drm_->get_set_crtc_call_count());
183 200
184 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>( 201 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
185 new MockScanoutBuffer(kDefaultModeSize))); 202 new MockScanoutBuffer(kDefaultModeSize)));
186 controller_->QueueOverlayPlane(plane2); 203 controller_->QueueOverlayPlane(plane2);
187 EXPECT_TRUE(controller_->SchedulePageFlip()); 204 EXPECT_TRUE(controller_->SchedulePageFlip(
205 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
206 base::Unretained(this))));
207 drm_->RunCallbacks();
188 EXPECT_EQ(2, drm_->get_page_flip_call_count()); 208 EXPECT_EQ(2, drm_->get_page_flip_call_count());
189 209 EXPECT_EQ(1, page_flips_);
190 controller_->WaitForPageFlipEvent();
191 EXPECT_EQ(2, drm_->get_handle_events_count());
192 }
193
194 TEST_F(HardwareDisplayControllerTest,
195 PageflipMirroredControllersWithInvertedCrtcOrder) {
196 scoped_ptr<ui::CrtcController> crtc1(
197 new ui::CrtcController(drm_.get(), kPrimaryCrtc, kPrimaryConnector));
198 scoped_ptr<ui::CrtcController> crtc2(
199 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector));
200
201 // Make sure that if the order is reversed everything is still fine.
202 std::queue<ui::CrtcController*> crtc_queue;
203 crtc_queue.push(crtc2.get());
204 crtc_queue.push(crtc1.get());
205
206 controller_.reset(new ui::HardwareDisplayController(crtc1.Pass()));
207 controller_->AddCrtc(crtc2.Pass());
208
209 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
210 new MockScanoutBuffer(kDefaultModeSize)));
211 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
212 EXPECT_EQ(2, drm_->get_set_crtc_call_count());
213
214 ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
215 new MockScanoutBuffer(kDefaultModeSize)));
216 controller_->QueueOverlayPlane(plane2);
217 EXPECT_TRUE(controller_->SchedulePageFlip());
218 EXPECT_EQ(2, drm_->get_page_flip_call_count());
219
220 drm_->set_controllers(crtc_queue);
221 controller_->WaitForPageFlipEvent();
222 EXPECT_EQ(2, drm_->get_handle_events_count());
223 } 210 }
224 211
225 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterRemoveCrtc) { 212 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterRemoveCrtc) {
226 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>( 213 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
227 new MockScanoutBuffer(kDefaultModeSize))); 214 new MockScanoutBuffer(kDefaultModeSize)));
228 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); 215 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
229 controller_->QueueOverlayPlane(plane1); 216 controller_->QueueOverlayPlane(plane1);
230 EXPECT_TRUE(controller_->SchedulePageFlip()); 217 EXPECT_TRUE(controller_->SchedulePageFlip(
231 controller_->WaitForPageFlipEvent(); 218 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
219 base::Unretained(this))));
220 drm_->RunCallbacks();
232 221
233 const ui::HardwareDisplayPlane* owned_plane = nullptr; 222 const ui::HardwareDisplayPlane* owned_plane = nullptr;
234 for (const auto& plane : drm_->plane_manager()->planes()) 223 for (const auto& plane : drm_->plane_manager()->planes())
235 if (plane->in_use()) 224 if (plane->in_use())
236 owned_plane = plane; 225 owned_plane = plane;
237 ASSERT_TRUE(owned_plane != nullptr); 226 ASSERT_TRUE(owned_plane != nullptr);
238 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc()); 227 EXPECT_EQ(kPrimaryCrtc, owned_plane->owning_crtc());
239 // Removing the crtc should free the plane. 228 // Removing the crtc should free the plane.
240 scoped_ptr<ui::CrtcController> crtc = controller_->RemoveCrtc(kPrimaryCrtc); 229 scoped_ptr<ui::CrtcController> crtc = controller_->RemoveCrtc(kPrimaryCrtc);
241 EXPECT_FALSE(owned_plane->in_use()); 230 EXPECT_FALSE(owned_plane->in_use());
242 } 231 }
232
233 TEST_F(HardwareDisplayControllerTest, ModesetWhilePageFlipping) {
234 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
235 new MockScanoutBuffer(kDefaultModeSize)));
236 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
237 controller_->QueueOverlayPlane(plane1);
238 EXPECT_TRUE(controller_->SchedulePageFlip(
239 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
240 base::Unretained(this))));
241
242 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
243 drm_->RunCallbacks();
244 EXPECT_EQ(1, page_flips_);
245 }
246
247 TEST_F(HardwareDisplayControllerTest, AddCrtcMidPageFlip) {
248 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
249 new MockScanoutBuffer(kDefaultModeSize)));
250 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
251 controller_->QueueOverlayPlane(plane1);
252 EXPECT_TRUE(controller_->SchedulePageFlip(
253 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
254 base::Unretained(this))));
255
256 controller_->AddCrtc(scoped_ptr<ui::CrtcController>(
257 new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector)));
258
259 drm_->RunCallbacks();
260 EXPECT_EQ(1, page_flips_);
261 }
262
263 TEST_F(HardwareDisplayControllerTest, RemoveCrtcMidPageFlip) {
264 ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
265 new MockScanoutBuffer(kDefaultModeSize)));
266 EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
267 controller_->QueueOverlayPlane(plane1);
268 EXPECT_TRUE(controller_->SchedulePageFlip(
269 base::Bind(&HardwareDisplayControllerTest::PageFlipCallback,
270 base::Unretained(this))));
271
272 controller_->RemoveCrtc(kPrimaryCrtc);
273
274 EXPECT_EQ(1, page_flips_);
275 drm_->RunCallbacks();
276 EXPECT_EQ(1, page_flips_);
277 }
OLDNEW
« no previous file with comments | « ui/ozone/platform/dri/hardware_display_controller.cc ('k') | ui/ozone/platform/dri/hardware_display_plane_manager_legacy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698