summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/glxconvenience/qglxconvenience.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2018-04-13 11:44:41 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2018-10-14 20:41:49 +0000
commit8ec98fc2dc40237730f99af099dffe2920ef5bcc (patch)
tree4ff2f527cfc39858b242191d1763fc3adf9b50ca /src/platformsupport/glxconvenience/qglxconvenience.cpp
parent1192c463db34e3f69be4d9ef976246ce265143a3 (diff)
Fix launching with depth 30 XOrg
Our fallback logic for inexact matches was not very good at accepting better suggestions. Change-Id: I40fb78bf583171105725156148e4a2245fb81354 Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
Diffstat (limited to 'src/platformsupport/glxconvenience/qglxconvenience.cpp')
-rw-r--r--src/platformsupport/glxconvenience/qglxconvenience.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/platformsupport/glxconvenience/qglxconvenience.cpp b/src/platformsupport/glxconvenience/qglxconvenience.cpp
index 8d2e58b57b..d7cc36627a 100644
--- a/src/platformsupport/glxconvenience/qglxconvenience.cpp
+++ b/src/platformsupport/glxconvenience/qglxconvenience.cpp
@@ -42,13 +42,18 @@
#include <QtCore/QByteArray>
#include <QtCore/QScopedPointer>
+#include <QtCore/qmetatype.h>
+#include <QtCore/qtextstream.h>
#include "qglxconvenience_p.h"
+#include <QtCore/QLoggingCategory>
#include <QtCore/QVector>
#include <QtCore/QVarLengthArray>
#include <GL/glxext.h>
+Q_LOGGING_CATEGORY(lcGlx, "qt.glx")
+
enum {
XFocusOut = FocusOut,
XFocusIn = FocusIn,
@@ -207,6 +212,7 @@ GLXFBConfig qglx_findConfig(Display *display, int screen , QSurfaceFormat format
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];
@@ -226,6 +232,16 @@ GLXFBConfig qglx_findConfig(Display *display, int screen , QSurfaceFormat format
const int actualBlue = qPopulationCount(visual->blue_mask);
const int 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;
+ compatibleCandidate = candidate;
+
if (requestedRed && actualRed != requestedRed)
continue;
if (requestedGreen && actualGreen != requestedGreen)
@@ -237,6 +253,11 @@ GLXFBConfig qglx_findConfig(Display *display, int screen , QSurfaceFormat format
return candidate;
}
+ if (compatibleCandidate) {
+ qCDebug(lcGlx) << "qglx_findConfig: Found non-matching but compatible FBConfig";
+ return compatibleCandidate;
+ }
+ qCWarning(lcGlx, "qglx_findConfig: Failed to finding matching FBConfig (%d %d %d %d)", requestedRed, requestedGreen, requestedBlue, requestedAlpha);
} while (qglx_reduceFormat(&format));
return config;
@@ -352,6 +373,18 @@ void qglx_surfaceFormatFromVisualInfo(QSurfaceFormat *format, Display *display,
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);