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