Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(445)

Unified Diff: ui/gl/gl_surface_glx.cc

Issue 2347383002: X11: Use better visuals for OpenGL (Closed)
Patch Set: auto* Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gl/gl_surface_glx.h ('k') | ui/gl/gl_visual_picker_glx.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gl/gl_surface_glx.cc
diff --git a/ui/gl/gl_surface_glx.cc b/ui/gl/gl_surface_glx.cc
index add3a62fc587b0447fb9a2d8ef4e51e0e728d1d9..2ba52fbf61cad8e78e78df3f2213dc68ab2096a2 100644
--- a/ui/gl/gl_surface_glx.cc
+++ b/ui/gl/gl_surface_glx.cc
@@ -29,6 +29,7 @@ extern "C" {
#include "ui/gfx/x/x11_types.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_visual_picker_glx.h"
#include "ui/gl/sync_control_vsync_provider.h"
namespace gl {
@@ -50,6 +51,11 @@ bool g_glx_get_msc_rate_oml_supported = false;
bool g_glx_sgi_video_sync_supported = false;
+// A 24-bit RGB visual and colormap to use when creating offscreen surfaces.
+Visual* g_visual = nullptr;
+int g_depth = CopyFromParent;
+Colormap g_colormap = CopyFromParent;
+
GLXFBConfig GetConfigForWindow(Display* display,
gfx::AcceleratedWidget window) {
DCHECK(window != 0);
@@ -109,9 +115,6 @@ bool CreateDummyWindow(Display* display) {
DCHECK(display);
gfx::AcceleratedWidget parent_window =
RootWindow(display, DefaultScreen(display));
- // We create a window with CopyFromParent visual so that we have the same
- // visual as NativeViewGLSurfaceGLX (i.e. same GLXFBConfig), to ensure
- // contexts are compatible and can be made current with either.
gfx::AcceleratedWidget window =
XCreateWindow(display, parent_window, 0, 0, 1, 1, 0, CopyFromParent,
InputOutput, CopyFromParent, 0, nullptr);
@@ -422,6 +425,13 @@ bool GLSurfaceGLX::InitializeOneOff() {
g_glx_get_msc_rate_oml_supported = g_glx_oml_sync_control_supported;
g_glx_sgi_video_sync_supported = HasGLXExtension("GLX_SGI_video_sync");
+ const XVisualInfo& visual_info =
+ gl::GLVisualPickerGLX::GetInstance()->system_visual();
+ g_visual = visual_info.visual;
+ g_depth = visual_info.depth;
+ g_colormap = XCreateColormap(g_display, DefaultRootWindow(g_display),
+ visual_info.visual, AllocNone);
+
// We create a dummy unmapped window for both the main Display and the video
// sync Display so that the Nvidia driver can initialize itself before the
// sandbox is set up.
@@ -493,7 +503,11 @@ void* GLSurfaceGLX::GetDisplay() {
GLSurfaceGLX::~GLSurfaceGLX() {}
NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX(gfx::AcceleratedWidget window)
- : parent_window_(window), window_(0), glx_window_(0), config_(nullptr) {}
+ : parent_window_(window),
+ window_(0),
+ glx_window_(0),
+ config_(nullptr),
+ visual_id_(CopyFromParent) {}
GLXDrawable NativeViewGLSurfaceGLX::GetDrawableHandle() const {
return glx_window_;
@@ -507,6 +521,7 @@ bool NativeViewGLSurfaceGLX::Initialize(GLSurface::Format format) {
return false;
}
size_ = gfx::Size(attributes.width, attributes.height);
+ visual_id_ = XVisualIDFromVisual(attributes.visual);
// Create a child window, with a CopyFromParent visual (to avoid inducing
// extra blits in the driver), that we can resize exactly in Resize(),
// correctly ordered with GL, so that we don't have invalid transient states.
@@ -601,6 +616,10 @@ void* NativeViewGLSurfaceGLX::GetConfig() {
return config_;
}
+unsigned long NativeViewGLSurfaceGLX::GetCompatibilityKey() {
+ return visual_id_;
+}
+
gfx::SwapResult NativeViewGLSurfaceGLX::PostSubBuffer(int x,
int y,
int width,
@@ -641,15 +660,14 @@ UnmappedNativeViewGLSurfaceGLX::UnmappedNativeViewGLSurfaceGLX(
bool UnmappedNativeViewGLSurfaceGLX::Initialize(GLSurface::Format format) {
DCHECK(!window_);
- gfx::AcceleratedWidget parent_window =
- RootWindow(g_display, DefaultScreen(g_display));
+ gfx::AcceleratedWidget parent_window = DefaultRootWindow(g_display);
- // We create a window with CopyFromParent visual so that we have the same
- // visual as NativeViewGLSurfaceGLX (i.e. same GLXFBConfig), to ensure
- // contexts are compatible and can be made current with either.
+ XSetWindowAttributes attrs;
+ attrs.border_pixel = 0;
+ attrs.colormap = g_colormap;
window_ = XCreateWindow(g_display, parent_window, 0, 0, size_.width(),
- size_.height(), 0, CopyFromParent, InputOutput,
- CopyFromParent, 0, nullptr);
+ size_.height(), 0, g_depth, InputOutput, g_visual,
+ CWBorderPixel | CWColormap, &attrs);
GetConfig();
DCHECK(config_);
glx_window_ = glXCreateWindow(g_display, config_, window_, NULL);
@@ -691,6 +709,10 @@ void* UnmappedNativeViewGLSurfaceGLX::GetConfig() {
return config_;
}
+unsigned long UnmappedNativeViewGLSurfaceGLX::GetCompatibilityKey() {
+ return XVisualIDFromVisual(g_visual);
+}
+
UnmappedNativeViewGLSurfaceGLX::~UnmappedNativeViewGLSurfaceGLX() {
Destroy();
}
« no previous file with comments | « ui/gl/gl_surface_glx.h ('k') | ui/gl/gl_visual_picker_glx.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698