1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gl/init/gl_initializer.h"
#include "base/base_paths.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/native_library.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_display.h"
#include "ui/gl/gl_egl_api_implementation.h"
#include "ui/gl/gl_gl_api_implementation.h"
#include "ui/gl/gl_utils.h"
#include "ui/gl/init/gl_display_initializer.h"
#include "ui/gl/startup_trace.h"
namespace gl {
namespace init {
namespace {
bool InitializeStaticNativeEGLInternal() {
base::NativeLibrary gles_library;
{
GPU_STARTUP_TRACE_EVENT("Load gles_library");
gles_library = LoadLibraryAndPrintError("libGLESv2.so");
}
if (!gles_library)
return false;
base::NativeLibrary egl_library;
{
GPU_STARTUP_TRACE_EVENT("Load egl_library");
egl_library = LoadLibraryAndPrintError("libEGL.so");
}
if (!egl_library) {
base::UnloadNativeLibrary(gles_library);
return false;
}
GLGetProcAddressProc get_proc_address =
reinterpret_cast<GLGetProcAddressProc>(
base::GetFunctionPointerFromNativeLibrary(egl_library,
"eglGetProcAddress"));
if (!get_proc_address) {
LOG(ERROR) << "eglGetProcAddress not found.";
base::UnloadNativeLibrary(egl_library);
base::UnloadNativeLibrary(gles_library);
return false;
}
SetGLGetProcAddressProc(get_proc_address);
AddGLNativeLibrary(egl_library);
AddGLNativeLibrary(gles_library);
return true;
}
bool InitializeStaticEGLInternal(GLImplementationParts implementation) {
bool initialized = false;
#if BUILDFLAG(USE_STATIC_ANGLE)
// Use ANGLE if it is requested and it is statically linked
if (implementation.gl == kGLImplementationEGLANGLE) {
initialized = InitializeStaticANGLEEGL();
}
#endif // BUILDFLAG(USE_STATIC_ANGLE)
if (!initialized) {
initialized = InitializeStaticNativeEGLInternal();
}
if (!initialized) {
return false;
}
SetGLImplementationParts(implementation);
InitializeStaticGLBindingsGL();
InitializeStaticGLBindingsEGL();
return true;
}
} // namespace
GLDisplay* InitializeGLOneOffPlatform(gl::GpuPreference gpu_preference) {
GLDisplayEGL* display = GetDisplayEGL(gpu_preference);
switch (GetGLImplementation()) {
case kGLImplementationEGLGLES2:
case kGLImplementationEGLANGLE:
if (!InitializeDisplay(display,
EGLDisplayPlatform(EGL_DEFAULT_DISPLAY))) {
LOG(ERROR) << "GLDisplayEGL::Initialize failed.";
return nullptr;
}
break;
default:
break;
}
return display;
}
bool InitializeStaticGLBindings(GLImplementationParts 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.
DCHECK_EQ(kGLImplementationNone, GetGLImplementation());
switch (implementation.gl) {
case kGLImplementationEGLGLES2:
case kGLImplementationEGLANGLE:
return InitializeStaticEGLInternal(implementation);
case kGLImplementationMockGL:
case kGLImplementationStubGL:
SetGLImplementationParts(implementation);
InitializeStaticGLBindingsGL();
return true;
default:
NOTREACHED();
}
}
void ShutdownGLPlatform(GLDisplay* display) {
if (display)
display->Shutdown();
ClearBindingsEGL();
ClearBindingsGL();
}
} // namespace init
} // namespace gl
|