gl_implementation_x11.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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/base_paths.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/native_library.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_bindings.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_egl_api_implementation.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_gl_api_implementation.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_glx_api_implementation.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_osmesa_api_implementation.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(piman): it should be Desktop GL marshalling from double to float. Today
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on native GLES, we do float->double->float.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GL_BINDING_CALL MarshalClearDepthToClearDepthf(GLclampd depth) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClearDepthf(static_cast<GLclampf>(depth));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GL_BINDING_CALL MarshalDepthRangeToDepthRangef(GLclampd z_near,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    GLclampd z_far) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glDepthRangef(static_cast<GLclampf>(z_near), static_cast<GLclampf>(z_far));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Load a library, printing an error message on failure.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::NativeLibrary LoadLibrary(const base::FilePath& filename) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::NativeLibrary library = base::LoadNativeLibrary(filename,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        &error);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!library) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "Failed to load " << filename.MaybeAsASCII() << ": " << error;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return library;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::NativeLibrary LoadLibrary(const char* filename) {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return LoadLibrary(base::FilePath(filename));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  impls->push_back(kGLImplementationDesktopGL);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  impls->push_back(kGLImplementationEGLGLES2);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  impls->push_back(kGLImplementationOSMesaGL);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InitializeGLBindings(GLImplementation implementation) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prevent reinitialization with a different implementation. Once the gpu
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unit tests have initialized with kGLImplementationMock, we don't want to
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // later switch to another GL implementation.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetGLImplementation() != kGLImplementationNone)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow the main thread or another to initialize these bindings
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after instituting restrictions on I/O. Going forward they will
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // likely be used in the browser process on most platforms. The
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one-time initialization cost is small, between 2 and 5 ms.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadRestrictions::ScopedAllowIO allow_io;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (implementation) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationOSMesaGL: {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath module_path;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!PathService::Get(base::DIR_MODULE, &module_path)) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "PathService::Get failed.";
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::NativeLibrary library = LoadLibrary(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          module_path.Append("libosmesa.so"));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!library)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLGetProcAddressProc get_proc_address =
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reinterpret_cast<GLGetProcAddressProc>(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::GetFunctionPointerFromNativeLibrary(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  library, "OSMesaGetProcAddress"));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!get_proc_address) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "OSMesaGetProcAddress not found.";
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::UnloadNativeLibrary(library);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLGetProcAddressProc(get_proc_address);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddGLNativeLibrary(library);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLImplementation(kGLImplementationOSMesaGL);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLBindingsGL();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLBindingsOSMESA();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationDesktopGL: {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::NativeLibrary library = NULL;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CommandLine* command_line = CommandLine::ForCurrentProcess();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (command_line->HasSwitch(switches::kTestGLLib))
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        library = LoadLibrary(command_line->GetSwitchValueASCII(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            switches::kTestGLLib).c_str());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!library) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_OPENBSD)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        library = LoadLibrary("libGL.so");
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        library = LoadLibrary("libGL.so.1");
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!library)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLGetProcAddressProc get_proc_address =
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reinterpret_cast<GLGetProcAddressProc>(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::GetFunctionPointerFromNativeLibrary(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  library, "glXGetProcAddress"));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!get_proc_address) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "glxGetProcAddress not found.";
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::UnloadNativeLibrary(library);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLGetProcAddressProc(get_proc_address);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddGLNativeLibrary(library);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLImplementation(kGLImplementationDesktopGL);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLBindingsGL();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLBindingsGLX();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationEGLGLES2: {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::NativeLibrary gles_library = LoadLibrary("libGLESv2.so.2");
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!gles_library)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::NativeLibrary egl_library = LoadLibrary("libEGL.so.1");
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!egl_library) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::UnloadNativeLibrary(gles_library);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLGetProcAddressProc get_proc_address =
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reinterpret_cast<GLGetProcAddressProc>(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::GetFunctionPointerFromNativeLibrary(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  egl_library, "eglGetProcAddress"));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!get_proc_address) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "eglGetProcAddress not found.";
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::UnloadNativeLibrary(egl_library);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::UnloadNativeLibrary(gles_library);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLGetProcAddressProc(get_proc_address);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddGLNativeLibrary(egl_library);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddGLNativeLibrary(gles_library);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLImplementation(kGLImplementationEGLGLES2);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLBindingsGL();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLBindingsEGL();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // These two functions take single precision float rather than double
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // precision float parameters in GLES.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::gfx::g_driver_gl.fn.glClearDepthFn = MarshalClearDepthToClearDepthf;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::gfx::g_driver_gl.fn.glDepthRangeFn = MarshalDepthRangeToDepthRangef;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationMockGL: {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLGetProcAddressProc(GetMockGLProcAddress);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetGLImplementation(kGLImplementationMockGL);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLBindingsGL();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InitializeGLExtensionBindings(GLImplementation implementation,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLContext* context) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (implementation) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationOSMesaGL:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLExtensionBindingsGL(context);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLExtensionBindingsOSMESA(context);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationDesktopGL:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLExtensionBindingsGL(context);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLExtensionBindingsGLX(context);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationEGLGLES2:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLExtensionBindingsGL(context);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLExtensionBindingsEGL(context);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationMockGL:
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitializeGLExtensionBindingsGL(context);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeDebugGLBindings() {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeDebugGLBindingsEGL();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeDebugGLBindingsGL();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeDebugGLBindingsGLX();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeDebugGLBindingsOSMESA();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearGLBindings() {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearGLBindingsEGL();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearGLBindingsGL();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearGLBindingsGLX();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearGLBindingsOSMESA();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetGLImplementation(kGLImplementationNone);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnloadGLNativeLibraries();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GetGLWindowSystemBindingInfo(GLWindowSystemBindingInfo* info) {
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (GetGLImplementation()) {
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case kGLImplementationDesktopGL:
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return GetGLWindowSystemBindingInfoGLX(info);
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case kGLImplementationEGLGLES2:
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return GetGLWindowSystemBindingInfoEGL(info);
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    default:
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return false;
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return false;
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
245