blob: d7903a2654dfd47bad597cc21cc23fbf7b9e4664 [file] [log] [blame]
// 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_glx_api_implementation.h"
#include "base/command_line.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_surface_glx.h"
namespace gl {
RealGLXApi* g_real_glx;
DebugGLXApi* g_debug_glx;
void InitializeStaticGLBindingsGLX() {
g_driver_glx.InitializeStaticBindings();
if (!g_real_glx) {
g_real_glx = new RealGLXApi();
}
g_real_glx->Initialize(&g_driver_glx);
g_current_glx_context = g_real_glx;
}
void InitializeDebugGLBindingsGLX() {
if (!g_debug_glx) {
g_debug_glx = new DebugGLXApi(g_real_glx);
}
g_current_glx_context = g_debug_glx;
}
void ClearBindingsGLX() {
if (g_debug_glx) {
delete g_debug_glx;
g_debug_glx = NULL;
}
if (g_real_glx) {
delete g_real_glx;
g_real_glx = NULL;
}
g_current_glx_context = NULL;
g_driver_glx.ClearBindings();
}
GLXApi::GLXApi() {
}
GLXApi::~GLXApi() {
}
GLXApiBase::GLXApiBase()
: driver_(NULL) {
}
GLXApiBase::~GLXApiBase() {
}
void GLXApiBase::InitializeBase(DriverGLX* driver) {
driver_ = driver;
}
RealGLXApi::RealGLXApi() {
}
RealGLXApi::~RealGLXApi() {
}
void RealGLXApi::Initialize(DriverGLX* driver) {
InitializeBase(driver);
}
void RealGLXApi::SetDisabledExtensions(const std::string& disabled_extensions) {
disabled_exts_.clear();
filtered_exts_ = "";
if (!disabled_extensions.empty()) {
disabled_exts_ =
base::SplitString(disabled_extensions, ", ;",
base::KEEP_WHITESPACE,
base::SPLIT_WANT_NONEMPTY);
}
}
const char* RealGLXApi::glXQueryExtensionsStringFn(Display* dpy,
int screen) {
if (filtered_exts_.size())
return filtered_exts_.c_str();
if (!driver_->fn.glXQueryExtensionsStringFn)
return NULL;
const char* str = GLXApiBase::glXQueryExtensionsStringFn(dpy, screen);
if (!str)
return NULL;
filtered_exts_ = FilterGLExtensionList(str, disabled_exts_);
return filtered_exts_.c_str();
}
DebugGLXApi::DebugGLXApi(GLXApi* glx_api) : glx_api_(glx_api) {}
DebugGLXApi::~DebugGLXApi() {}
void DebugGLXApi::SetDisabledExtensions(
const std::string& disabled_extensions) {
if (glx_api_) {
glx_api_->SetDisabledExtensions(disabled_extensions);
}
}
TraceGLXApi::~TraceGLXApi() {
}
void TraceGLXApi::SetDisabledExtensions(
const std::string& disabled_extensions) {
if (glx_api_) {
glx_api_->SetDisabledExtensions(disabled_extensions);
}
}
bool GetGLWindowSystemBindingInfoGLX(GLWindowSystemBindingInfo* info) {
Display* display = glXGetCurrentDisplay();
const int kDefaultScreen = 0;
const char* vendor =
glXQueryServerString(display, kDefaultScreen, GLX_VENDOR);
const char* version =
glXQueryServerString(display, kDefaultScreen, GLX_VERSION);
const char* extensions =
glXQueryServerString(display, kDefaultScreen, GLX_EXTENSIONS);
*info = GLWindowSystemBindingInfo();
if (vendor)
info->vendor = vendor;
if (version)
info->version = version;
if (extensions)
info->extensions = extensions;
info->direct_rendering = !!glXIsDirect(display, glXGetCurrentContext());
return true;
}
void SetDisabledExtensionsGLX(const std::string& disabled_extensions) {
DCHECK(g_current_glx_context);
DCHECK(GLContext::TotalGLContexts() == 0);
g_current_glx_context->SetDisabledExtensions(disabled_extensions);
}
bool InitializeExtensionSettingsOneOffGLX() {
return GLSurfaceGLX::InitializeExtensionSettingsOneOff();
}
} // namespace gl