use direct rendering. - Move the LIBGL_ALWAYS_INDIRECT code to CompositingPrefs::detect(), and use the external helper program to determine if the variable needs to be set. svn path=/trunk/KDE/kdebase/workspace/; revision=1096554remotes/origin/Plasma/5.0
parent
646c7909d3
commit
bcd8d3f476
5 changed files with 117 additions and 4 deletions
@ -0,0 +1,10 @@ |
|||||||
|
########### next target ############### |
||||||
|
|
||||||
|
set(kwin_opengl_test_SRCS opengltest.cpp ) |
||||||
|
|
||||||
|
kde4_add_executable(kwin_opengl_test ${kwin_opengl_test_SRCS}) |
||||||
|
|
||||||
|
target_link_libraries(kwin_opengl_test ${X11_LIBRARIES} ${OPENGL_gl_LIBRARY}) |
||||||
|
|
||||||
|
install(TARGETS kwin_opengl_test ${INSTALL_TARGETS_DEFAULT_ARGS} ) |
||||||
|
|
||||||
@ -0,0 +1,89 @@ |
|||||||
|
/********************************************************************
|
||||||
|
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, and the NVidia driver
|
||||||
|
const GLubyte *renderer = glGetString(GL_RENDERER); |
||||||
|
if (strstr((const char *)renderer, "DRI2")) |
||||||
|
return 0; |
||||||
|
|
||||||
|
const GLubyte *vendor = glGetString(GL_VENDOR); |
||||||
|
if (strstr((const char *)vendor, "NVIDIA")) |
||||||
|
return 0; |
||||||
|
|
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
Loading…
Reference in new issue