15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_bindings.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gl/gl_context_stub_with_extensions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_egl_api_implementation.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_gl_api_implementation.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_glx_api_implementation.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gl/gl_implementation_osmesa.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_osmesa_api_implementation.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(piman): it should be Desktop GL marshalling from double to float. Today
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on native GLES, we do float->double->float.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GL_BINDING_CALL MarshalClearDepthToClearDepthf(GLclampd depth) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClearDepthf(static_cast<GLclampf>(depth));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GL_BINDING_CALL MarshalDepthRangeToDepthRangef(GLclampd z_near,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    GLclampd z_far) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glDepthRangef(static_cast<GLclampf>(z_near), static_cast<GLclampf>(z_far));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_OPENBSD)
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kGLLibraryName[] = "libGL.so";
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kGLLibraryName[] = "libGL.so.1";
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kGLESv2LibraryName[] = "libGLESv2.so.2";
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kEGLLibraryName[] = "libEGL.so.1";
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  impls->push_back(kGLImplementationDesktopGL);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  impls->push_back(kGLImplementationEGLGLES2);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  impls->push_back(kGLImplementationOSMesaGL);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool InitializeStaticGLBindings(GLImplementation implementation) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prevent reinitialization with a different implementation. Once the gpu
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unit tests have initialized with kGLImplementationMock, we don't want to
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // later switch to another GL implementation.
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_EQ(kGLImplementationNone, GetGLImplementation());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow the main thread or another to initialize these bindings
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after instituting restrictions on I/O. Going forward they will
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // likely be used in the browser process on most platforms. The
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one-time initialization cost is small, between 2 and 5 ms.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadRestrictions::ScopedAllowIO allow_io;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (implementation) {
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case kGLImplementationOSMesaGL:
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return InitializeStaticGLBindingsOSMesaGL();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationDesktopGL: {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::NativeLibrary library = NULL;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CommandLine* command_line = CommandLine::ForCurrentProcess();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (command_line->HasSwitch(switches::kTestGLLib))
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        library = LoadLibraryAndPrintError(
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            command_line->GetSwitchValueASCII(switches::kTestGLLib).c_str());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!library) {
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        library = LoadLibraryAndPrintError(kGLLibraryName);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (!library)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLGetProcAddressProc get_proc_address =
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reinterpret_cast<GLGetProcAddressProc>(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::GetFunctionPointerFromNativeLibrary(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  library, "glXGetProcAddress"));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!get_proc_address) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "glxGetProcAddress not found.";
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::UnloadNativeLibrary(library);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLGetProcAddressProc(get_proc_address);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddGLNativeLibrary(library);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLImplementation(kGLImplementationDesktopGL);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeStaticGLBindingsGL();
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeStaticGLBindingsGLX();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationEGLGLES2: {
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::NativeLibrary gles_library =
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          LoadLibraryAndPrintError(kGLESv2LibraryName);
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (!gles_library)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::NativeLibrary egl_library =
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          LoadLibraryAndPrintError(kEGLLibraryName);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!egl_library) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::UnloadNativeLibrary(gles_library);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLGetProcAddressProc get_proc_address =
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reinterpret_cast<GLGetProcAddressProc>(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::GetFunctionPointerFromNativeLibrary(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  egl_library, "eglGetProcAddress"));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!get_proc_address) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "eglGetProcAddress not found.";
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::UnloadNativeLibrary(egl_library);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::UnloadNativeLibrary(gles_library);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLGetProcAddressProc(get_proc_address);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddGLNativeLibrary(egl_library);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddGLNativeLibrary(gles_library);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLImplementation(kGLImplementationEGLGLES2);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeStaticGLBindingsGL();
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeStaticGLBindingsEGL();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // These two functions take single precision float rather than double
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // precision float parameters in GLES.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::gfx::g_driver_gl.fn.glClearDepthFn = MarshalClearDepthToClearDepthf;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::gfx::g_driver_gl.fn.glDepthRangeFn = MarshalDepthRangeToDepthRangef;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationMockGL: {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLImplementation(kGLImplementationMockGL);
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeStaticGLBindingsGL();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool InitializeDynamicGLBindings(GLImplementation implementation,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLContext* context) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (implementation) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationOSMesaGL:
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeDynamicGLBindingsGL(context);
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeDynamicGLBindingsOSMESA(context);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationDesktopGL:
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeDynamicGLBindingsGL(context);
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeDynamicGLBindingsGLX(context);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationEGLGLES2:
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeDynamicGLBindingsGL(context);
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitializeDynamicGLBindingsEGL(context);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationMockGL:
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (!context) {
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scoped_refptr<GLContextStubWithExtensions> mock_context(
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            new GLContextStubWithExtensions());
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        mock_context->SetGLVersionString("3.0");
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        InitializeDynamicGLBindingsGL(mock_context.get());
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      } else
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        InitializeDynamicGLBindingsGL(context);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeDebugGLBindings() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeDebugGLBindingsEGL();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeDebugGLBindingsGL();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeDebugGLBindingsGLX();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeDebugGLBindingsOSMESA();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearGLBindings() {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearGLBindingsEGL();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearGLBindingsGL();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearGLBindingsGLX();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearGLBindingsOSMESA();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetGLImplementation(kGLImplementationNone);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnloadGLNativeLibraries();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GetGLWindowSystemBindingInfo(GLWindowSystemBindingInfo* info) {
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (GetGLImplementation()) {
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case kGLImplementationDesktopGL:
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return GetGLWindowSystemBindingInfoGLX(info);
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case kGLImplementationEGLGLES2:
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return GetGLWindowSystemBindingInfoEGL(info);
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    default:
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return false;
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return false;
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
210