| OLD | NEW |
| 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 "ui/ozone/platform/drm/gpu/crtc_controller.h" | 5 #include "ui/ozone/platform/drm/gpu/crtc_controller.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
| 9 #include "ui/ozone/platform/drm/gpu/drm_device.h" | 9 #include "ui/ozone/platform/drm/gpu/drm_device.h" |
| 10 #include "ui/ozone/platform/drm/gpu/page_flip_request.h" | 10 #include "ui/ozone/platform/drm/gpu/page_flip_request.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 for (auto* plane : all_planes) { | 26 for (auto* plane : all_planes) { |
| 27 if (plane->owning_crtc() == crtc_) { | 27 if (plane->owning_crtc() == crtc_) { |
| 28 plane->set_owning_crtc(0); | 28 plane->set_owning_crtc(0); |
| 29 plane->set_in_use(false); | 29 plane->set_in_use(false); |
| 30 } | 30 } |
| 31 } | 31 } |
| 32 | 32 |
| 33 SetCursor(nullptr); | 33 SetCursor(nullptr); |
| 34 drm_->DisableCrtc(crtc_); | 34 drm_->DisableCrtc(crtc_); |
| 35 if (page_flip_request_) | 35 if (page_flip_request_) |
| 36 SignalPageFlipRequest(); | 36 SignalPageFlipRequest(gfx::SwapResult::SWAP_ACK); |
| 37 } | 37 } |
| 38 } | 38 } |
| 39 | 39 |
| 40 bool CrtcController::Modeset(const OverlayPlane& plane, drmModeModeInfo mode) { | 40 bool CrtcController::Modeset(const OverlayPlane& plane, drmModeModeInfo mode) { |
| 41 if (!drm_->SetCrtc(crtc_, plane.buffer->GetFramebufferId(), | 41 if (!drm_->SetCrtc(crtc_, plane.buffer->GetFramebufferId(), |
| 42 std::vector<uint32_t>(1, connector_), &mode)) { | 42 std::vector<uint32_t>(1, connector_), &mode)) { |
| 43 PLOG(ERROR) << "Failed to modeset: crtc=" << crtc_ | 43 PLOG(ERROR) << "Failed to modeset: crtc=" << crtc_ |
| 44 << " connector=" << connector_ | 44 << " connector=" << connector_ |
| 45 << " framebuffer_id=" << plane.buffer->GetFramebufferId() | 45 << " framebuffer_id=" << plane.buffer->GetFramebufferId() |
| 46 << " mode=" << mode.hdisplay << "x" << mode.vdisplay << "@" | 46 << " mode=" << mode.hdisplay << "x" << mode.vdisplay << "@" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 } | 112 } |
| 113 | 113 |
| 114 return true; | 114 return true; |
| 115 } | 115 } |
| 116 | 116 |
| 117 std::vector<uint32_t> CrtcController::GetCompatibleHardwarePlaneIds( | 117 std::vector<uint32_t> CrtcController::GetCompatibleHardwarePlaneIds( |
| 118 const OverlayPlane& plane) const { | 118 const OverlayPlane& plane) const { |
| 119 return drm_->plane_manager()->GetCompatibleHardwarePlaneIds(plane, crtc_); | 119 return drm_->plane_manager()->GetCompatibleHardwarePlaneIds(plane, crtc_); |
| 120 } | 120 } |
| 121 | 121 |
| 122 void CrtcController::PageFlipFailed() { | |
| 123 pending_planes_.clear(); | |
| 124 SignalPageFlipRequest(); | |
| 125 } | |
| 126 | |
| 127 void CrtcController::OnPageFlipEvent(unsigned int frame, | 122 void CrtcController::OnPageFlipEvent(unsigned int frame, |
| 128 unsigned int seconds, | 123 unsigned int seconds, |
| 129 unsigned int useconds) { | 124 unsigned int useconds) { |
| 130 time_of_last_flip_ = | 125 time_of_last_flip_ = |
| 131 static_cast<uint64_t>(seconds) * base::Time::kMicrosecondsPerSecond + | 126 static_cast<uint64_t>(seconds) * base::Time::kMicrosecondsPerSecond + |
| 132 useconds; | 127 useconds; |
| 133 | 128 |
| 134 current_planes_.clear(); | 129 SignalPageFlipRequest(gfx::SwapResult::SWAP_ACK); |
| 135 current_planes_.swap(pending_planes_); | |
| 136 | |
| 137 SignalPageFlipRequest(); | |
| 138 } | 130 } |
| 139 | 131 |
| 140 bool CrtcController::SetCursor(const scoped_refptr<ScanoutBuffer>& buffer) { | 132 bool CrtcController::SetCursor(const scoped_refptr<ScanoutBuffer>& buffer) { |
| 141 DCHECK(!is_disabled_ || !buffer); | 133 DCHECK(!is_disabled_ || !buffer); |
| 142 cursor_buffer_ = buffer; | 134 cursor_buffer_ = buffer; |
| 143 | 135 |
| 144 return ResetCursor(); | 136 return ResetCursor(); |
| 145 } | 137 } |
| 146 | 138 |
| 147 bool CrtcController::MoveCursor(const gfx::Point& location) { | 139 bool CrtcController::MoveCursor(const gfx::Point& location) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 161 bool status = drm_->SetCursor(crtc_, handle, size); | 153 bool status = drm_->SetCursor(crtc_, handle, size); |
| 162 if (!status) { | 154 if (!status) { |
| 163 PLOG(ERROR) << "drmModeSetCursor: device " << drm_->device_path().value() | 155 PLOG(ERROR) << "drmModeSetCursor: device " << drm_->device_path().value() |
| 164 << " crtc " << crtc_ << " handle " << handle << " size " | 156 << " crtc " << crtc_ << " handle " << handle << " size " |
| 165 << size.ToString(); | 157 << size.ToString(); |
| 166 } | 158 } |
| 167 | 159 |
| 168 return status; | 160 return status; |
| 169 } | 161 } |
| 170 | 162 |
| 171 void CrtcController::SignalPageFlipRequest() { | 163 void CrtcController::SignalPageFlipRequest(gfx::SwapResult result) { |
| 164 if (result == gfx::SwapResult::SWAP_ACK) |
| 165 current_planes_.swap(pending_planes_); |
| 166 |
| 167 pending_planes_.clear(); |
| 168 |
| 172 scoped_refptr<PageFlipRequest> request; | 169 scoped_refptr<PageFlipRequest> request; |
| 173 request.swap(page_flip_request_); | 170 request.swap(page_flip_request_); |
| 174 request->Signal(gfx::SwapResult::SWAP_ACK); | 171 request->Signal(result); |
| 175 } | 172 } |
| 176 | 173 |
| 177 } // namespace ui | 174 } // namespace ui |
| OLD | NEW |