gl_egl_api_implementation.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright (c) 2012 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.
  4. #include "ui/gl/gl_egl_api_implementation.h"
  5. #include "base/strings/string_split.h"
  6. #include "base/strings/string_util.h"
  7. #include "ui/gl/gl_context.h"
  8. #include "ui/gl/gl_implementation.h"
  9. #include "ui/gl/gl_implementation_wrapper.h"
  10. #include "ui/gl/gl_surface_egl.h"
  11. namespace gl {
  12. GL_IMPL_WRAPPER_TYPE(EGL) * g_egl_wrapper = nullptr;
  13. void InitializeStaticGLBindingsEGL() {
  14. g_driver_egl.InitializeStaticBindings();
  15. if (!g_egl_wrapper) {
  16. auto real_api = std::make_unique<RealEGLApi>();
  17. real_api->Initialize(&g_driver_egl);
  18. g_egl_wrapper = new GL_IMPL_WRAPPER_TYPE(EGL)(std::move(real_api));
  19. }
  20. g_current_egl_context = g_egl_wrapper->api();
  21. g_driver_egl.client_ext.InitializeClientExtensionSettings();
  22. }
  23. void ClearBindingsEGL() {
  24. delete g_egl_wrapper;
  25. g_egl_wrapper = nullptr;
  26. g_current_egl_context = nullptr;
  27. g_driver_egl.ClearBindings();
  28. }
  29. EGLApi::EGLApi() {
  30. }
  31. EGLApi::~EGLApi() {
  32. }
  33. EGLApiBase::EGLApiBase() : driver_(nullptr) {}
  34. EGLApiBase::~EGLApiBase() {
  35. }
  36. void EGLApiBase::InitializeBase(DriverEGL* driver) {
  37. driver_ = driver;
  38. }
  39. RealEGLApi::RealEGLApi() {
  40. }
  41. RealEGLApi::~RealEGLApi() {
  42. }
  43. void RealEGLApi::Initialize(DriverEGL* driver) {
  44. InitializeBase(driver);
  45. }
  46. void RealEGLApi::SetDisabledExtensions(const std::string& disabled_extensions) {
  47. DCHECK(GLContext::TotalGLContexts() == 0);
  48. disabled_exts_.clear();
  49. filtered_exts_.clear();
  50. if (!disabled_extensions.empty()) {
  51. std::vector<std::string> candidates =
  52. base::SplitString(disabled_extensions, ", ;", base::KEEP_WHITESPACE,
  53. base::SPLIT_WANT_NONEMPTY);
  54. for (const auto& ext : candidates) {
  55. if (!base::StartsWith(ext, "EGL_", base::CompareCase::SENSITIVE))
  56. continue;
  57. // For the moment, only the following two extensions can be disabled.
  58. // See DriverEGL::UpdateConditionalExtensionBindings().
  59. DCHECK(ext == "EGL_KHR_fence_sync" || ext == "EGL_KHR_wait_sync");
  60. disabled_exts_.push_back(ext);
  61. }
  62. }
  63. }
  64. const char* RealEGLApi::eglQueryStringFn(EGLDisplay dpy, EGLint name) {
  65. if (name == EGL_EXTENSIONS) {
  66. auto it = filtered_exts_.find(dpy);
  67. if (it == filtered_exts_.end()) {
  68. it = filtered_exts_
  69. .emplace(dpy, FilterGLExtensionList(
  70. EGLApiBase::eglQueryStringFn(dpy, name),
  71. disabled_exts_))
  72. .first;
  73. }
  74. return (*it).second.c_str();
  75. }
  76. return EGLApiBase::eglQueryStringFn(dpy, name);
  77. }
  78. LogEGLApi::LogEGLApi(EGLApi* egl_api) : egl_api_(egl_api) {}
  79. LogEGLApi::~LogEGLApi() {}
  80. void LogEGLApi::SetDisabledExtensions(const std::string& disabled_extensions) {
  81. if (egl_api_) {
  82. egl_api_->SetDisabledExtensions(disabled_extensions);
  83. }
  84. }
  85. TraceEGLApi::~TraceEGLApi() {
  86. }
  87. void TraceEGLApi::SetDisabledExtensions(
  88. const std::string& disabled_extensions) {
  89. if (egl_api_) {
  90. egl_api_->SetDisabledExtensions(disabled_extensions);
  91. }
  92. }
  93. bool GetGLWindowSystemBindingInfoEGL(GLWindowSystemBindingInfo* info) {
  94. EGLDisplay display = eglGetCurrentDisplay();
  95. const char* vendor = eglQueryString(display, EGL_VENDOR);
  96. const char* version = eglQueryString(display, EGL_VERSION);
  97. const char* extensions = eglQueryString(display, EGL_EXTENSIONS);
  98. *info = GLWindowSystemBindingInfo();
  99. if (vendor)
  100. info->vendor = vendor;
  101. if (version)
  102. info->version = version;
  103. if (extensions)
  104. info->extensions = extensions;
  105. return true;
  106. }
  107. void SetDisabledExtensionsEGL(const std::string& disabled_extensions) {
  108. DCHECK(g_current_egl_context);
  109. DCHECK(GLContext::TotalGLContexts() == 0);
  110. g_current_egl_context->SetDisabledExtensions(disabled_extensions);
  111. }
  112. bool InitializeExtensionSettingsOneOffEGL(GLDisplayEGL* display) {
  113. return display->InitializeExtensionSettings();
  114. }
  115. } // namespace gl