6#include <QtCore/qbytearray.h>
7#include <QtCore/qmetatype.h>
8#include <QtCore/qscopedpointer.h>
9#include <QtCore/qtextstream.h>
10#include <QtGui/qcolorspace.h>
13#include <QtCore/qloggingcategory.h>
14#include <QtCore/qvarlengtharray.h>
42#ifndef GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB
43#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2
73 spec << GLX_DOUBLEBUFFER
80 if (
format.depthBufferSize() != -1)
81 spec << GLX_DEPTH_SIZE
82 <<
format.depthBufferSize();
84 if (
format.stencilBufferSize() != -1)
85 spec << GLX_STENCIL_SIZE
86 <<
format.stencilBufferSize();
89 spec << GLX_SAMPLE_BUFFERS_ARB
98 spec << GLX_DRAWABLE_TYPE
107struct QXcbSoftwareOpenGLEnforcer {
108 QXcbSoftwareOpenGLEnforcer() {
114 if (!checkedForceSoftwareOpenGL) {
121 forceSoftwareOpenGL =
true;
123 checkedForceSoftwareOpenGL =
true;
126 if (forceSoftwareOpenGL)
127 qputenv(
"LIBGL_ALWAYS_SOFTWARE",
"1");
130 ~QXcbSoftwareOpenGLEnforcer() {
132 if (forceSoftwareOpenGL)
136 static bool checkedForceSoftwareOpenGL;
137 static bool forceSoftwareOpenGL;
140bool QXcbSoftwareOpenGLEnforcer::checkedForceSoftwareOpenGL =
false;
141bool QXcbSoftwareOpenGLEnforcer::forceSoftwareOpenGL =
false;
144struct QXlibScopedPointerDeleter {
145 static inline void cleanup(T *
pointer) {
160 QXcbSoftwareOpenGLEnforcer softwareOpenGLEnforcer;
162 GLXFBConfig
config =
nullptr;
170 if (!
config && confcount > 0) {
172 if (highestPixelFormat && !
format.hasAlpha())
176 const int requestedRed =
qMax(0,
format.redBufferSize());
177 const int requestedGreen =
qMax(0,
format.greenBufferSize());
178 const int requestedBlue =
qMax(0,
format.blueBufferSize());
179 const int requestedAlpha =
qMax(0,
format.alphaBufferSize());
181 GLXFBConfig compatibleCandidate =
nullptr;
182 for (
int i = 0;
i < confcount;
i++) {
183 GLXFBConfig candidate = configs[
i];
192 QXlibPointer<XVisualInfo> visual(glXGetVisualFromFBConfig(
display, candidate));
199 glXGetFBConfigAttrib(
display, candidate, GLX_RED_SIZE, &actualRed);
200 glXGetFBConfigAttrib(
display, candidate, GLX_GREEN_SIZE, &actualGreen);
201 glXGetFBConfigAttrib(
display, candidate, GLX_BLUE_SIZE, &actualBlue);
202 glXGetFBConfigAttrib(
display, candidate, GLX_ALPHA_SIZE, &actualAlpha);
204 actualAlpha =
qMin(actualAlpha, visual->depth - actualRed - actualGreen - actualBlue);
206 if (requestedRed && actualRed < requestedRed)
208 if (requestedGreen && actualGreen < requestedGreen)
210 if (requestedBlue && actualBlue < requestedBlue)
212 if (requestedAlpha && actualAlpha < requestedAlpha)
214 if (!compatibleCandidate)
215 compatibleCandidate = candidate;
217 if (requestedRed && actualRed != requestedRed)
219 if (requestedGreen && actualGreen != requestedGreen)
221 if (requestedBlue && actualBlue != requestedBlue)
223 if (requestedAlpha && actualAlpha != requestedAlpha)
228 if (compatibleCandidate) {
229 qCDebug(lcGlx) <<
"qglx_findConfig: Found non-matching but compatible FBConfig";
230 return compatibleCandidate;
235 qCWarning(lcGlx) <<
"qglx_findConfig: Failed to finding matching FBConfig for" <<
format;
244 XVisualInfo *visualInfo =
nullptr;
277 int sampleBuffers = 0;
282 glXGetFBConfigAttrib(
display,
config, GLX_RED_SIZE, &redSize);
283 glXGetFBConfigAttrib(
display,
config, GLX_GREEN_SIZE, &greenSize);
284 glXGetFBConfigAttrib(
display,
config, GLX_BLUE_SIZE, &blueSize);
285 glXGetFBConfigAttrib(
display,
config, GLX_ALPHA_SIZE, &alphaSize);
286 glXGetFBConfigAttrib(
display,
config, GLX_DEPTH_SIZE, &depthSize);
287 glXGetFBConfigAttrib(
display,
config, GLX_STENCIL_SIZE, &stencilSize);
288 glXGetFBConfigAttrib(
display,
config, GLX_SAMPLE_BUFFERS_ARB, &sampleBuffers);
293 format->setRedBufferSize(redSize);
294 format->setGreenBufferSize(greenSize);
295 format->setBlueBufferSize(blueSize);
296 format->setAlphaBufferSize(alphaSize);
297 format->setDepthBufferSize(depthSize);
298 format->setStencilBufferSize(stencilSize);
300 glXGetFBConfigAttrib(
display,
config, GLX_SAMPLES_ARB, &sampleCount);
301 format->setSamples(sampleCount);
308 format->setStereo(stereo);
319 int sampleBuffers = 0;
324 glXGetConfig(
display, visualInfo, GLX_RED_SIZE, &redSize);
325 glXGetConfig(
display, visualInfo, GLX_GREEN_SIZE, &greenSize);
326 glXGetConfig(
display, visualInfo, GLX_BLUE_SIZE, &blueSize);
327 glXGetConfig(
display, visualInfo, GLX_ALPHA_SIZE, &alphaSize);
328 glXGetConfig(
display, visualInfo, GLX_DEPTH_SIZE, &depthSize);
329 glXGetConfig(
display, visualInfo, GLX_STENCIL_SIZE, &stencilSize);
330 glXGetConfig(
display, visualInfo, GLX_SAMPLE_BUFFERS_ARB, &sampleBuffers);
331 glXGetConfig(
display, visualInfo, GLX_STEREO, &stereo);
335 format->setRedBufferSize(redSize);
336 format->setGreenBufferSize(greenSize);
337 format->setBlueBufferSize(blueSize);
338 format->setAlphaBufferSize(alphaSize);
339 format->setDepthBufferSize(depthSize);
340 format->setStencilBufferSize(stencilSize);
342 glXGetConfig(
display, visualInfo, GLX_SAMPLES_ARB, &sampleCount);
343 format->setSamples(sampleCount);
350 format->setStereo(stereo);
356 if (std::max(std::max(
format->redBufferSize(),
format->greenBufferSize()),
format->blueBufferSize()) > 8) {
357 if (
format->alphaBufferSize() > 2) {
359 format->setAlphaBufferSize(2);
363 format->setRedBufferSize(std::min(
format->redBufferSize(), 8));
364 format->setGreenBufferSize(std::min(
format->greenBufferSize(), 8));
365 format->setBlueBufferSize(std::min(
format->blueBufferSize(), 8));
369 if (
format->redBufferSize() > 1) {
370 format->setRedBufferSize(1);
374 if (
format->greenBufferSize() > 1) {
375 format->setGreenBufferSize(1);
379 if (
format->blueBufferSize() > 1) {
380 format->setBlueBufferSize(1);
389 if (
format->samples() > 1) {
394 if (
format->depthBufferSize() >= 32) {
395 format->setDepthBufferSize(24);
399 if (
format->depthBufferSize() > 1) {
400 format->setDepthBufferSize(1);
404 if (
format->depthBufferSize() > 0) {
405 format->setDepthBufferSize(0);
410 format->setAlphaBufferSize(0);
414 if (
format->stencilBufferSize() > 1) {
415 format->setStencilBufferSize(1);
419 if (
format->stencilBufferSize() > 0) {
420 format->setStencilBufferSize(0);
The QColorSpace class provides a color space abstraction.
const_pointer constData() const noexcept
struct wl_display * display
Combined button and popup list for selecting options.
void qglx_surfaceFormatFromGLXFBConfig(QSurfaceFormat *format, Display *display, GLXFBConfig config, int flags)
QT_BEGIN_NAMESPACE QList< int > qglx_buildSpec(const QSurfaceFormat &format, int drawableBit, int flags)
void qglx_surfaceFormatFromVisualInfo(QSurfaceFormat *format, Display *display, XVisualInfo *visualInfo, int flags)
GLXFBConfig qglx_findConfig(Display *display, int screen, QSurfaceFormat format, bool highestPixelFormat, int drawableBit, int flags)
bool qglx_reduceFormat(QSurfaceFormat *format)
XVisualInfo * qglx_findVisualInfo(Display *display, int screen, QSurfaceFormat *format, int drawableBit, int flags)
#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
constexpr const T & qMin(const T &a, const T &b)
constexpr const T & qMax(const T &a, const T &b)
GLint GLsizei GLsizei GLenum format
GLsizei const void * pointer
bool qputenv(const char *varName, QByteArrayView raw)
Q_CORE_EXPORT bool qEnvironmentVariableIsEmpty(const char *varName) noexcept
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
Q_CORE_EXPORT bool qunsetenv(const char *varName)