gl_implementation_android.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/base_paths.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/command_line.h" 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/native_library.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/path_service.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gl/gl_bindings.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gl/gl_context_stub_with_extensions.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gl/gl_egl_api_implementation.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gl/gl_gl_api_implementation.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gl/gl_implementation.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gl/gl_osmesa_api_implementation.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace gfx { 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GL_BINDING_CALL MarshalClearDepthToClearDepthf(GLclampd depth) { 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) glClearDepthf(static_cast<GLclampf>(depth)); 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GL_BINDING_CALL MarshalDepthRangeToDepthRangef(GLclampd z_near, 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GLclampd z_far) { 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) glDepthRangef(static_cast<GLclampf>(z_near), static_cast<GLclampf>(z_far)); 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::NativeLibrary LoadLibrary(const base::FilePath& filename) { 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string error; 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::NativeLibrary library = base::LoadNativeLibrary(filename, &error); 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!library) { 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DVLOG(1) << "Failed to load " << filename.MaybeAsASCII() << ": " << error; 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NULL; 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return library; 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::NativeLibrary LoadLibrary(const char* filename) { 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return LoadLibrary(base::FilePath(filename)); 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) { 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) impls->push_back(kGLImplementationEGLGLES2); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool InitializeStaticGLBindings(GLImplementation implementation) { 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Prevent reinitialization with a different implementation. Once the gpu 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // unit tests have initialized with kGLImplementationMock, we don't want to 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // later switch to another GL implementation. 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_EQ(kGLImplementationNone, GetGLImplementation()); 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (implementation) { 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kGLImplementationEGLGLES2: { 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::NativeLibrary gles_library = LoadLibrary("libGLESv2.so"); 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!gles_library) { 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(ERROR) << "Failed to load libGLESv2.so."; 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::NativeLibrary egl_library = LoadLibrary("libEGL.so"); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!egl_library) { 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(ERROR) << "Failed to load libEGL.so."; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UnloadNativeLibrary(gles_library); 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GLGetProcAddressProc get_proc_address = 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<GLGetProcAddressProc>( 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary( 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) egl_library, "eglGetProcAddress")); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!get_proc_address) { 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(ERROR) << "eglGetProcAddress not found."; 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UnloadNativeLibrary(egl_library); 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UnloadNativeLibrary(gles_library); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetGLGetProcAddressProc(get_proc_address); 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddGLNativeLibrary(egl_library); 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddGLNativeLibrary(gles_library); 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetGLImplementation(kGLImplementationEGLGLES2); 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeStaticGLBindingsGL(); 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeStaticGLBindingsEGL(); 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // These two functions take single precision float rather than double 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // precision float parameters in GLES. 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ::gfx::g_driver_gl.fn.glClearDepthFn = MarshalClearDepthToClearDepthf; 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ::gfx::g_driver_gl.fn.glDepthRangeFn = MarshalDepthRangeToDepthRangef; 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kGLImplementationMockGL: { 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetGLImplementation(kGLImplementationMockGL); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeStaticGLBindingsGL(); 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTIMPLEMENTED() << "InitializeStaticGLBindings on Android"; 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool InitializeDynamicGLBindings(GLImplementation implementation, 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GLContext* context) { 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (implementation) { 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kGLImplementationEGLGLES2: 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeDynamicGLBindingsGL(context); 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeDynamicGLBindingsEGL(context); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kGLImplementationMockGL: 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!context) { 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<GLContextStubWithExtensions> mock_context( 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new GLContextStubWithExtensions()); 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mock_context->SetGLVersionString("opengl es 3.0"); 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeDynamicGLBindingsGL(mock_context.get()); 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeDynamicGLBindingsGL(context); 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED() << "InitializeDynamicGLBindings on Android"; 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void InitializeDebugGLBindings() { 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeDebugGLBindingsEGL(); 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeDebugGLBindingsGL(); 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ClearGLBindings() { 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ClearGLBindingsEGL(); 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ClearGLBindingsGL(); 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetGLImplementation(kGLImplementationNone); 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UnloadGLNativeLibraries(); 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool GetGLWindowSystemBindingInfo(GLWindowSystemBindingInfo* info) { 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (GetGLImplementation()) { 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kGLImplementationEGLGLES2: 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetGLWindowSystemBindingInfoEGL(info); 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace gfx 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)