Chromium Code Reviews| Index: app/gfx/gl/gl_context_linux.cc |
| =================================================================== |
| --- app/gfx/gl/gl_context_linux.cc (revision 69765) |
| +++ app/gfx/gl/gl_context_linux.cc (working copy) |
| @@ -6,6 +6,10 @@ |
| #include "app/gfx/gl/gl_context.h" |
| +extern "C" { |
| +#include <X11/Xlib.h> |
| +} |
| + |
| #include <GL/osmesa.h> |
| #include "app/gfx/gl/gl_bindings.h" |
| @@ -18,6 +22,23 @@ |
| #include "base/logging.h" |
| #include "base/scoped_ptr.h" |
| +namespace { |
| + |
| +Display* GetXDisplayHelper() { |
| + static Display* display = NULL; |
|
greggman
2010/12/21 22:47:01
I'll assume this works with multiple display, as i
Ken Russell (switch to Gerrit)
2010/12/21 22:49:59
Not sure. It'll work as well as x11_util::GetXDisp
|
| + |
| + if (!display) { |
| + if (x11_util::XDisplayExists()) { |
| + display = x11_util::GetXDisplay(); |
| + } else { |
| + display = XOpenDisplay(NULL); |
| + } |
| + } |
| + return display; |
| +} |
| + |
| +} |
| + |
| namespace gfx { |
| typedef GLXContext GLContextHandle; |
| @@ -183,7 +204,7 @@ |
| case kGLImplementationDesktopGL: { |
| // Only check the GLX version if we are in fact using GLX. We might |
| // actually be using the mock GL implementation. |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| int major, minor; |
| if (!glXQueryVersion(display, &major, &minor)) { |
| LOG(ERROR) << "glxQueryVersion failed"; |
| @@ -211,7 +232,7 @@ |
| } |
| std::string BaseLinuxGLContext::GetExtensions() { |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| const char* extensions = glXQueryExtensionsString(display, 0); |
| if (extensions) { |
| return GLContext::GetExtensions() + " " + extensions; |
| @@ -225,7 +246,7 @@ |
| LOG(WARNING) << "Multisampling not implemented."; |
| } |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| XWindowAttributes attributes; |
| XGetWindowAttributes(display, window_, &attributes); |
| XVisualInfo visual_info_template; |
| @@ -264,7 +285,7 @@ |
| } |
| void ViewGLContext::Destroy() { |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| bool result = glXMakeCurrent(display, 0, 0); |
| // glXMakeCurrent isn't supposed to fail when unsetting the context, unless |
| @@ -282,7 +303,7 @@ |
| return true; |
| } |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| if (glXMakeCurrent(display, window_, context_) != True) { |
| glXDestroyContext(display, context_); |
| context_ = 0; |
| @@ -303,14 +324,14 @@ |
| } |
| bool ViewGLContext::SwapBuffers() { |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| glXSwapBuffers(display, window_); |
| return true; |
| } |
| gfx::Size ViewGLContext::GetSize() { |
| XWindowAttributes attributes; |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| XGetWindowAttributes(display, window_, &attributes); |
| return gfx::Size(attributes.width, attributes.height); |
| } |
| @@ -322,7 +343,7 @@ |
| void ViewGLContext::SetSwapInterval(int interval) { |
| DCHECK(IsCurrent()); |
| if (HasExtension("GLX_EXT_swap_control") && glXSwapIntervalEXT) { |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| glXSwapIntervalEXT(display, window_, interval); |
| } |
| } |
| @@ -334,7 +355,7 @@ |
| return false; |
| } |
| - window_graphics_context_ = XCreateGC(x11_util::GetXDisplay(), |
| + window_graphics_context_ = XCreateGC(GetXDisplayHelper(), |
| window_, |
| 0, |
| NULL); |
| @@ -352,7 +373,7 @@ |
| void OSMesaViewGLContext::Destroy() { |
| osmesa_context_.Destroy(); |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| if (pixmap_graphics_context_) { |
| XFreeGC(display, pixmap_graphics_context_); |
| @@ -396,7 +417,7 @@ |
| gfx::Size size = osmesa_context_.GetSize(); |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| // Copy the frame into the pixmap. |
| XWindowAttributes attributes; |
| @@ -439,7 +460,7 @@ |
| bool OSMesaViewGLContext::UpdateSize() { |
| // Get the window size. |
| XWindowAttributes attributes; |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| XGetWindowAttributes(display, window_, &attributes); |
| gfx::Size window_size = gfx::Size(std::max(1, attributes.width), |
| std::max(1, attributes.height)); |
| @@ -529,7 +550,7 @@ |
| 0 |
| }; |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| int nelements = 0; |
| // TODO(kbr): figure out whether hardcoding screen to 0 is sufficient. |
| @@ -588,7 +609,7 @@ |
| } |
| void PbufferGLContext::Destroy() { |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| bool result = glXMakeCurrent(display, 0, 0); |
| // glXMakeCurrent isn't supposed to fail when unsetting the context, unless |
| // we have pending draws on an invalid window - which shouldn't be the case |
| @@ -609,7 +630,7 @@ |
| if (IsCurrent()) { |
| return true; |
| } |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| if (glXMakeCurrent(display, pbuffer_, context_) != True) { |
| glXDestroyContext(display, context_); |
| context_ = NULL; |
| @@ -656,7 +677,7 @@ |
| 0 |
| }; |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| int screen = DefaultScreen(display); |
| scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> visual_info( |
| @@ -706,7 +727,7 @@ |
| } |
| void PixmapGLContext::Destroy() { |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| bool result = glXMakeCurrent(display, 0, 0); |
| // glXMakeCurrent isn't supposed to fail when unsetting the context, unless |
| // we have pending draws on an invalid window - which shouldn't be the case |
| @@ -732,7 +753,7 @@ |
| if (IsCurrent()) { |
| return true; |
| } |
| - Display* display = x11_util::GetXDisplay(); |
| + Display* display = GetXDisplayHelper(); |
| if (glXMakeCurrent(display, glx_pixmap_, context_) != True) { |
| glXDestroyContext(display, context_); |
| context_ = NULL; |