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..191da0804469399e1baf580e1f72e4be2b876b42 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. |
@@ -507,6 +517,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. |
@@ -641,15 +652,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); |