Commit 1efa022b authored by dnicoara's avatar dnicoara Committed by Commit bot

[Ozone-DRI] Fix waiting for page flips in mirror mode

Page flips arrive in random order so we want to make sure that we
process the page flips for all affected controllers.

BUG=none
NOTRY=true

Review URL: https://codereview.chromium.org/641173003

Cr-Commit-Position: refs/heads/master@{#299129}
parent e7157b03
...@@ -119,7 +119,10 @@ void HardwareDisplayController::WaitForPageFlipEvent() { ...@@ -119,7 +119,10 @@ void HardwareDisplayController::WaitForPageFlipEvent() {
bool has_pending_page_flips = false; bool has_pending_page_flips = false;
// Wait for the page-flips to complete. // Wait for the page-flips to complete.
for (size_t i = 0; i < crtc_controllers_.size(); ++i) { for (size_t i = 0; i < crtc_controllers_.size(); ++i) {
if (crtc_controllers_[i]->page_flip_pending()) { // In mirror mode the page flip callbacks can happen in different order than
// scheduled, so we need to make sure that the event for the current CRTC is
// processed before moving to the next CRTC.
while (crtc_controllers_[i]->page_flip_pending()) {
has_pending_page_flips = true; has_pending_page_flips = true;
crtc_controllers_[i]->drm()->HandleEvent(drm_event); crtc_controllers_[i]->drm()->HandleEvent(drm_event);
} }
......
...@@ -182,4 +182,38 @@ TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) { ...@@ -182,4 +182,38 @@ TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) {
controller_->QueueOverlayPlane(plane2); controller_->QueueOverlayPlane(plane2);
EXPECT_TRUE(controller_->SchedulePageFlip()); EXPECT_TRUE(controller_->SchedulePageFlip());
EXPECT_EQ(2, drm_->get_page_flip_call_count()); EXPECT_EQ(2, drm_->get_page_flip_call_count());
controller_->WaitForPageFlipEvent();
EXPECT_EQ(2, drm_->get_handle_events_count());
}
TEST_F(HardwareDisplayControllerTest,
PageflipMirroredControllersWithInvertedCrtcOrder) {
scoped_ptr<ui::CrtcController> crtc1(
new ui::CrtcController(drm_.get(), kPrimaryCrtc, kPrimaryConnector));
scoped_ptr<ui::CrtcController> crtc2(
new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector));
// Make sure that if the order is reversed everything is still fine.
std::queue<ui::CrtcController*> crtc_queue;
crtc_queue.push(crtc2.get());
crtc_queue.push(crtc1.get());
controller_.reset(new ui::HardwareDisplayController(crtc1.Pass()));
controller_->AddCrtc(crtc2.Pass());
ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
new MockScanoutBuffer(kDefaultModeSize)));
EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
EXPECT_EQ(2, drm_->get_set_crtc_call_count());
ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
new MockScanoutBuffer(kDefaultModeSize)));
controller_->QueueOverlayPlane(plane2);
EXPECT_TRUE(controller_->SchedulePageFlip());
EXPECT_EQ(2, drm_->get_page_flip_call_count());
drm_->set_controllers(crtc_queue);
controller_->WaitForPageFlipEvent();
EXPECT_EQ(2, drm_->get_handle_events_count());
} }
...@@ -30,6 +30,7 @@ MockDriWrapper::MockDriWrapper(int fd) ...@@ -30,6 +30,7 @@ MockDriWrapper::MockDriWrapper(int fd)
remove_framebuffer_call_count_(0), remove_framebuffer_call_count_(0),
page_flip_call_count_(0), page_flip_call_count_(0),
overlay_flip_call_count_(0), overlay_flip_call_count_(0),
handle_events_count_(0),
set_crtc_expectation_(true), set_crtc_expectation_(true),
add_framebuffer_expectation_(true), add_framebuffer_expectation_(true),
page_flip_expectation_(true), page_flip_expectation_(true),
...@@ -132,6 +133,7 @@ void MockDriWrapper::HandleEvent(drmEventContext& event) { ...@@ -132,6 +133,7 @@ void MockDriWrapper::HandleEvent(drmEventContext& event) {
CHECK(!controllers_.empty()); CHECK(!controllers_.empty());
controllers_.front()->OnPageFlipEvent(0, 0, 0); controllers_.front()->OnPageFlipEvent(0, 0, 0);
controllers_.pop(); controllers_.pop();
handle_events_count_++;
} }
bool MockDriWrapper::CreateDumbBuffer(const SkImageInfo& info, bool MockDriWrapper::CreateDumbBuffer(const SkImageInfo& info,
......
...@@ -33,6 +33,7 @@ class MockDriWrapper : public ui::DriWrapper { ...@@ -33,6 +33,7 @@ class MockDriWrapper : public ui::DriWrapper {
} }
int get_page_flip_call_count() const { return page_flip_call_count_; } int get_page_flip_call_count() const { return page_flip_call_count_; }
int get_overlay_flip_call_count() const { return overlay_flip_call_count_; } int get_overlay_flip_call_count() const { return overlay_flip_call_count_; }
int get_handle_events_count() const { return handle_events_count_; }
void fail_init() { fd_ = -1; } void fail_init() { fd_ = -1; }
void set_set_crtc_expectation(bool state) { set_crtc_expectation_ = state; } void set_set_crtc_expectation(bool state) { set_crtc_expectation_ = state; }
void set_page_flip_expectation(bool state) { page_flip_expectation_ = state; } void set_page_flip_expectation(bool state) { page_flip_expectation_ = state; }
...@@ -49,6 +50,11 @@ class MockDriWrapper : public ui::DriWrapper { ...@@ -49,6 +50,11 @@ class MockDriWrapper : public ui::DriWrapper {
return buffers_; return buffers_;
} }
// Overwrite the list of controllers used when serving the PageFlip requests.
void set_controllers(const std::queue<CrtcController*>& controllers) {
controllers_ = controllers;
}
// DriWrapper: // DriWrapper:
virtual ScopedDrmCrtcPtr GetCrtc(uint32_t crtc_id) override; virtual ScopedDrmCrtcPtr GetCrtc(uint32_t crtc_id) override;
virtual bool SetCrtc(uint32_t crtc_id, virtual bool SetCrtc(uint32_t crtc_id,
...@@ -103,6 +109,7 @@ class MockDriWrapper : public ui::DriWrapper { ...@@ -103,6 +109,7 @@ class MockDriWrapper : public ui::DriWrapper {
int remove_framebuffer_call_count_; int remove_framebuffer_call_count_;
int page_flip_call_count_; int page_flip_call_count_;
int overlay_flip_call_count_; int overlay_flip_call_count_;
int handle_events_count_;
bool set_crtc_expectation_; bool set_crtc_expectation_;
bool add_framebuffer_expectation_; bool add_framebuffer_expectation_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment