kwin/opengltest/opengltest.cpp
Fredrik Höglund 07a26a2569 Allow direct rendering with drivers that have "GEM" or "Gallium" in their
GL_RENDERER strings.

Possible fix for bug 239890.
CCBUG: 239890

svn path=/trunk/KDE/kdebase/workspace/; revision=1131729
2010-05-28 20:41:58 +00:00

97 lines
3.1 KiB
C++

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2010 Fredrik Höglund <fredrik@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include <X11/Xlib.h>
#include <GL/glx.h>
#include <string.h>
#include <stdio.h>
// Return 0 if we can use a direct context, 1 otherwise
int main(int argc, char *argv[])
{
Display *dpy = XOpenDisplay(0);
int error_base, event_base;
if (!glXQueryExtension(dpy, &error_base, &event_base))
return 1;
int major, minor;
if (!glXQueryVersion(dpy, &major, &minor))
return 1;
// glXCreatePixmap() is a GLX 1.3+ function.
// It is also provided by EXT_texture_from_pixmap, but only for indirect contexts.
if (major == 1 && minor < 3)
return 1;
int attribs[] = {
GLX_RGBA,
GLX_RED_SIZE, 1,
GLX_GREEN_SIZE, 1,
GLX_BLUE_SIZE, 1,
None,
None
};
// Try to find an RGBA visual
XVisualInfo *xvi = glXChooseVisual(dpy, DefaultScreen(dpy), attribs);
if (!xvi) {
// Try again for a doubled buffered visual
attribs[sizeof(attribs) / sizeof(int) - 2] = GLX_DOUBLEBUFFER;
xvi = glXChooseVisual(dpy, DefaultScreen(dpy), attribs);
}
if (!xvi)
return 1;
GLXContext ctx = glXCreateContext(dpy, xvi, NULL, True);
// Create a window using the visual.
// We only need it to make the context current
XSetWindowAttributes attr;
attr.background_pixel = 0;
attr.border_pixel = 0;
attr.colormap = XCreateColormap(dpy, DefaultRootWindow(dpy), xvi->visual, AllocNone);
Window win = XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, 1, 1, 0,
xvi->depth, InputOutput, xvi->visual,
CWBackPixel | CWBorderPixel | CWColormap, &attr);
glXMakeCurrent(dpy, win, ctx);
// Assume that glXCreatePixmap() works with DRI2 drivers
const GLubyte *renderer = glGetString(GL_RENDERER);
if (strstr((const char *)renderer, "DRI2"))
return 0;
// The Intel driver doesn't have DRI2 in the renderer string
if (strstr((const char *)renderer, "GEM"))
return 0;
if (strstr((const char *)renderer, "Gallium"))
return 0;
// Direct contexts also work with the NVidia driver
const GLubyte *vendor = glGetString(GL_VENDOR);
if (strstr((const char *)vendor, "NVIDIA"))
return 0;
return 1;
}