gl_glx_api_implementation.cc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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_glx_api_implementation.h"
  5. #include "base/strings/string_number_conversions.h"
  6. #include "base/strings/string_split.h"
  7. #include "base/strings/string_util.h"
  8. #include "ui/gfx/x/connection.h"
  9. #include "ui/gfx/x/future.h"
  10. #include "ui/gl/gl_context.h"
  11. #include "ui/gl/gl_implementation.h"
  12. #include "ui/gl/gl_implementation_wrapper.h"
  13. #include "ui/gl/gl_surface_glx.h"
  14. #include "ui/gl/gl_version_info.h"
  15. namespace gl {
  16. GL_IMPL_WRAPPER_TYPE(GLX) * g_glx_wrapper = nullptr;
  17. void InitializeStaticGLBindingsGLX() {
  18. g_driver_glx.InitializeStaticBindings();
  19. if (!g_glx_wrapper) {
  20. auto real_api = std::make_unique<RealGLXApi>();
  21. real_api->Initialize(&g_driver_glx);
  22. g_glx_wrapper = new GL_IMPL_WRAPPER_TYPE(GLX)(std::move(real_api));
  23. }
  24. g_current_glx_context = g_glx_wrapper->api();
  25. }
  26. void ClearBindingsGLX() {
  27. delete g_glx_wrapper;
  28. g_glx_wrapper = nullptr;
  29. g_current_glx_context = nullptr;
  30. g_driver_glx.ClearBindings();
  31. }
  32. GLXApi::GLXApi() = default;
  33. GLXApi::~GLXApi() = default;
  34. GLXApiBase::GLXApiBase() : driver_(nullptr) {}
  35. GLXApiBase::~GLXApiBase() = default;
  36. void GLXApiBase::InitializeBase(DriverGLX* driver) {
  37. driver_ = driver;
  38. }
  39. RealGLXApi::RealGLXApi() = default;
  40. RealGLXApi::~RealGLXApi() = default;
  41. void RealGLXApi::Initialize(DriverGLX* driver) {
  42. InitializeBase(driver);
  43. }
  44. void RealGLXApi::SetDisabledExtensions(const std::string& disabled_extensions) {
  45. disabled_exts_.clear();
  46. filtered_exts_ = "";
  47. if (!disabled_extensions.empty()) {
  48. disabled_exts_ =
  49. base::SplitString(disabled_extensions, ", ;", base::KEEP_WHITESPACE,
  50. base::SPLIT_WANT_NONEMPTY);
  51. }
  52. }
  53. const char* RealGLXApi::glXQueryExtensionsStringFn(Display* dpy, int screen) {
  54. if (filtered_exts_.size())
  55. return filtered_exts_.c_str();
  56. if (!driver_->fn.glXQueryExtensionsStringFn)
  57. return nullptr;
  58. const char* str = GLXApiBase::glXQueryExtensionsStringFn(dpy, screen);
  59. if (!str)
  60. return nullptr;
  61. filtered_exts_ = FilterGLExtensionList(str, disabled_exts_);
  62. return filtered_exts_.c_str();
  63. }
  64. LogGLXApi::LogGLXApi(GLXApi* glx_api) : glx_api_(glx_api) {}
  65. LogGLXApi::~LogGLXApi() = default;
  66. void LogGLXApi::SetDisabledExtensions(const std::string& disabled_extensions) {
  67. if (glx_api_) {
  68. glx_api_->SetDisabledExtensions(disabled_extensions);
  69. }
  70. }
  71. TraceGLXApi::~TraceGLXApi() = default;
  72. void TraceGLXApi::SetDisabledExtensions(
  73. const std::string& disabled_extensions) {
  74. if (glx_api_) {
  75. glx_api_->SetDisabledExtensions(disabled_extensions);
  76. }
  77. }
  78. bool GetGLWindowSystemBindingInfoGLX(const GLVersionInfo& gl_info,
  79. GLWindowSystemBindingInfo* info) {
  80. auto* connection = x11::Connection::Get();
  81. auto* display = connection->GetXlibDisplay().display();
  82. const int screen = connection->DefaultScreenId();
  83. const char* vendor = glXQueryServerString(display, screen, GLX_VENDOR);
  84. const char* version = glXQueryServerString(display, screen, GLX_VERSION);
  85. const char* extensions = glXQueryExtensionsString(display, screen);
  86. *info = GLWindowSystemBindingInfo();
  87. if (vendor)
  88. info->vendor = vendor;
  89. if (version)
  90. info->version = version;
  91. if (extensions)
  92. info->extensions = extensions;
  93. if (glXIsDirect(display, glXGetCurrentContext())) {
  94. info->direct_rendering_version = "2";
  95. bool using_mesa = gl_info.driver_vendor.find("Mesa") != std::string::npos ||
  96. gl_info.driver_version.find("Mesa") != std::string::npos;
  97. if (using_mesa) {
  98. std::vector<std::string> split_version =
  99. base::SplitString(gl_info.driver_version, ".", base::TRIM_WHITESPACE,
  100. base::SPLIT_WANT_ALL);
  101. unsigned major_num = 0;
  102. base::StringToUint(split_version[0], &major_num);
  103. // Mesa after version 17 will reliably use DRI3 when available.
  104. if (major_num >= 17 && connection->QueryExtension("DRI3").Sync())
  105. info->direct_rendering_version = "2.3";
  106. else if (connection->QueryExtension("DRI2").Sync())
  107. info->direct_rendering_version = "2.2";
  108. else if (connection->QueryExtension("DRI").Sync())
  109. info->direct_rendering_version = "2.1";
  110. }
  111. } else {
  112. info->direct_rendering_version = "1";
  113. }
  114. return true;
  115. }
  116. void SetDisabledExtensionsGLX(const std::string& disabled_extensions) {
  117. DCHECK(g_current_glx_context);
  118. DCHECK(GLContext::TotalGLContexts() == 0);
  119. g_current_glx_context->SetDisabledExtensions(disabled_extensions);
  120. }
  121. bool InitializeExtensionSettingsOneOffGLX() {
  122. return GLSurfaceGLX::InitializeExtensionSettingsOneOff();
  123. }
  124. } // namespace gl