| Index: ui/gfx/ozone/dri/dri_surface_factory.cc
|
| diff --git a/ui/gfx/ozone/dri/dri_surface_factory.cc b/ui/gfx/ozone/dri/dri_surface_factory.cc
|
| index 5166679ad52b7fdb5e7bd1cdcb37c6a20d88d072..911d341634a728e8de1186fc2b93a3b5c274c7be 100644
|
| --- a/ui/gfx/ozone/dri/dri_surface_factory.cc
|
| +++ b/ui/gfx/ozone/dri/dri_surface_factory.cc
|
| @@ -17,6 +17,7 @@
|
| #include "ui/gfx/ozone/dri/dri_vsync_provider.h"
|
| #include "ui/gfx/ozone/dri/dri_wrapper.h"
|
| #include "ui/gfx/ozone/dri/hardware_display_controller.h"
|
| +#include "ui/gfx/ozone/surface_ozone.h"
|
|
|
| namespace gfx {
|
|
|
| @@ -114,6 +115,35 @@ void UpdateCursorImage(DriSurface* cursor, const SkBitmap& image) {
|
| canvas->drawBitmapRectToRect(image, &damage, damage);
|
| }
|
|
|
| +// Adapter from SurfaceOzone to DriSurfaceFactory
|
| +//
|
| +// This class is derived from SurfaceOzone and owned by the compositor.
|
| +//
|
| +// For DRI the hadware surface & canvas are owned by the platform, so
|
| +// the compositor merely owns this proxy object.
|
| +//
|
| +// TODO(spang): Should the compositor own any bits of the DriSurface?
|
| +class DriSurfaceAdapter : public SurfaceOzone {
|
| + public:
|
| + DriSurfaceAdapter(gfx::AcceleratedWidget w, DriSurfaceFactory* dri)
|
| + : widget_(w), dri_(dri) {}
|
| + virtual ~DriSurfaceAdapter() {}
|
| +
|
| + // SurfaceOzone:
|
| + virtual bool InitializeCanvas() OVERRIDE { return true; }
|
| + virtual SkCanvas* GetCanvas() OVERRIDE {
|
| + return dri_->GetCanvasForWidget(widget_);
|
| + }
|
| + virtual bool SwapCanvas() OVERRIDE { return dri_->SchedulePageFlip(widget_); }
|
| + virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() OVERRIDE {
|
| + return dri_->CreateVSyncProvider(widget_);
|
| + }
|
| +
|
| + private:
|
| + gfx::AcceleratedWidget widget_;
|
| + DriSurfaceFactory* dri_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| DriSurfaceFactory::DriSurfaceFactory()
|
| @@ -176,7 +206,7 @@ gfx::AcceleratedWidget DriSurfaceFactory::GetAcceleratedWidget() {
|
| return kDefaultWidgetHandle;
|
| }
|
|
|
| -gfx::AcceleratedWidget DriSurfaceFactory::RealizeAcceleratedWidget(
|
| +scoped_ptr<SurfaceOzone> DriSurfaceFactory::CreateSurfaceForWidget(
|
| gfx::AcceleratedWidget w) {
|
| CHECK(state_ == INITIALIZED);
|
| // TODO(dnicoara) Once we can handle multiple displays this needs to be
|
| @@ -190,7 +220,7 @@ gfx::AcceleratedWidget DriSurfaceFactory::RealizeAcceleratedWidget(
|
| // hardware display.
|
| if (!InitializeControllerForPrimaryDisplay(drm_.get(), controller_.get())) {
|
| LOG(ERROR) << "Failed to initialize controller";
|
| - return gfx::kNullAcceleratedWidget;
|
| + return scoped_ptr<SurfaceOzone>();
|
| }
|
|
|
| // Create a surface suitable for the current controller.
|
| @@ -200,7 +230,7 @@ gfx::AcceleratedWidget DriSurfaceFactory::RealizeAcceleratedWidget(
|
|
|
| if (!surface->Initialize()) {
|
| LOG(ERROR) << "Failed to initialize surface";
|
| - return gfx::kNullAcceleratedWidget;
|
| + return scoped_ptr<SurfaceOzone>();
|
| }
|
|
|
| // Bind the surface to the controller. This will register the backing buffers
|
| @@ -208,10 +238,10 @@ gfx::AcceleratedWidget DriSurfaceFactory::RealizeAcceleratedWidget(
|
| // takes ownership of the surface.
|
| if (!controller_->BindSurfaceToController(surface.Pass())) {
|
| LOG(ERROR) << "Failed to bind surface to controller";
|
| - return gfx::kNullAcceleratedWidget;
|
| + return scoped_ptr<SurfaceOzone>();
|
| }
|
|
|
| - return reinterpret_cast<gfx::AcceleratedWidget>(controller_->get_surface());
|
| + return make_scoped_ptr<SurfaceOzone>(new DriSurfaceAdapter(w, this));
|
| }
|
|
|
| bool DriSurfaceFactory::LoadEGLGLES2Bindings(
|
| @@ -220,12 +250,6 @@ bool DriSurfaceFactory::LoadEGLGLES2Bindings(
|
| return false;
|
| }
|
|
|
| -bool DriSurfaceFactory::AttemptToResizeAcceleratedWidget(
|
| - gfx::AcceleratedWidget w,
|
| - const gfx::Rect& bounds) {
|
| - return false;
|
| -}
|
| -
|
| bool DriSurfaceFactory::SchedulePageFlip(gfx::AcceleratedWidget w) {
|
| CHECK(state_ == INITIALIZED);
|
| // TODO(dnicoara) Change this CHECK once we're running with the threaded
|
| @@ -261,7 +285,8 @@ bool DriSurfaceFactory::SchedulePageFlip(gfx::AcceleratedWidget w) {
|
| SkCanvas* DriSurfaceFactory::GetCanvasForWidget(
|
| gfx::AcceleratedWidget w) {
|
| CHECK(state_ == INITIALIZED);
|
| - return reinterpret_cast<DriSurface*>(w)->GetDrawableForWidget();
|
| + CHECK_EQ(kDefaultWidgetHandle, w);
|
| + return controller_->get_surface()->GetDrawableForWidget();
|
| }
|
|
|
| scoped_ptr<gfx::VSyncProvider> DriSurfaceFactory::CreateVSyncProvider(
|
|
|