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..8a2a722e5c14bb7fbe58e7e1bbb08411ac379d3b 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) { |