// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/base_paths.h" #include "base/file_path.h" #include "base/logging.h" #include "base/native_library.h" #include "base/path_service.h" #include "ui/gfx/gl/gl_bindings.h" #include "ui/gfx/gl/gl_implementation.h" namespace gfx { namespace { const char kOpenGLFrameworkPath[] = "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL"; } // namespace anonymous bool InitializeGLBindings(GLImplementation implementation) { // Prevent reinitialization with a different implementation. Once the gpu // unit tests have initialized with kGLImplementationMock, we don't want to // later switch to another GL implementation. if (GetGLImplementation() != kGLImplementationNone) return true; switch (implementation) { case kGLImplementationOSMesaGL: { FilePath module_path; if (!PathService::Get(base::DIR_MODULE, &module_path)) { LOG(ERROR) << "PathService::Get failed."; return false; } // osmesa.so is located in: // Contents/Versions//Chromium Framework.framework/Libraries module_path = module_path.DirName().Append("Libraries"); // When using OSMesa, just use OSMesaGetProcAddress to find entry points. base::NativeLibrary library = base::LoadNativeLibrary( module_path.Append("osmesa.so"), NULL); if (!library) { VLOG(1) << "osmesa.so not found"; return false; } GLGetProcAddressProc get_proc_address = reinterpret_cast( base::GetFunctionPointerFromNativeLibrary( library, "OSMesaGetProcAddress")); if (!get_proc_address) { LOG(ERROR) << "OSMesaGetProcAddress not found."; base::UnloadNativeLibrary(library); return false; } SetGLGetProcAddressProc(get_proc_address); AddGLNativeLibrary(library); SetGLImplementation(kGLImplementationOSMesaGL); InitializeGLBindingsGL(); InitializeGLBindingsOSMESA(); break; } case kGLImplementationDesktopGL: { base::NativeLibrary library = base::LoadNativeLibrary( FilePath(kOpenGLFrameworkPath), NULL); if (!library) { LOG(ERROR) << "OpenGL framework not found"; return false; } AddGLNativeLibrary(library); SetGLImplementation(kGLImplementationDesktopGL); InitializeGLBindingsGL(); break; } case kGLImplementationMockGL: { SetGLGetProcAddressProc(GetMockGLProcAddress); SetGLImplementation(kGLImplementationMockGL); InitializeGLBindingsGL(); break; } default: return false; } return true; } void InitializeDebugGLBindings() { InitializeDebugGLBindingsGL(); InitializeDebugGLBindingsOSMESA(); } } // namespace gfx