Chromium Code Reviews| Index: ui/ozone/platform/dri/hardware_display_controller.cc |
| diff --git a/ui/ozone/platform/dri/hardware_display_controller.cc b/ui/ozone/platform/dri/hardware_display_controller.cc |
| index 882efc1f58754583c65132af5d0f9379c3df537c..552c421b72667d7193ca1eb36de1b34c4ac075c6 100644 |
| --- a/ui/ozone/platform/dri/hardware_display_controller.cc |
| +++ b/ui/ozone/platform/dri/hardware_display_controller.cc |
| @@ -18,7 +18,6 @@ |
| #include "ui/gfx/geometry/size.h" |
| #include "ui/ozone/platform/dri/dri_buffer.h" |
| #include "ui/ozone/platform/dri/dri_wrapper.h" |
| -#include "ui/ozone/platform/dri/scanout_surface.h" |
| #include "ui/ozone/public/native_pixmap.h" |
| namespace ui { |
| @@ -45,14 +44,31 @@ void HandlePageFlipEvent(int fd, |
| ->OnPageFlipEvent(frame, seconds, useconds); |
| } |
| +const OverlayPlane& GetPrimaryPlane(const OverlayPlaneList& overlays) { |
| + for (size_t i = 0; i < overlays.size(); ++i) { |
| + if (overlays[i].z_order == 0) |
| + return overlays[i]; |
| + } |
| + |
| + NOTREACHED(); |
| + return overlays[0]; |
| +} |
| + |
| } // namespace |
| -OzoneOverlayPlane::OzoneOverlayPlane(ScanoutSurface* scanout, |
| - int z_order, |
| - gfx::OverlayTransform plane_transform, |
| - const gfx::Rect& display_bounds, |
| - const gfx::RectF& crop_rect) |
| - : scanout(scanout), |
| +OverlayPlane::OverlayPlane(scoped_refptr<ScanoutBuffer> buffer) |
| + : buffer(buffer), |
| + z_order(0), |
| + display_bounds(gfx::Point(), buffer->GetSize()), |
| + crop_rect(0, 0, 1, 1), |
| + overlay_plane(0) {} |
| + |
| +OverlayPlane::OverlayPlane(scoped_refptr<ScanoutBuffer> buffer, |
| + int z_order, |
| + gfx::OverlayTransform plane_transform, |
| + const gfx::Rect& display_bounds, |
| + const gfx::RectF& crop_rect) |
| + : buffer(buffer), |
| z_order(z_order), |
| plane_transform(plane_transform), |
| display_bounds(display_bounds), |
| @@ -60,6 +76,8 @@ OzoneOverlayPlane::OzoneOverlayPlane(ScanoutSurface* scanout, |
| overlay_plane(0) { |
| } |
| +OverlayPlane::~OverlayPlane() {} |
| + |
| HardwareDisplayController::HardwareDisplayController( |
| DriWrapper* drm, |
| uint32_t connector_id, |
| @@ -67,7 +85,6 @@ HardwareDisplayController::HardwareDisplayController( |
| : drm_(drm), |
| connector_id_(connector_id), |
| crtc_id_(crtc_id), |
| - surface_(), |
| time_of_last_flip_(0), |
| is_disabled_(true), |
| saved_crtc_(drm_->GetCrtc(crtc_id_)) {} |
| @@ -78,45 +95,35 @@ HardwareDisplayController::~HardwareDisplayController() { |
| // Reset the cursor. |
| UnsetCursor(); |
| - UnbindSurfaceFromController(); |
| } |
| -bool |
| -HardwareDisplayController::BindSurfaceToController( |
| - scoped_ptr<ScanoutSurface> surface, drmModeModeInfo mode) { |
| - CHECK(surface); |
| - |
| +bool HardwareDisplayController::Modeset(const OverlayPlane& primary, |
| + drmModeModeInfo mode) { |
| + CHECK(primary.buffer); |
| if (!drm_->SetCrtc(crtc_id_, |
| - surface->GetFramebufferId(), |
| + primary.buffer->GetFramebufferId(), |
| &connector_id_, |
| &mode)) { |
| LOG(ERROR) << "Failed to modeset: error='" << strerror(errno) |
| << "' crtc=" << crtc_id_ << " connector=" << connector_id_ |
| - << " framebuffer_id=" << surface->GetFramebufferId() |
| + << " framebuffer_id=" << primary.buffer->GetFramebufferId() |
| << " mode=" << mode.hdisplay << "x" << mode.vdisplay << "@" |
| << mode.vrefresh; |
| return false; |
| } |
| - surface_.reset(surface.release()); |
| + current_planes_ = std::vector<OverlayPlane>(1, primary); |
| + pending_planes_.clear(); |
| mode_ = mode; |
| is_disabled_ = false; |
| return true; |
| } |
| -void HardwareDisplayController::UnbindSurfaceFromController() { |
| - drm_->SetCrtc(crtc_id_, 0, 0, NULL); |
| - surface_.reset(); |
| - memset(&mode_, 0, sizeof(mode_)); |
| - is_disabled_ = true; |
| -} |
| - |
| bool HardwareDisplayController::Enable() { |
| - CHECK(surface_); |
| - if (is_disabled_) { |
| - scoped_ptr<ScanoutSurface> surface(surface_.release()); |
| - return BindSurfaceToController(surface.Pass(), mode_); |
| - } |
| + OverlayPlane primary = GetPrimaryPlane(current_planes_); |
| + CHECK(primary.buffer); |
| + if (is_disabled_) |
| + return Modeset(primary, mode_); |
| return true; |
| } |
| @@ -126,46 +133,29 @@ void HardwareDisplayController::Disable() { |
| is_disabled_ = true; |
| } |
| -ScanoutSurface* HardwareDisplayController::GetPrimaryPlane( |
| - const std::vector<OzoneOverlayPlane>& overlays) { |
| - ScanoutSurface* primary = surface_.get(); |
| - for (size_t i = 0; i < overlays.size(); i++) { |
| - const OzoneOverlayPlane& plane = overlays[i]; |
| - if (plane.z_order == 0) { |
| - return plane.scanout; |
| - } |
| - } |
| - |
| - return primary; |
| -} |
| - |
| bool HardwareDisplayController::SchedulePageFlip( |
| - const std::vector<OzoneOverlayPlane>& overlays, |
| - NativePixmapList* references) { |
| - ScanoutSurface* primary = GetPrimaryPlane(overlays); |
| - CHECK(primary); |
| - |
| - primary->PreSwapBuffers(); |
| + const OverlayPlaneList& overlays) { |
| + CHECK_LE(1u, overlays.size()); |
| + const OverlayPlane& primary = GetPrimaryPlane(overlays); |
| + CHECK(primary.buffer); |
| if (!is_disabled_ && |
| - !drm_->PageFlip(crtc_id_, primary->GetFramebufferId(), this)) { |
| + !drm_->PageFlip(crtc_id_, primary.buffer->GetFramebufferId(), this)) { |
| LOG(ERROR) << "Cannot page flip: " << strerror(errno); |
| return false; |
| } |
| - current_overlay_references_.clear(); |
| - if (references) |
| - current_overlay_references_.swap(*references); |
| + pending_planes_ = overlays; |
| for (size_t i = 0; i < overlays.size(); i++) { |
| - const OzoneOverlayPlane& plane = overlays[i]; |
| + const OverlayPlane& plane = overlays[i]; |
| if (!plane.overlay_plane) |
| continue; |
| - const gfx::Size& size = plane.scanout->Size(); |
| + const gfx::Size& size = plane.buffer->GetSize(); |
| gfx::RectF crop_rect = plane.crop_rect; |
| crop_rect.Scale(size.width(), size.height()); |
| if (!drm_->PageFlipOverlay(crtc_id_, |
| - plane.scanout->GetFramebufferId(), |
| + plane.buffer->GetFramebufferId(), |
| plane.display_bounds, |
| crop_rect, |
| plane.overlay_plane)) { |
| @@ -199,7 +189,8 @@ void HardwareDisplayController::OnPageFlipEvent(unsigned int frame, |
| static_cast<uint64_t>(seconds) * base::Time::kMicrosecondsPerSecond + |
| useconds; |
| - surface_->SwapBuffers(); |
| + current_planes_ = pending_planes_; |
| + pending_planes_.clear(); |
| } |
| bool HardwareDisplayController::SetCursor(scoped_refptr<ScanoutBuffer> buffer) { |
| @@ -207,6 +198,7 @@ bool HardwareDisplayController::SetCursor(scoped_refptr<ScanoutBuffer> buffer) { |
| buffer->GetHandle(), |
| buffer->GetSize()); |
| cursor_buffer_ = buffer; |
| + |
|
alexst (slow to review)
2014/07/21 20:56:24
Please remove extra whitespace unless you think it
dnicoara
2014/07/21 21:02:12
Done.
|
| return ret; |
| } |