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.
5 #include "content/common/gpu/image_transport_surface_fbo_mac.h"
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"
16 // A subclass of GLSurfaceOSMesa that doesn't print an error message when
17 // SwapBuffers() is called.
18 class DRTSurfaceOSMesa : public gfx::GLSurfaceOSMesa {
20 // Size doesn't matter, the surface is resized to the right size later.
22 : GLSurfaceOSMesa(gfx::OSMesaSurfaceFormatRGBA, gfx::Size(1, 1)) {}
24 // Implement a subset of GLSurface.
25 bool SwapBuffers() override;
28 ~DRTSurfaceOSMesa() override {}
29 DISALLOW_COPY_AND_ASSIGN(DRTSurfaceOSMesa);
32 bool DRTSurfaceOSMesa::SwapBuffers() {
36 bool g_allow_os_mesa = false;
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::NULL_TRANSPORT);
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));
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) {
59 return scoped_refptr<gfx::GLSurface>();
61 scoped_refptr<gfx::GLSurface> surface(new DRTSurfaceOSMesa());
62 if (!surface.get() || !surface->Initialize())
64 return scoped_refptr<gfx::GLSurface>(new PassThroughImageTransportSurface(
65 manager, stub, surface.get()));
70 void ImageTransportSurface::SetAllowOSMesaForTesting(bool allow) {
71 g_allow_os_mesa = allow;
74 } // namespace content