From 6758f73bb7f85898b2f2a24149bdacf898601e25 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 9 Jul 2020 15:48:19 +0200 Subject: Move glxconvenience into QtGui MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OpenGL is not quite as dead as initially assumed. Task-number: QTBUG-83255 Change-Id: I953040149812a5258caad5fe6bac0835e1982dd0 Reviewed-by: Qt CI Bot Reviewed-by: Tor Arne Vestbø --- src/opengl/.prev_CMakeLists.txt | 7 - src/opengl/CMakeLists.txt | 7 - src/opengl/opengl.pro | 2 - src/opengl/platform/platform.pri | 2 - src/opengl/platform/unix/qglxconvenience.cpp | 466 --------------------------- src/opengl/platform/unix/qglxconvenience_p.h | 93 ------ src/opengl/platform/unix/unix.pri | 9 - 7 files changed, 586 deletions(-) delete mode 100644 src/opengl/platform/platform.pri delete mode 100644 src/opengl/platform/unix/qglxconvenience.cpp delete mode 100644 src/opengl/platform/unix/qglxconvenience_p.h delete mode 100644 src/opengl/platform/unix/unix.pri (limited to 'src/opengl') diff --git a/src/opengl/.prev_CMakeLists.txt b/src/opengl/.prev_CMakeLists.txt index a477bf2f6b..1d8544ab8e 100644 --- a/src/opengl/.prev_CMakeLists.txt +++ b/src/opengl/.prev_CMakeLists.txt @@ -99,13 +99,6 @@ qt_extend_target(OpenGL CONDITION QT_FEATURE_egl qopenglcompositorbackingstore.cpp qopenglcompositorbackingstore_p.h ) -qt_extend_target(OpenGL CONDITION QT_FEATURE_opengl AND QT_FEATURE_xlib AND NOT QT_FEATURE_opengles2 - SOURCES - platform/unix/qglxconvenience.cpp platform/unix/qglxconvenience_p.h - PUBLIC_LIBRARIES - X11::X11 -) - qt_create_tracepoints(OpenGL qtopengl.tracepoints) qt_add_docs(OpenGL diff --git a/src/opengl/CMakeLists.txt b/src/opengl/CMakeLists.txt index 5fc9adb103..781301dc0f 100644 --- a/src/opengl/CMakeLists.txt +++ b/src/opengl/CMakeLists.txt @@ -99,13 +99,6 @@ qt_extend_target(OpenGL CONDITION QT_FEATURE_egl qopenglcompositorbackingstore.cpp qopenglcompositorbackingstore_p.h ) -qt_extend_target(OpenGL CONDITION QT_FEATURE_opengl AND QT_FEATURE_xlib AND NOT QT_FEATURE_opengles2 - SOURCES - platform/unix/qglxconvenience.cpp platform/unix/qglxconvenience_p.h - PUBLIC_LIBRARIES - X11::X11 -) - qt_create_tracepoints(OpenGL qtopengl.tracepoints) qt_add_docs(OpenGL doc/qtopengl.qdocconf diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro index 97871c3757..0dd3d33552 100644 --- a/src/opengl/opengl.pro +++ b/src/opengl/opengl.pro @@ -151,8 +151,6 @@ qtConfig(egl) { qopenglcompositor_p.h } -include(platform/platform.pri) - load(qt_module) TRACEPOINT_PROVIDER = $$PWD/qtopengl.tracepoints diff --git a/src/opengl/platform/platform.pri b/src/opengl/platform/platform.pri deleted file mode 100644 index 4255f09a4e..0000000000 --- a/src/opengl/platform/platform.pri +++ /dev/null @@ -1,2 +0,0 @@ -qtConfig(xlib):qtConfig(opengl):!qtConfig(opengles2): \ - include(unix/unix.pri) diff --git a/src/opengl/platform/unix/qglxconvenience.cpp b/src/opengl/platform/unix/qglxconvenience.cpp deleted file mode 100644 index 94781aac3d..0000000000 --- a/src/opengl/platform/unix/qglxconvenience.cpp +++ /dev/null @@ -1,466 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtOpenGL module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -// We have to include this before the X11 headers dragged in by -// qglxconvenience_p.h. -#include -#include - -#include -#include -#include "qglxconvenience_p.h" - -#include -#include - -#include - -enum { - XFocusOut = FocusOut, - XFocusIn = FocusIn, - XKeyPress = KeyPress, - XKeyRelease = KeyRelease, - XNone = None, - XRevertToParent = RevertToParent, - XGrayScale = GrayScale, - XCursorShape = CursorShape -}; -#undef FocusOut -#undef FocusIn -#undef KeyPress -#undef KeyRelease -#undef None -#undef RevertToParent -#undef GrayScale -#undef CursorShape - -#ifdef FontChange -#undef FontChange -#endif - -#ifndef GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 -#endif - -QT_BEGIN_NAMESPACE - -Q_LOGGING_CATEGORY(lcGlx, "qt.glx") - -QList qglx_buildSpec(const QSurfaceFormat &format, int drawableBit, int flags) -{ - QList spec; - - spec << GLX_LEVEL - << 0 - - << GLX_RENDER_TYPE - << GLX_RGBA_BIT - - << GLX_RED_SIZE - << qMax(1, format.redBufferSize()) - - << GLX_GREEN_SIZE - << qMax(1, format.greenBufferSize()) - - << GLX_BLUE_SIZE - << qMax(1, format.blueBufferSize()) - - << GLX_ALPHA_SIZE - << qMax(0, format.alphaBufferSize()); - - if (format.swapBehavior() != QSurfaceFormat::SingleBuffer) - spec << GLX_DOUBLEBUFFER - << True; - - if (format.stereo()) - spec << GLX_STEREO - << True; - - if (format.depthBufferSize() != -1) - spec << GLX_DEPTH_SIZE - << format.depthBufferSize(); - - if (format.stencilBufferSize() != -1) - spec << GLX_STENCIL_SIZE - << format.stencilBufferSize(); - - if (format.samples() > 1) - spec << GLX_SAMPLE_BUFFERS_ARB - << 1 - << GLX_SAMPLES_ARB - << format.samples(); - - if ((flags & QGLX_SUPPORTS_SRGB) && format.colorSpace() == QSurfaceFormat::sRGBColorSpace) - spec << GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB - << True; - - spec << GLX_DRAWABLE_TYPE - << drawableBit - - << XNone; - - return spec; -} - -namespace { -struct QXcbSoftwareOpenGLEnforcer { - QXcbSoftwareOpenGLEnforcer() { - // Allow forcing LIBGL_ALWAYS_SOFTWARE for Qt 5 applications only. - // This is most useful with drivers that only support OpenGL 1. - // We need OpenGL 2, but the user probably doesn't want - // LIBGL_ALWAYS_SOFTWARE in OpenGL 1 apps. - - if (!checkedForceSoftwareOpenGL) { - // If LIBGL_ALWAYS_SOFTWARE is already set, don't mess with it. - // We want to unset LIBGL_ALWAYS_SOFTWARE at the end so it does not - // get inherited by other processes, of course only if it wasn't - // already set before. - if (!qEnvironmentVariableIsEmpty("QT_XCB_FORCE_SOFTWARE_OPENGL") - && !qEnvironmentVariableIsSet("LIBGL_ALWAYS_SOFTWARE")) - forceSoftwareOpenGL = true; - - checkedForceSoftwareOpenGL = true; - } - - if (forceSoftwareOpenGL) - qputenv("LIBGL_ALWAYS_SOFTWARE", QByteArrayLiteral("1")); - } - - ~QXcbSoftwareOpenGLEnforcer() { - // unset LIBGL_ALWAYS_SOFTWARE now so other processes don't inherit it - if (forceSoftwareOpenGL) - qunsetenv("LIBGL_ALWAYS_SOFTWARE"); - } - - static bool checkedForceSoftwareOpenGL; - static bool forceSoftwareOpenGL; -}; - -bool QXcbSoftwareOpenGLEnforcer::checkedForceSoftwareOpenGL = false; -bool QXcbSoftwareOpenGLEnforcer::forceSoftwareOpenGL = false; - -template -struct QXlibScopedPointerDeleter { - static inline void cleanup(T *pointer) { - if (pointer) - XFree(pointer); - } -}; - -template -using QXlibPointer = QScopedPointer>; - -template -using QXlibArrayPointer = QScopedArrayPointer>; -} - -GLXFBConfig qglx_findConfig(Display *display, int screen , QSurfaceFormat format, bool highestPixelFormat, int drawableBit, int flags) -{ - QXcbSoftwareOpenGLEnforcer softwareOpenGLEnforcer; - - GLXFBConfig config = nullptr; - - do { - const QList spec = qglx_buildSpec(format, drawableBit, flags); - - int confcount = 0; - QXlibArrayPointer configs(glXChooseFBConfig(display, screen, spec.constData(), &confcount)); - - if (!config && confcount > 0) { - config = configs[0]; - if (highestPixelFormat && !format.hasAlpha()) - break; - } - - const int requestedRed = qMax(0, format.redBufferSize()); - const int requestedGreen = qMax(0, format.greenBufferSize()); - const int requestedBlue = qMax(0, format.blueBufferSize()); - const int requestedAlpha = qMax(0, format.alphaBufferSize()); - - GLXFBConfig compatibleCandidate = nullptr; - for (int i = 0; i < confcount; i++) { - GLXFBConfig candidate = configs[i]; - - if ((flags & QGLX_SUPPORTS_SRGB) && format.colorSpace() == QSurfaceFormat::sRGBColorSpace) { - int srgbCapable = 0; - glXGetFBConfigAttrib(display, candidate, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, &srgbCapable); - if (!srgbCapable) - continue; - } - - QXlibPointer visual(glXGetVisualFromFBConfig(display, candidate)); - if (!visual) - continue; - int actualRed; - int actualGreen; - int actualBlue; - int actualAlpha; - glXGetFBConfigAttrib(display, candidate, GLX_RED_SIZE, &actualRed); - glXGetFBConfigAttrib(display, candidate, GLX_GREEN_SIZE, &actualGreen); - glXGetFBConfigAttrib(display, candidate, GLX_BLUE_SIZE, &actualBlue); - glXGetFBConfigAttrib(display, candidate, GLX_ALPHA_SIZE, &actualAlpha); - // Sometimes the visuals don't have a depth that includes the alpha channel. - actualAlpha = qMin(actualAlpha, visual->depth - actualRed - actualGreen - actualBlue); - - if (requestedRed && actualRed < requestedRed) - continue; - if (requestedGreen && actualGreen < requestedGreen) - continue; - if (requestedBlue && actualBlue < requestedBlue) - continue; - if (requestedAlpha && actualAlpha < requestedAlpha) - continue; - if (!compatibleCandidate) // Only pick up the first compatible one offered by the server - compatibleCandidate = candidate; - - if (requestedRed && actualRed != requestedRed) - continue; - if (requestedGreen && actualGreen != requestedGreen) - continue; - if (requestedBlue && actualBlue != requestedBlue) - continue; - if (requestedAlpha && actualAlpha != requestedAlpha) - continue; - - return candidate; - } - if (compatibleCandidate) { - qCDebug(lcGlx) << "qglx_findConfig: Found non-matching but compatible FBConfig"; - return compatibleCandidate; - } - } while (qglx_reduceFormat(&format)); - - if (!config) - qCWarning(lcGlx) << "qglx_findConfig: Failed to finding matching FBConfig for" << format; - - return config; -} - -XVisualInfo *qglx_findVisualInfo(Display *display, int screen, QSurfaceFormat *format, int drawableBit, int flags) -{ - Q_ASSERT(format); - - XVisualInfo *visualInfo = nullptr; - - GLXFBConfig config = qglx_findConfig(display, screen, *format, false, drawableBit, flags); - if (config) - visualInfo = glXGetVisualFromFBConfig(display, config); - - if (visualInfo) { - qglx_surfaceFormatFromGLXFBConfig(format, display, config, flags); - return visualInfo; - } - - // attempt to fall back to glXChooseVisual - do { - QList attribs = qglx_buildSpec(*format, drawableBit, flags); - visualInfo = glXChooseVisual(display, screen, attribs.data()); - - if (visualInfo) { - qglx_surfaceFormatFromVisualInfo(format, display, visualInfo, flags); - return visualInfo; - } - } while (qglx_reduceFormat(format)); - - return visualInfo; -} - -void qglx_surfaceFormatFromGLXFBConfig(QSurfaceFormat *format, Display *display, GLXFBConfig config, int flags) -{ - int redSize = 0; - int greenSize = 0; - int blueSize = 0; - int alphaSize = 0; - int depthSize = 0; - int stencilSize = 0; - int sampleBuffers = 0; - int sampleCount = 0; - int stereo = 0; - int srgbCapable = 0; - - glXGetFBConfigAttrib(display, config, GLX_RED_SIZE, &redSize); - glXGetFBConfigAttrib(display, config, GLX_GREEN_SIZE, &greenSize); - glXGetFBConfigAttrib(display, config, GLX_BLUE_SIZE, &blueSize); - glXGetFBConfigAttrib(display, config, GLX_ALPHA_SIZE, &alphaSize); - glXGetFBConfigAttrib(display, config, GLX_DEPTH_SIZE, &depthSize); - glXGetFBConfigAttrib(display, config, GLX_STENCIL_SIZE, &stencilSize); - glXGetFBConfigAttrib(display, config, GLX_SAMPLE_BUFFERS_ARB, &sampleBuffers); - glXGetFBConfigAttrib(display, config, GLX_STEREO, &stereo); - if (flags & QGLX_SUPPORTS_SRGB) - glXGetFBConfigAttrib(display, config, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, &srgbCapable); - - format->setRedBufferSize(redSize); - format->setGreenBufferSize(greenSize); - format->setBlueBufferSize(blueSize); - format->setAlphaBufferSize(alphaSize); - format->setDepthBufferSize(depthSize); - format->setStencilBufferSize(stencilSize); - if (sampleBuffers) { - glXGetFBConfigAttrib(display, config, GLX_SAMPLES_ARB, &sampleCount); - format->setSamples(sampleCount); - } - format->setColorSpace(srgbCapable ? QSurfaceFormat::sRGBColorSpace : QSurfaceFormat::DefaultColorSpace); - - format->setStereo(stereo); -} - -void qglx_surfaceFormatFromVisualInfo(QSurfaceFormat *format, Display *display, XVisualInfo *visualInfo, int flags) -{ - int redSize = 0; - int greenSize = 0; - int blueSize = 0; - int alphaSize = 0; - int depthSize = 0; - int stencilSize = 0; - int sampleBuffers = 0; - int sampleCount = 0; - int stereo = 0; - int srgbCapable = 0; - - glXGetConfig(display, visualInfo, GLX_RED_SIZE, &redSize); - glXGetConfig(display, visualInfo, GLX_GREEN_SIZE, &greenSize); - glXGetConfig(display, visualInfo, GLX_BLUE_SIZE, &blueSize); - glXGetConfig(display, visualInfo, GLX_ALPHA_SIZE, &alphaSize); - glXGetConfig(display, visualInfo, GLX_DEPTH_SIZE, &depthSize); - glXGetConfig(display, visualInfo, GLX_STENCIL_SIZE, &stencilSize); - glXGetConfig(display, visualInfo, GLX_SAMPLE_BUFFERS_ARB, &sampleBuffers); - glXGetConfig(display, visualInfo, GLX_STEREO, &stereo); - if (flags & QGLX_SUPPORTS_SRGB) - glXGetConfig(display, visualInfo, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, &srgbCapable); - - format->setRedBufferSize(redSize); - format->setGreenBufferSize(greenSize); - format->setBlueBufferSize(blueSize); - format->setAlphaBufferSize(alphaSize); - format->setDepthBufferSize(depthSize); - format->setStencilBufferSize(stencilSize); - if (sampleBuffers) { - glXGetConfig(display, visualInfo, GLX_SAMPLES_ARB, &sampleCount); - format->setSamples(sampleCount); - } - format->setColorSpace(srgbCapable ? QSurfaceFormat::sRGBColorSpace : QSurfaceFormat::DefaultColorSpace); - - format->setStereo(stereo); -} - -bool qglx_reduceFormat(QSurfaceFormat *format) -{ - Q_ASSERT(format); - if (std::max(std::max(format->redBufferSize(), format->greenBufferSize()), format->blueBufferSize()) > 8) { - if (format->alphaBufferSize() > 2) { - // First try to match 10 10 10 2 - format->setAlphaBufferSize(2); - return true; - } - - format->setRedBufferSize(std::min(format->redBufferSize(), 8)); - format->setGreenBufferSize(std::min(format->greenBufferSize(), 8)); - format->setBlueBufferSize(std::min(format->blueBufferSize(), 8)); - return true; - } - - if (format->redBufferSize() > 1) { - format->setRedBufferSize(1); - return true; - } - - if (format->greenBufferSize() > 1) { - format->setGreenBufferSize(1); - return true; - } - - if (format->blueBufferSize() > 1) { - format->setBlueBufferSize(1); - return true; - } - - if (format->swapBehavior() != QSurfaceFormat::SingleBuffer){ - format->setSwapBehavior(QSurfaceFormat::SingleBuffer); - return true; - } - - if (format->samples() > 1) { - format->setSamples(qMin(16, format->samples() / 2)); - return true; - } - - if (format->depthBufferSize() >= 32) { - format->setDepthBufferSize(24); - return true; - } - - if (format->depthBufferSize() > 1) { - format->setDepthBufferSize(1); - return true; - } - - if (format->depthBufferSize() > 0) { - format->setDepthBufferSize(0); - return true; - } - - if (format->hasAlpha()) { - format->setAlphaBufferSize(0); - return true; - } - - if (format->stencilBufferSize() > 1) { - format->setStencilBufferSize(1); - return true; - } - - if (format->stencilBufferSize() > 0) { - format->setStencilBufferSize(0); - return true; - } - - if (format->stereo()) { - format->setStereo(false); - return true; - } - - if (format->colorSpace() == QSurfaceFormat::sRGBColorSpace) { - format->setColorSpace(QSurfaceFormat::DefaultColorSpace); - return true; - } - - return false; -} - -QT_END_NAMESPACE diff --git a/src/opengl/platform/unix/qglxconvenience_p.h b/src/opengl/platform/unix/qglxconvenience_p.h deleted file mode 100644 index ed7b522f8d..0000000000 --- a/src/opengl/platform/unix/qglxconvenience_p.h +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtOpenGL module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGLXCONVENIENCE_H -#define QGLXCONVENIENCE_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include -#include - -#include -#include - -QT_BEGIN_NAMESPACE - -enum QGlxFlags -{ - QGLX_SUPPORTS_SRGB = 0x01 -}; - -Q_OPENGL_EXPORT QList qglx_buildSpec(const QSurfaceFormat &format, - int drawableBit = GLX_WINDOW_BIT, - int flags = 0); - -Q_OPENGL_EXPORT XVisualInfo *qglx_findVisualInfo(Display *display, int screen, - QSurfaceFormat *format, - int drawableBit = GLX_WINDOW_BIT, - int flags = 0); - -Q_OPENGL_EXPORT GLXFBConfig qglx_findConfig(Display *display, int screen, - QSurfaceFormat format, - bool highestPixelFormat = false, - int drawableBit = GLX_WINDOW_BIT, - int flags = 0); - -Q_OPENGL_EXPORT void qglx_surfaceFormatFromGLXFBConfig(QSurfaceFormat *format, Display *display, - GLXFBConfig config, int flags = 0); - -Q_OPENGL_EXPORT void qglx_surfaceFormatFromVisualInfo(QSurfaceFormat *format, Display *display, - XVisualInfo *visualInfo, int flags = 0); - -Q_OPENGL_EXPORT bool qglx_reduceFormat(QSurfaceFormat *format); - -QT_END_NAMESPACE - -#endif // QGLXCONVENIENCE_H diff --git a/src/opengl/platform/unix/unix.pri b/src/opengl/platform/unix/unix.pri deleted file mode 100644 index 1cdf0ca22d..0000000000 --- a/src/opengl/platform/unix/unix.pri +++ /dev/null @@ -1,9 +0,0 @@ -QMAKE_USE += xlib - -HEADERS += \ - platform/unix/qglxconvenience_p.h - -SOURCES += \ - platform/unix/qglxconvenience.cpp - -QMAKE_USE += xlib -- cgit v1.2.3