Index: ui/ozone/platform/dri/gbm_surface_factory.cc |
diff --git a/ui/ozone/platform/dri/gbm_surface_factory.cc b/ui/ozone/platform/dri/gbm_surface_factory.cc |
index 51cd227bf36c7604d7bc401f4491c332c15cf35e..6ffbb71523032021b2cdc20380668008279528d4 100644 |
--- a/ui/ozone/platform/dri/gbm_surface_factory.cc |
+++ b/ui/ozone/platform/dri/gbm_surface_factory.cc |
@@ -15,6 +15,7 @@ |
#include "ui/ozone/platform/dri/hardware_display_controller.h" |
#include "ui/ozone/platform/dri/scanout_surface.h" |
#include "ui/ozone/platform/dri/screen_manager.h" |
+#include "ui/ozone/public/native_pixmap.h" |
#include "ui/ozone/public/surface_ozone_egl.h" |
namespace ui { |
@@ -39,6 +40,8 @@ class GbmSurfaceAdapter : public ui::SurfaceOzoneEGL { |
private: |
base::WeakPtr<HardwareDisplayController> controller_; |
+ NativePixmapList overlay_refs_; |
+ std::vector<OzoneOverlayPlane> overlays_; |
DISALLOW_COPY_AND_ASSIGN(GbmSurfaceAdapter); |
}; |
@@ -65,24 +68,32 @@ bool GbmSurfaceAdapter::ResizeNativeWindow(const gfx::Size& viewport_size) { |
bool GbmSurfaceAdapter::OnSwapBuffers() { |
if (!controller_) |
return false; |
- |
- static_cast<GbmSurface*>(controller_->surface())->LockCurrentDrawable(); |
- if (controller_->SchedulePageFlip()) { |
+ bool flip_succeeded = |
+ controller_->SchedulePageFlip(overlays_, &overlay_refs_); |
+ overlays_.clear(); |
+ if (flip_succeeded) |
controller_->WaitForPageFlipEvent(); |
- return true; |
- } |
- |
- return false; |
+ return flip_succeeded; |
} |
bool GbmSurfaceAdapter::ScheduleOverlayPlane( |
int plane_z_order, |
gfx::OverlayTransform plane_transform, |
- scoped_refptr<ui::NativePixmap> buffer, |
+ scoped_refptr<NativePixmap> buffer, |
const gfx::Rect& display_bounds, |
const gfx::RectF& crop_rect) { |
- NOTIMPLEMENTED(); |
- return false; |
+ GbmPixmap* pixmap = static_cast<GbmPixmap*>(buffer.get()); |
+ if (!pixmap) { |
+ LOG(ERROR) << "ScheduleOverlayPlane passed NULL buffer"; |
+ return false; |
+ } |
+ overlays_.push_back(OzoneOverlayPlane(pixmap->buffer(), |
+ plane_z_order, |
+ plane_transform, |
+ display_bounds, |
+ crop_rect)); |
+ overlay_refs_.push_back(buffer); |
+ return true; |
} |
scoped_ptr<gfx::VSyncProvider> GbmSurfaceAdapter::CreateVSyncProvider() { |
@@ -91,9 +102,11 @@ scoped_ptr<gfx::VSyncProvider> GbmSurfaceAdapter::CreateVSyncProvider() { |
} // namespace |
-GbmSurfaceFactory::GbmSurfaceFactory() |
+GbmSurfaceFactory::GbmSurfaceFactory(bool allow_surfaceless) |
: DriSurfaceFactory(NULL, NULL), |
- device_(NULL) {} |
+ device_(NULL), |
+ allow_surfaceless_(allow_surfaceless) { |
+} |
GbmSurfaceFactory::~GbmSurfaceFactory() {} |
@@ -176,11 +189,15 @@ scoped_ptr<ui::SurfaceOzoneEGL> GbmSurfaceFactory::CreateEGLSurfaceForWidget( |
scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmap( |
gfx::Size size, |
BufferFormat format) { |
- scoped_refptr<GbmBuffer> buf = new GbmBuffer(device_, drm_, size); |
- if (!buf->InitializeBuffer(format, true)) { |
+ scoped_refptr<GbmPixmap> buf = new GbmPixmap(device_, drm_, size); |
+ if (!buf->buffer()->InitializeBuffer(format, true)) { |
return NULL; |
} |
return buf; |
} |
+bool GbmSurfaceFactory::CanShowPrimaryPlaneAsOverlay() { |
+ return allow_surfaceless_; |
+} |
+ |
} // namespace ui |