Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / content / common / gpu / image_transport_surface_mac.mm
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/common/gpu/image_transport_surface_fbo_mac.h"
6
7 #include "content/common/gpu/gpu_messages.h"
8 #include "ui/gfx/native_widget_types.h"
9 #include "ui/gl/gl_context.h"
10 #include "ui/gl/gl_implementation.h"
11 #include "ui/gl/gl_surface_osmesa.h"
12
13 namespace content {
14 namespace {
15
16 // A subclass of GLSurfaceOSMesa that doesn't print an error message when
17 // SwapBuffers() is called.
18 class DRTSurfaceOSMesa : public gfx::GLSurfaceOSMesa {
19  public:
20   // Size doesn't matter, the surface is resized to the right size later.
21   DRTSurfaceOSMesa()
22       : GLSurfaceOSMesa(gfx::OSMesaSurfaceFormatRGBA, gfx::Size(1, 1)) {}
23
24   // Implement a subset of GLSurface.
25   virtual bool SwapBuffers() OVERRIDE;
26
27  private:
28   virtual ~DRTSurfaceOSMesa() {}
29   DISALLOW_COPY_AND_ASSIGN(DRTSurfaceOSMesa);
30 };
31
32 bool DRTSurfaceOSMesa::SwapBuffers() {
33   return true;
34 }
35
36 bool g_allow_os_mesa = false;
37
38 }  //  namespace
39
40 // static
41 scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateNativeSurface(
42     GpuChannelManager* manager,
43     GpuCommandBufferStub* stub,
44     const gfx::GLSurfaceHandle& surface_handle) {
45   DCHECK(surface_handle.transport_type == gfx::NATIVE_DIRECT ||
46          surface_handle.transport_type == gfx::NATIVE_TRANSPORT);
47
48   switch (gfx::GetGLImplementation()) {
49     case gfx::kGLImplementationDesktopGL:
50     case gfx::kGLImplementationAppleGL:
51       return scoped_refptr<gfx::GLSurface>(new ImageTransportSurfaceFBO(
52           manager, stub, surface_handle.handle));
53     default:
54       // Content shell in DRT mode spins up a gpu process which needs an
55       // image transport surface, but that surface isn't used to read pixel
56       // baselines. So this is mostly a dummy surface.
57       if (!g_allow_os_mesa) {
58         NOTREACHED();
59         return scoped_refptr<gfx::GLSurface>();
60       }
61       scoped_refptr<gfx::GLSurface> surface(new DRTSurfaceOSMesa());
62       if (!surface.get() || !surface->Initialize())
63         return surface;
64       return scoped_refptr<gfx::GLSurface>(new PassThroughImageTransportSurface(
65           manager, stub, surface.get()));
66   }
67 }
68
69 // static
70 void ImageTransportSurface::SetAllowOSMesaForTesting(bool allow) {
71   g_allow_os_mesa = allow;
72 }
73
74 }  // namespace content