123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- // Copyright (c) 2012 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 "ui/gl/gl_egl_api_implementation.h"
- #include "base/strings/string_split.h"
- #include "base/strings/string_util.h"
- #include "ui/gl/gl_context.h"
- #include "ui/gl/gl_implementation.h"
- #include "ui/gl/gl_implementation_wrapper.h"
- #include "ui/gl/gl_surface_egl.h"
- namespace gl {
- GL_IMPL_WRAPPER_TYPE(EGL) * g_egl_wrapper = nullptr;
- void InitializeStaticGLBindingsEGL() {
- g_driver_egl.InitializeStaticBindings();
- if (!g_egl_wrapper) {
- auto real_api = std::make_unique<RealEGLApi>();
- real_api->Initialize(&g_driver_egl);
- g_egl_wrapper = new GL_IMPL_WRAPPER_TYPE(EGL)(std::move(real_api));
- }
- g_current_egl_context = g_egl_wrapper->api();
- g_driver_egl.client_ext.InitializeClientExtensionSettings();
- }
- void ClearBindingsEGL() {
- delete g_egl_wrapper;
- g_egl_wrapper = nullptr;
- g_current_egl_context = nullptr;
- g_driver_egl.ClearBindings();
- }
- EGLApi::EGLApi() {
- }
- EGLApi::~EGLApi() {
- }
- EGLApiBase::EGLApiBase() : driver_(nullptr) {}
- EGLApiBase::~EGLApiBase() {
- }
- void EGLApiBase::InitializeBase(DriverEGL* driver) {
- driver_ = driver;
- }
- RealEGLApi::RealEGLApi() {
- }
- RealEGLApi::~RealEGLApi() {
- }
- void RealEGLApi::Initialize(DriverEGL* driver) {
- InitializeBase(driver);
- }
- void RealEGLApi::SetDisabledExtensions(const std::string& disabled_extensions) {
- DCHECK(GLContext::TotalGLContexts() == 0);
- disabled_exts_.clear();
- filtered_exts_.clear();
- if (!disabled_extensions.empty()) {
- std::vector<std::string> candidates =
- base::SplitString(disabled_extensions, ", ;", base::KEEP_WHITESPACE,
- base::SPLIT_WANT_NONEMPTY);
- for (const auto& ext : candidates) {
- if (!base::StartsWith(ext, "EGL_", base::CompareCase::SENSITIVE))
- continue;
- // For the moment, only the following two extensions can be disabled.
- // See DriverEGL::UpdateConditionalExtensionBindings().
- DCHECK(ext == "EGL_KHR_fence_sync" || ext == "EGL_KHR_wait_sync");
- disabled_exts_.push_back(ext);
- }
- }
- }
- const char* RealEGLApi::eglQueryStringFn(EGLDisplay dpy, EGLint name) {
- if (name == EGL_EXTENSIONS) {
- auto it = filtered_exts_.find(dpy);
- if (it == filtered_exts_.end()) {
- it = filtered_exts_
- .emplace(dpy, FilterGLExtensionList(
- EGLApiBase::eglQueryStringFn(dpy, name),
- disabled_exts_))
- .first;
- }
- return (*it).second.c_str();
- }
- return EGLApiBase::eglQueryStringFn(dpy, name);
- }
- LogEGLApi::LogEGLApi(EGLApi* egl_api) : egl_api_(egl_api) {}
- LogEGLApi::~LogEGLApi() {}
- void LogEGLApi::SetDisabledExtensions(const std::string& disabled_extensions) {
- if (egl_api_) {
- egl_api_->SetDisabledExtensions(disabled_extensions);
- }
- }
- TraceEGLApi::~TraceEGLApi() {
- }
- void TraceEGLApi::SetDisabledExtensions(
- const std::string& disabled_extensions) {
- if (egl_api_) {
- egl_api_->SetDisabledExtensions(disabled_extensions);
- }
- }
- bool GetGLWindowSystemBindingInfoEGL(GLWindowSystemBindingInfo* info) {
- EGLDisplay display = eglGetCurrentDisplay();
- const char* vendor = eglQueryString(display, EGL_VENDOR);
- const char* version = eglQueryString(display, EGL_VERSION);
- const char* extensions = eglQueryString(display, EGL_EXTENSIONS);
- *info = GLWindowSystemBindingInfo();
- if (vendor)
- info->vendor = vendor;
- if (version)
- info->version = version;
- if (extensions)
- info->extensions = extensions;
- return true;
- }
- void SetDisabledExtensionsEGL(const std::string& disabled_extensions) {
- DCHECK(g_current_egl_context);
- DCHECK(GLContext::TotalGLContexts() == 0);
- g_current_egl_context->SetDisabledExtensions(disabled_extensions);
- }
- bool InitializeExtensionSettingsOneOffEGL(GLDisplayEGL* display) {
- return display->InitializeExtensionSettings();
- }
- } // namespace gl
|