1 // Copyright 2013 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_linux.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 // Load a library, printing an error message on failure.
19 base::NativeLibrary
LoadLibrary(const base::FilePath
& filename
) {
21 base::NativeLibrary library
= base::LoadNativeLibrary(filename
, &error
);
23 DVLOG(1) << "Failed to load " << filename
.MaybeAsASCII() << ": " << error
;
29 base::NativeLibrary
LoadLibrary(const char* filename
) {
30 return LoadLibrary(base::FilePath(filename
));
33 bool InitializeGLBindingsOSMesaGL() {
34 base::FilePath module_path
;
35 if (!PathService::Get(base::DIR_MODULE
, &module_path
)) {
36 LOG(ERROR
) << "PathService::Get failed.";
40 base::NativeLibrary library
= LoadLibrary(module_path
.Append("libosmesa.so"));
44 GLGetProcAddressProc get_proc_address
=
45 reinterpret_cast<GLGetProcAddressProc
>(
46 base::GetFunctionPointerFromNativeLibrary(library
,
47 "OSMesaGetProcAddress"));
48 if (!get_proc_address
) {
49 LOG(ERROR
) << "OSMesaGetProcAddress not found.";
50 base::UnloadNativeLibrary(library
);
54 SetGLGetProcAddressProc(get_proc_address
);
55 AddGLNativeLibrary(library
);
56 SetGLImplementation(kGLImplementationOSMesaGL
);
58 InitializeGLBindingsGL();
59 InitializeGLBindingsOSMESA();