1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gl/gl_surface.h" 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/logging.h" 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/ref_counted.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/native_widget_types.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gl/gl_context.h" 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/gl/gl_image.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gl/gl_implementation.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gl/gl_surface_egl.h" 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gl/gl_surface_osmesa.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gl/gl_surface_stub.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gl/scoped_make_current.h" 176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/surface_factory_ozone.h" 186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/surface_ozone_egl.h" 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace gfx { 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace { 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// A thin wrapper around GLSurfaceEGL that owns the EGLNativeWindow 25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL { 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public: 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GLSurfaceOzoneEGL(scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface, 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AcceleratedWidget widget) 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : NativeViewGLSurfaceEGL(ozone_surface->GetNativeWindow()), 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ozone_surface_(ozone_surface.Pass()), 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget_(widget) {} 32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool Initialize() OVERRIDE { 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return Initialize(ozone_surface_->CreateVSyncProvider()); 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool Resize(const gfx::Size& size) OVERRIDE { 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!ozone_surface_->ResizeNativeWindow(size)) { 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!ReinitializeNativeSurface() || 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) !ozone_surface_->ResizeNativeWindow(size)) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return NativeViewGLSurfaceEGL::Resize(size); 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool SwapBuffers() OVERRIDE { 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!NativeViewGLSurfaceEGL::SwapBuffers()) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ozone_surface_->OnSwapBuffers(); 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual bool ScheduleOverlayPlane(int z_order, 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OverlayTransform transform, 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GLImage* image, 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const Rect& bounds_rect, 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const RectF& crop_rect) OVERRIDE { 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return image->ScheduleOverlayPlane( 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) widget_, z_order, transform, bounds_rect, crop_rect); 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch private: 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using NativeViewGLSurfaceEGL::Initialize; 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual ~GLSurfaceOzoneEGL() { 64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Destroy(); // EGL surface must be destroyed before SurfaceOzone 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool ReinitializeNativeSurface() { 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<ui::ScopedMakeCurrent> scoped_make_current; 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GLContext* current_context = GLContext::GetCurrent(); 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool was_current = 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) current_context && current_context->IsCurrent(this); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (was_current) { 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_make_current.reset( 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ui::ScopedMakeCurrent(current_context, this)); 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Destroy(); 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ozone_surface_ = 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::SurfaceFactoryOzone::GetInstance()->CreateEGLSurfaceForWidget( 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget_).Pass(); 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!ozone_surface_) { 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LOG(ERROR) << "Failed to create native surface."; 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) window_ = ozone_surface_->GetNativeWindow(); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!Initialize()) { 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LOG(ERROR) << "Failed to initialize."; 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // The native surface. Deleting this is allowed to free the EGLNativeWindow. 966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface_; 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AcceleratedWidget widget_; 98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneEGL); 100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}; 101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass GL_EXPORT GLSurfaceOzoneSurfaceless : public SurfacelessEGL { 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GLSurfaceOzoneSurfaceless(scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface, 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AcceleratedWidget widget) 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : SurfacelessEGL(gfx::Size()), 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ozone_surface_(ozone_surface.Pass()), 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci widget_(widget) {} 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool Initialize() OVERRIDE { 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!SurfacelessEGL::Initialize()) 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vsync_provider_ = ozone_surface_->CreateVSyncProvider(); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!vsync_provider_) 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool Resize(const gfx::Size& size) OVERRIDE { 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ozone_surface_->ResizeNativeWindow(size)) 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return SurfacelessEGL::Resize(size); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool SwapBuffers() OVERRIDE { 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO: this should be replaced by a fence when supported by the driver. 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci glFinish(); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return ozone_surface_->OnSwapBuffers(); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool ScheduleOverlayPlane(int z_order, 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OverlayTransform transform, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GLImage* image, 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Rect& bounds_rect, 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const RectF& crop_rect) OVERRIDE { 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return image->ScheduleOverlayPlane( 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci widget_, z_order, transform, bounds_rect, crop_rect); 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool IsOffscreen() OVERRIDE { return false; } 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual VSyncProvider* GetVSyncProvider() OVERRIDE { 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return vsync_provider_.get(); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool SupportsPostSubBuffer() OVERRIDE { return true; } 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE { 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The actual sub buffer handling is handled at higher layers. 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SwapBuffers(); 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool IsSurfaceless() const OVERRIDE { return true; } 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~GLSurfaceOzoneSurfaceless() { 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Destroy(); // EGL surface must be destroyed before SurfaceOzone 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The native surface. Deleting this is allowed to free the EGLNativeWindow. 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface_; 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AcceleratedWidget widget_; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<VSyncProvider> vsync_provider_; 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneSurfaceless); 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} // namespace 163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool GLSurface::InitializeOneOffInternal() { 166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch switch (GetGLImplementation()) { 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case kGLImplementationEGLGLES2: 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!GLSurfaceEGL::InitializeOneOff()) { 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed."; 170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return true; 174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case kGLImplementationOSMesaGL: 175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case kGLImplementationMockGL: 176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return true; 177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch default: 178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_refptr<GLSurface> GLSurface::CreateViewGLSurface( 184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::AcceleratedWidget window) { 185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (GetGLImplementation() == kGLImplementationOSMesaGL) { 186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<GLSurface> surface(new GLSurfaceOSMesaHeadless()); 187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!surface->Initialize()) 188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return NULL; 189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return surface; 190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2); 192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (window != kNullAcceleratedWidget) { 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<GLSurface> surface; 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (GLSurfaceEGL::IsEGLSurfacelessContextSupported() && 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::SurfaceFactoryOzone::GetInstance() 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->CanShowPrimaryPlaneAsOverlay()) { 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone = 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::SurfaceFactoryOzone::GetInstance() 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->CreateSurfacelessEGLSurfaceForWidget(window); 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!surface_ozone) 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci surface = new GLSurfaceOzoneSurfaceless(surface_ozone.Pass(), window); 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone = 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::SurfaceFactoryOzone::GetInstance()->CreateEGLSurfaceForWidget( 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window); 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!surface_ozone) 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci surface = new GLSurfaceOzoneEGL(surface_ozone.Pass(), window); 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!surface->Initialize()) 213e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return NULL; 214e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return surface; 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else { 216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<GLSurface> surface = new GLSurfaceStub(); 217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (surface->Initialize()) 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return surface; 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return NULL; 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface( 225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const gfx::Size& size) { 226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch switch (GetGLImplementation()) { 227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case kGLImplementationOSMesaGL: { 22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<GLSurface> surface( 22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new GLSurfaceOSMesa(OSMesaSurfaceFormatBGRA, size)); 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!surface->Initialize()) 231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return NULL; 232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return surface; 234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case kGLImplementationEGLGLES2: { 236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<GLSurface> surface; 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (GLSurfaceEGL::IsEGLSurfacelessContextSupported() && 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch (size.width() == 0 && size.height() == 0)) { 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch surface = new SurfacelessEGL(size); 240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else 241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch surface = new PbufferGLSurfaceEGL(size); 242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!surface->Initialize()) 244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return NULL; 245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return surface; 246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch default: 248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NOTREACHED(); 249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return NULL; 250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 253effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochEGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() { 2546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return ui::SurfaceFactoryOzone::GetInstance()->GetNativeDisplay(); 255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace gfx 258