Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1553)

Unified Diff: ui/gl/gl_surface_ozone.cc

Issue 498393003: Surfaceless GLSurfaceOzone implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gl/gl_surface_ozone.cc
diff --git a/ui/gl/gl_surface_ozone.cc b/ui/gl/gl_surface_ozone.cc
index d71867cf53e48091efd5d18fa6d5ae694840a0a9..b2b96414d459415ac9568fe02e6b4690595c9ee1 100644
--- a/ui/gl/gl_surface_ozone.cc
+++ b/ui/gl/gl_surface_ozone.cc
@@ -30,6 +30,9 @@ class GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL {
ozone_surface_(ozone_surface.Pass()),
widget_(widget) {}
+ virtual bool Initialize() OVERRIDE {
+ return Initialize(ozone_surface_->CreateVSyncProvider());
+ }
virtual bool Resize(const gfx::Size& size) OVERRIDE {
if (!ozone_surface_->ResizeNativeWindow(size)) {
if (!ReinitializeNativeSurface() ||
@@ -55,6 +58,8 @@ class GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL {
}
private:
+ using NativeViewGLSurfaceEGL::Initialize;
+
virtual ~GLSurfaceOzoneEGL() {
Destroy(); // EGL surface must be destroyed before SurfaceOzone
}
@@ -79,9 +84,7 @@ class GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL {
}
window_ = ozone_surface_->GetNativeWindow();
- scoped_ptr<VSyncProvider> vsync_provider =
- ozone_surface_->CreateVSyncProvider();
- if (!Initialize(vsync_provider.Pass())) {
+ if (!Initialize()) {
LOG(ERROR) << "Failed to initialize.";
return false;
}
@@ -89,7 +92,6 @@ class GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL {
return true;
}
-
// The native surface. Deleting this is allowed to free the EGLNativeWindow.
scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface_;
AcceleratedWidget widget_;
@@ -97,6 +99,57 @@ class GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL {
DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneEGL);
};
+class GL_EXPORT GLSurfaceOzoneSurfaceless : public SurfacelessEGL {
+ public:
+ GLSurfaceOzoneSurfaceless(scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface,
+ AcceleratedWidget widget)
+ : SurfacelessEGL(gfx::Size()),
+ ozone_surface_(ozone_surface.Pass()),
+ widget_(widget) {}
+
+ virtual bool Initialize() OVERRIDE {
+ if (!SurfacelessEGL::Initialize())
+ return false;
+ vsync_provider_ = ozone_surface_->CreateVSyncProvider();
+ if (!vsync_provider_)
+ return false;
+ return true;
+ }
+ virtual bool Resize(const gfx::Size& size) OVERRIDE {
+ if (!ozone_surface_->ResizeNativeWindow(size))
+ return false;
+
+ return SurfacelessEGL::Resize(size);
+ }
+ virtual bool SwapBuffers() OVERRIDE {
+ return ozone_surface_->OnSwapBuffers();
+ }
+ virtual bool ScheduleOverlayPlane(int z_order,
+ OverlayTransform transform,
+ GLImage* image,
+ const Rect& bounds_rect,
+ const RectF& crop_rect) OVERRIDE {
+ return image->ScheduleOverlayPlane(
+ widget_, z_order, transform, bounds_rect, crop_rect);
+ }
+ virtual bool IsOffscreen() OVERRIDE { return false; }
+ virtual VSyncProvider* GetVSyncProvider() OVERRIDE {
+ return vsync_provider_.get();
+ }
+
+ private:
+ virtual ~GLSurfaceOzoneSurfaceless() {
+ Destroy(); // EGL surface must be destroyed before SurfaceOzone
+ }
+
+ // The native surface. Deleting this is allowed to free the EGLNativeWindow.
+ scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface_;
+ AcceleratedWidget widget_;
+ scoped_ptr<VSyncProvider> vsync_provider_;
+
+ DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneSurfaceless);
+};
+
} // namespace
// static
@@ -128,17 +181,26 @@ scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface(
}
DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2);
if (window != kNullAcceleratedWidget) {
- scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone =
- ui::SurfaceFactoryOzone::GetInstance()->CreateEGLSurfaceForWidget(
- window);
- if (!surface_ozone)
- return NULL;
+ scoped_refptr<GLSurface> surface;
+ if (GLSurfaceEGL::IsEGLSurfacelessContextSupported() &&
+ ui::SurfaceFactoryOzone::GetInstance()
+ ->CanShowPrimaryPlaneAsOverlay()) {
+ scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone =
+ ui::SurfaceFactoryOzone::GetInstance()
+ ->CreateSurfacelessEGLSurfaceForWidget(window);
+ if (!surface_ozone)
+ return NULL;
+ surface = new GLSurfaceOzoneSurfaceless(surface_ozone.Pass(), window);
+ } else {
+ scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone =
+ ui::SurfaceFactoryOzone::GetInstance()->CreateEGLSurfaceForWidget(
+ window);
+ if (!surface_ozone)
+ return NULL;
- scoped_ptr<VSyncProvider> vsync_provider =
- surface_ozone->CreateVSyncProvider();
- scoped_refptr<GLSurfaceOzoneEGL> surface =
- new GLSurfaceOzoneEGL(surface_ozone.Pass(), window);
- if (!surface->Initialize(vsync_provider.Pass()))
+ surface = new GLSurfaceOzoneEGL(surface_ozone.Pass(), window);
+ }
+ if (!surface->Initialize())
return NULL;
return surface;
} else {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698