#ifndef UI_GL_GL_IMPLEMENTATION_H_
#define UI_GL_GL_IMPLEMENTATION_H_
#include <memory>
#include <string>
#include <vector>
#include "base/files/file_path.h"
#include "base/native_library.h"
#include "build/build_config.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/extension_set.h"
#include "ui/gl/buildflags.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_switches.h"
namespace base {
class CommandLine;
}
namespace gl {
class GLApi;
enum GLImplementation {
kGLImplementationNone = 0,
kGLImplementationEGLGLES2 = 5,
kGLImplementationMockGL = 6,
kGLImplementationStubGL = 7,
kGLImplementationDisabled = 8,
kGLImplementationEGLANGLE = 9,
kMaxValue = kGLImplementationEGLANGLE,
};
enum class ANGLEImplementation {
kNone = 0,
kD3D9 = 1,
kD3D11 = 2,
kOpenGL = 3,
kOpenGLES = 4,
kNull = 5,
kVulkan = 6,
kSwiftShader = 7,
kMetal = 8,
kDefault = 9,
kMaxValue = kDefault,
};
struct GL_EXPORT GLImplementationParts {
constexpr explicit GLImplementationParts(const ANGLEImplementation angle_impl)
: gl(kGLImplementationEGLANGLE),
angle(MakeANGLEImplementation(kGLImplementationEGLANGLE, angle_impl)) {}
constexpr explicit GLImplementationParts(const GLImplementation gl_impl)
: gl(gl_impl),
angle(MakeANGLEImplementation(gl_impl, ANGLEImplementation::kDefault)) {
}
GLImplementation gl = kGLImplementationNone;
ANGLEImplementation angle = ANGLEImplementation::kNone;
constexpr bool operator==(const GLImplementationParts& other) const {
return (gl == other.gl && angle == other.angle);
}
constexpr bool operator==(const ANGLEImplementation angle_impl) const {
return operator==(GLImplementationParts(angle_impl));
}
constexpr bool operator==(const GLImplementation gl_impl) const {
return operator==(GLImplementationParts(gl_impl));
}
bool IsValid() const;
bool IsAllowed(const std::vector<GLImplementationParts>& allowed_impls) const;
std::string ToString() const;
std::string GLString() const;
std::string ANGLEString() const;
private:
static constexpr ANGLEImplementation MakeANGLEImplementation(
const GLImplementation gl_impl,
const ANGLEImplementation angle_impl) {
if (gl_impl == kGLImplementationEGLANGLE) {
if (angle_impl == ANGLEImplementation::kNone) {
return ANGLEImplementation::kDefault;
} else {
return angle_impl;
}
} else {
return ANGLEImplementation::kNone;
}
}
};
struct GL_EXPORT GLWindowSystemBindingInfo {
GLWindowSystemBindingInfo();
~GLWindowSystemBindingInfo();
std::string vendor;
std::string version;
std::string extensions;
std::string direct_rendering_version;
};
using GLFunctionPointerType = void (*)();
#if BUILDFLAG(IS_WIN)
typedef GLFunctionPointerType(WINAPI* GLGetProcAddressProc)(const char* name);
#else
typedef GLFunctionPointerType (*GLGetProcAddressProc)(const char* name);
#endif
GL_EXPORT void SetNullDrawGLBindings(bool enabled);
GL_EXPORT bool HasInitializedNullDrawGLBindings();
GL_EXPORT std::string FilterGLExtensionList(
const char* extension_list,
const std::vector<std::string>& disabled_extensions);
class GL_EXPORT DisableNullDrawGLBindings {
public:
DisableNullDrawGLBindings();
~DisableNullDrawGLBindings();
private:
bool initial_enabled_;
};
GL_EXPORT void SetGLImplementationParts(
const GLImplementationParts& implementation);
GL_EXPORT const GLImplementationParts& GetGLImplementationParts();
GL_EXPORT void SetGLImplementation(GLImplementation implementation);
GL_EXPORT GLImplementation GetGLImplementation();
GL_EXPORT void SetANGLEImplementation(ANGLEImplementation implementation);
GL_EXPORT ANGLEImplementation GetANGLEImplementation();
GL_EXPORT GLImplementationParts GetSoftwareGLImplementation();
GL_EXPORT void SetSoftwareGLCommandLineSwitches(
base::CommandLine* command_line);
GL_EXPORT void SetSoftwareWebGLCommandLineSwitches(
base::CommandLine* command_line);
GL_EXPORT absl::optional<GLImplementationParts>
GetRequestedGLImplementationFromCommandLine(
const base::CommandLine* command_line,
bool* fallback_to_software_gl);
GL_EXPORT bool IsSoftwareGLImplementation(GLImplementationParts implementation);
GL_EXPORT GLImplementationParts
GetNamedGLImplementation(const std::string& gl_name,
const std::string& angle_name);
GL_EXPORT const char* GetGLImplementationGLName(
GLImplementationParts implementation);
GL_EXPORT const char* GetGLImplementationANGLEName(
GLImplementationParts implementation);
GL_EXPORT void AddGLNativeLibrary(base::NativeLibrary library);
GL_EXPORT void UnloadGLNativeLibraries(bool due_to_fallback);
GL_EXPORT void SetGLGetProcAddressProc(GLGetProcAddressProc proc);
GL_EXPORT GLFunctionPointerType GetGLProcAddress(const char* name);
GL_EXPORT std::string GetGLExtensionsFromCurrentContext();
GL_EXPORT std::string GetGLExtensionsFromCurrentContext(GLApi* api);
GL_EXPORT gfx::ExtensionSet GetRequestableGLExtensionsFromCurrentContext();
GL_EXPORT gfx::ExtensionSet GetRequestableGLExtensionsFromCurrentContext(
GLApi* api);
GL_EXPORT bool WillUseGLGetStringForExtensions();
GL_EXPORT bool WillUseGLGetStringForExtensions(GLApi* api);
GL_EXPORT base::NativeLibrary LoadLibraryAndPrintError(
const base::FilePath::CharType* filename);
GL_EXPORT base::NativeLibrary LoadLibraryAndPrintError(
const base::FilePath& filename);
#if BUILDFLAG(USE_OPENGL_APITRACE)
GL_EXPORT void TerminateFrame();
#endif
}
#endif