Chromium Code Reviews| Index: ui/ozone/platform/drm/gpu/hardware_display_controller.cc |
| diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc |
| index 278dc156abc6cece1f44b7cbacb1295dddea6df3..66ab6d274348da7fa999ab5d7082721618782f89 100644 |
| --- a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc |
| +++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc |
| @@ -33,7 +33,7 @@ HardwareDisplayController::PageFlipRequest::~PageFlipRequest() { |
| HardwareDisplayController::HardwareDisplayController( |
| scoped_ptr<CrtcController> controller) |
| - : is_disabled_(true) { |
| + : is_disabled_(true), ignore_page_flip_event_(false) { |
| memset(&mode_, 0, sizeof(mode_)); |
| AddCrtc(controller.Pass()); |
| } |
| @@ -41,7 +41,7 @@ HardwareDisplayController::HardwareDisplayController( |
| HardwareDisplayController::~HardwareDisplayController() { |
| // Reset the cursor. |
| UnsetCursor(); |
| - ClearPendingRequests(); |
| + ProcessPageFlipRequest(); |
| } |
| bool HardwareDisplayController::Modeset(const OverlayPlane& primary, |
| @@ -55,14 +55,12 @@ bool HardwareDisplayController::Modeset(const OverlayPlane& primary, |
| is_disabled_ = false; |
| mode_ = mode; |
| - current_planes_ = std::vector<OverlayPlane>(1, primary); |
| - ClearPendingRequests(); |
| + ProcessPageFlipRequest(); |
| - // Because a page flip is pending we need to leave some state for the |
| - // callback. We use the modeset state since it is the only valid state. |
| - if (HasPendingPageFlips()) |
| - requests_.push_back( |
| - PageFlipRequest(current_planes_, false, base::Bind(&base::DoNothing))); |
| + // If a page flip is pending we need to leave some state for when page flip |
| + // event fires. We already acknowledged the previous buffer and need skip the |
| + // following page flip callback. |
| + ignore_page_flip_event_ = HasPendingPageFlips(); |
| return status; |
| } |
| @@ -74,10 +72,7 @@ void HardwareDisplayController::Disable() { |
| // Don't hold onto any requests because we don't track fron buffer while |
| // disabled. |
| - while (requests_.size()) |
| - ProcessPageFlipRequest(); |
| - |
| - current_planes_.clear(); |
| + ProcessPageFlipRequest(); |
| is_disabled_ = true; |
| } |
| @@ -88,25 +83,19 @@ bool HardwareDisplayController::SchedulePageFlip( |
| const base::Closure& callback) { |
| TRACE_EVENT0("drm", "HDC::SchedulePageFlip"); |
| + // A request is being serviced right now. |
|
dnicoara
2015/04/21 19:37:58
I'm finding this comment to be confusing. It sound
|
| + DCHECK(!HasPendingPageFlips()); |
|
dnicoara
2015/04/21 19:37:58
I think this may not always be true. For example:
|
| + DCHECK(!page_flip_request_.get()); |
| + |
| // Ignore requests with no planes to schedule. |
| if (plane_list.empty()) { |
| callback.Run(); |
| return true; |
| } |
| - requests_.push_back(PageFlipRequest(plane_list, is_sync, callback)); |
| + page_flip_request_.reset(new PageFlipRequest(plane_list, is_sync, callback)); |
| - // A request is being serviced right now. |
| - if (HasPendingPageFlips()) |
| - return true; |
| - |
| - bool status = ActualSchedulePageFlip(); |
| - |
| - // No page flip event on failure so discard failed request. |
| - if (!status) |
| - requests_.pop_front(); |
| - |
| - return status; |
| + return ActualSchedulePageFlip(); |
| } |
| bool HardwareDisplayController::SetCursor( |
| @@ -233,24 +222,12 @@ void HardwareDisplayController::OnPageFlipEvent() { |
| if (HasPendingPageFlips()) |
| return; |
| - if (!requests_.empty()) |
| - ProcessPageFlipRequest(); |
| - |
| - // ProcessPageFlipRequest() consumes a request. |
| - if (requests_.empty()) |
| + if (ignore_page_flip_event_) { |
| + ignore_page_flip_event_ = false; |
| return; |
| - |
| - // At this point we still have requests pending, so schedule the next request. |
| - bool status = ActualSchedulePageFlip(); |
| - if (!status) { |
| - PageFlipRequest request = requests_.front(); |
| - requests_.pop_front(); |
| - |
| - // Normally the caller would handle the error call, but because we're in a |
| - // delayed schedule the initial SchedulePageFlip() already returned true, |
| - // thus we need to run the callback. |
| - request.callback.Run(); |
| } |
| + |
| + ProcessPageFlipRequest(); |
| } |
| scoped_refptr<DrmDevice> HardwareDisplayController::GetAllocationDrmDevice() |
| @@ -271,14 +248,10 @@ bool HardwareDisplayController::HasPendingPageFlips() const { |
| bool HardwareDisplayController::ActualSchedulePageFlip() { |
| TRACE_EVENT0("drm", "HDC::ActualSchedulePageFlip"); |
| - DCHECK(!requests_.empty()); |
| - |
| - if (is_disabled_) { |
| - ProcessPageFlipRequest(); |
| - return true; |
| - } |
| + DCHECK(page_flip_request_.get()); |
| + DCHECK(!is_disabled_); |
| - OverlayPlaneList pending_planes = requests_.front().planes; |
| + OverlayPlaneList& pending_planes = page_flip_request_->planes; |
| std::sort(pending_planes.begin(), pending_planes.end(), |
| [](const OverlayPlane& l, const OverlayPlane& r) { |
| return l.z_order < r.z_order; |
| @@ -291,7 +264,7 @@ bool HardwareDisplayController::ActualSchedulePageFlip() { |
| pending_planes); |
| } |
| - bool is_sync = requests_.front().is_sync; |
| + bool is_sync = page_flip_request_->is_sync; |
| for (const auto& planes : owned_hardware_planes_) { |
| if (!planes.first->plane_manager()->Commit(planes.second, is_sync)) { |
| status = false; |
| @@ -302,19 +275,12 @@ bool HardwareDisplayController::ActualSchedulePageFlip() { |
| } |
| void HardwareDisplayController::ProcessPageFlipRequest() { |
| - DCHECK(!requests_.empty()); |
| - PageFlipRequest request = requests_.front(); |
| - requests_.pop_front(); |
| - |
| - current_planes_.swap(request.planes); |
| - request.callback.Run(); |
| -} |
| - |
| -void HardwareDisplayController::ClearPendingRequests() { |
| - while (!requests_.empty()) { |
| - PageFlipRequest request = requests_.front(); |
| - requests_.pop_front(); |
| - request.callback.Run(); |
| + if (page_flip_request_.get()) { |
| + scoped_ptr<PageFlipRequest> last_request; |
| + // We are done with the last request, so clear it before we execute the |
| + // callback since it may schedule a new frame. |
| + swap(last_request, page_flip_request_); |
| + last_request->callback.Run(); |
| } |
| } |