1 // Copyright 2014 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.
5 #include "ui/gl/gl_implementation_osmesa.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_gl_api_implementation.h"
13 #include "ui/gl/gl_implementation.h"
14 #include "ui/gl/gl_osmesa_api_implementation.h"
18 base::NativeLibrary
LoadLibraryAndPrintError(const base::FilePath
& filename
) {
19 base::NativeLibraryLoadError error
;
20 base::NativeLibrary library
= base::LoadNativeLibrary(filename
, &error
);
22 LOG(ERROR
) << "Failed to load " << filename
.MaybeAsASCII() << ": "
29 base::NativeLibrary
LoadLibraryAndPrintError(const char* filename
) {
30 return LoadLibraryAndPrintError(base::FilePath(filename
));
33 bool InitializeStaticGLBindingsOSMesaGL() {
34 base::FilePath module_path
;
35 if (!PathService::Get(base::DIR_MODULE
, &module_path
)) {
36 LOG(ERROR
) << "PathService::Get failed.";
40 base::FilePath library_path
= module_path
.Append("libosmesa.so");
41 base::NativeLibrary library
= LoadLibraryAndPrintError(library_path
);
45 GLGetProcAddressProc get_proc_address
=
46 reinterpret_cast<GLGetProcAddressProc
>(
47 base::GetFunctionPointerFromNativeLibrary(library
,
48 "OSMesaGetProcAddress"));
49 if (!get_proc_address
) {
50 LOG(ERROR
) << "OSMesaGetProcAddress not found.";
51 base::UnloadNativeLibrary(library
);
55 SetGLGetProcAddressProc(get_proc_address
);
56 AddGLNativeLibrary(library
);
57 SetGLImplementation(kGLImplementationOSMesaGL
);
59 InitializeStaticGLBindingsGL();
60 InitializeStaticGLBindingsOSMESA();