1 // Copyright (c) 2012 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 "base/base_paths.h" 6 #include "base/command_line.h" 7 #include "base/files/file_path.h" 8 #include "base/logging.h" 9 #include "base/native_library.h" 10 #include "base/path_service.h" 11 #include "ui/gl/gl_bindings.h" 12 #include "ui/gl/gl_egl_api_implementation.h" 13 #include "ui/gl/gl_gl_api_implementation.h" 14 #include "ui/gl/gl_implementation.h" 15 #include "ui/gl/gl_osmesa_api_implementation.h" 16 17 namespace gfx { 18 19 namespace { 20 21 void GL_BINDING_CALL MarshalClearDepthToClearDepthf(GLclampd depth) { 22 glClearDepthf(static_cast<GLclampf>(depth)); 23 } 24 25 void GL_BINDING_CALL MarshalDepthRangeToDepthRangef(GLclampd z_near, 26 GLclampd z_far) { 27 glDepthRangef(static_cast<GLclampf>(z_near), static_cast<GLclampf>(z_far)); 28 } 29 30 base::NativeLibrary LoadLibrary(const base::FilePath& filename) { 31 std::string error; 32 base::NativeLibrary library = base::LoadNativeLibrary(filename, &error); 33 if (!library) { 34 DVLOG(1) << "Failed to load " << filename.MaybeAsASCII() << ": " << error; 35 return NULL; 36 } 37 return library; 38 } 39 40 base::NativeLibrary LoadLibrary(const char* filename) { 41 return LoadLibrary(base::FilePath(filename)); 42 } 43 44 } // namespace 45 46 void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) { 47 impls->push_back(kGLImplementationEGLGLES2); 48 } 49 50 bool InitializeGLBindings(GLImplementation implementation) { 51 // Prevent reinitialization with a different implementation. Once the gpu 52 // unit tests have initialized with kGLImplementationMock, we don't want to 53 // later switch to another GL implementation. 54 if (GetGLImplementation() != kGLImplementationNone) 55 return true; 56 57 switch (implementation) { 58 case kGLImplementationEGLGLES2: { 59 base::NativeLibrary gles_library = LoadLibrary("libGLESv2.so"); 60 if (!gles_library) 61 return false; 62 base::NativeLibrary egl_library = LoadLibrary("libEGL.so"); 63 if (!egl_library) { 64 base::UnloadNativeLibrary(gles_library); 65 return false; 66 } 67 68 GLGetProcAddressProc get_proc_address = 69 reinterpret_cast<GLGetProcAddressProc>( 70 base::GetFunctionPointerFromNativeLibrary( 71 egl_library, "eglGetProcAddress")); 72 if (!get_proc_address) { 73 LOG(ERROR) << "eglGetProcAddress not found."; 74 base::UnloadNativeLibrary(egl_library); 75 base::UnloadNativeLibrary(gles_library); 76 return false; 77 } 78 79 SetGLGetProcAddressProc(get_proc_address); 80 AddGLNativeLibrary(egl_library); 81 AddGLNativeLibrary(gles_library); 82 SetGLImplementation(kGLImplementationEGLGLES2); 83 84 InitializeGLBindingsGL(); 85 InitializeGLBindingsEGL(); 86 87 // These two functions take single precision float rather than double 88 // precision float parameters in GLES. 89 ::gfx::g_driver_gl.fn.glClearDepthFn = MarshalClearDepthToClearDepthf; 90 ::gfx::g_driver_gl.fn.glDepthRangeFn = MarshalDepthRangeToDepthRangef; 91 break; 92 } 93 case kGLImplementationMockGL: { 94 SetGLGetProcAddressProc(GetMockGLProcAddress); 95 SetGLImplementation(kGLImplementationMockGL); 96 InitializeGLBindingsGL(); 97 break; 98 } 99 default: 100 NOTIMPLEMENTED() << "InitializeGLBindings on Android"; 101 return false; 102 } 103 104 return true; 105 } 106 107 bool InitializeGLExtensionBindings(GLImplementation implementation, 108 GLContext* context) { 109 switch (implementation) { 110 case kGLImplementationEGLGLES2: 111 InitializeGLExtensionBindingsGL(context); 112 InitializeGLExtensionBindingsEGL(context); 113 break; 114 case kGLImplementationMockGL: 115 InitializeGLExtensionBindingsGL(context); 116 break; 117 default: 118 return false; 119 } 120 121 return true; 122 } 123 124 void InitializeDebugGLBindings() { 125 } 126 127 void ClearGLBindings() { 128 ClearGLBindingsEGL(); 129 ClearGLBindingsGL(); 130 SetGLImplementation(kGLImplementationNone); 131 132 UnloadGLNativeLibraries(); 133 } 134 135 bool GetGLWindowSystemBindingInfo(GLWindowSystemBindingInfo* info) { 136 switch (GetGLImplementation()) { 137 case kGLImplementationEGLGLES2: 138 return GetGLWindowSystemBindingInfoEGL(info); 139 default: 140 return false; 141 } 142 return false; 143 } 144 145 } // namespace gfx 146