| Index: ui/gl/init/gl_factory_mac.cc
 | 
| diff --git a/ui/gl/init/gl_factory_mac.cc b/ui/gl/init/gl_factory_mac.cc
 | 
| index 878db60fc6472fec34483cc17a7af827b13cf2df..6b8fffa0440cb80db4fb21957a9f312334b4c39e 100644
 | 
| --- a/ui/gl/init/gl_factory_mac.cc
 | 
| +++ b/ui/gl/init/gl_factory_mac.cc
 | 
| @@ -5,17 +5,55 @@
 | 
|  #include "ui/gl/init/gl_factory.h"
 | 
|  
 | 
|  #include "base/logging.h"
 | 
| +#include "base/macros.h"
 | 
|  #include "base/trace_event/trace_event.h"
 | 
| +#include "ui/gl/gl_bindings.h"
 | 
|  #include "ui/gl/gl_context_cgl.h"
 | 
|  #include "ui/gl/gl_context_osmesa.h"
 | 
|  #include "ui/gl/gl_context_stub.h"
 | 
|  #include "ui/gl/gl_implementation.h"
 | 
|  #include "ui/gl/gl_share_group.h"
 | 
|  #include "ui/gl/gl_surface.h"
 | 
| +#include "ui/gl/gl_surface_osmesa.h"
 | 
| +#include "ui/gl/gl_surface_stub.h"
 | 
|  
 | 
|  namespace gl {
 | 
|  namespace init {
 | 
|  
 | 
| +namespace {
 | 
| +
 | 
| +// A "no-op" surface. It is not required that a CGLContextObj have an
 | 
| +// associated drawable (pbuffer or fullscreen context) in order to be
 | 
| +// made current. Everywhere this surface type is used, we allocate an
 | 
| +// FBO at the user level as the drawable of the associated context.
 | 
| +class NoOpGLSurface : public GLSurface {
 | 
| + public:
 | 
| +  explicit NoOpGLSurface(const gfx::Size& size) : size_(size) {}
 | 
| +
 | 
| +  // Implement GLSurface.
 | 
| +  bool Initialize(GLSurface::Format format) override { return true; }
 | 
| +  void Destroy() override {}
 | 
| +  bool IsOffscreen() override { return true; }
 | 
| +  gfx::SwapResult SwapBuffers() override {
 | 
| +    NOTREACHED() << "Cannot call SwapBuffers on a NoOpGLSurface.";
 | 
| +    return gfx::SwapResult::SWAP_FAILED;
 | 
| +  }
 | 
| +  gfx::Size GetSize() override { return size_; }
 | 
| +  void* GetHandle() override { return nullptr; }
 | 
| +  void* GetDisplay() override { return nullptr; }
 | 
| +  bool IsSurfaceless() const override { return true; }
 | 
| +
 | 
| + protected:
 | 
| +  ~NoOpGLSurface() override {}
 | 
| +
 | 
| + private:
 | 
| +  gfx::Size size_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(NoOpGLSurface);
 | 
| +};
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
|  scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
 | 
|                                           GLSurface* compatible_surface,
 | 
|                                           GpuPreference gpu_preference) {
 | 
| @@ -41,5 +79,43 @@ scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
 | 
| +  TRACE_EVENT0("gpu", "gl::init::CreateViewGLSurface");
 | 
| +  switch (GetGLImplementation()) {
 | 
| +    case kGLImplementationDesktopGL:
 | 
| +    case kGLImplementationDesktopGLCoreProfile:
 | 
| +    case kGLImplementationAppleGL: {
 | 
| +      NOTIMPLEMENTED() << "No onscreen support on Mac.";
 | 
| +      return nullptr;
 | 
| +    }
 | 
| +    case kGLImplementationOSMesaGL: {
 | 
| +      return InitializeGLSurface(new GLSurfaceOSMesaHeadless());
 | 
| +    }
 | 
| +    case kGLImplementationMockGL:
 | 
| +      return new GLSurfaceStub;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
| +      return nullptr;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +scoped_refptr<GLSurface> CreateOffscreenGLSurface(const gfx::Size& size) {
 | 
| +  TRACE_EVENT0("gpu", "gl::init::CreateOffscreenGLSurface");
 | 
| +  switch (GetGLImplementation()) {
 | 
| +    case kGLImplementationOSMesaGL:
 | 
| +      return InitializeGLSurface(
 | 
| +          new GLSurfaceOSMesa(GLSurface::SURFACE_OSMESA_RGBA, size));
 | 
| +    case kGLImplementationDesktopGL:
 | 
| +    case kGLImplementationDesktopGLCoreProfile:
 | 
| +    case kGLImplementationAppleGL:
 | 
| +      return InitializeGLSurface(new NoOpGLSurface(size));
 | 
| +    case kGLImplementationMockGL:
 | 
| +      return new GLSurfaceStub;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
| +      return nullptr;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  }  // namespace init
 | 
|  }  // namespace gl
 | 
| 
 |