50QList<
int> qglx_buildSpec(
const QSurfaceFormat &format,
int drawableBit,
int flags)
61 << qMax(1, format.redBufferSize())
64 << qMax(1, format.greenBufferSize())
67 << qMax(1, format.blueBufferSize())
70 << qMax(0, format.alphaBufferSize());
72 if (format.swapBehavior() != QSurfaceFormat::SingleBuffer)
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();
88 if (format.samples() > 1)
89 spec << GLX_SAMPLE_BUFFERS_ARB
94 if ((flags & QGLX_SUPPORTS_SRGB) && format.colorSpace() == QColorSpace::SRgb)
98 spec << GLX_DRAWABLE_TYPE
158GLXFBConfig
qglx_findConfig(Display *display,
int screen , QSurfaceFormat format,
bool highestPixelFormat,
int drawableBit,
int flags)
160 QXcbSoftwareOpenGLEnforcer softwareOpenGLEnforcer;
162 GLXFBConfig config =
nullptr;
165 const QList<
int> spec = qglx_buildSpec(format, drawableBit, flags);
168 QXlibArrayPointer<GLXFBConfig> configs(glXChooseFBConfig(display, screen, spec.constData(), &confcount));
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];
185 if ((flags & QGLX_SUPPORTS_SRGB) && format.colorSpace() == QColorSpace::SRgb) {
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;
232 }
while (qglx_reduceFormat(&format));
235 qCWarning(lcGlx) <<
"qglx_findConfig: Failed to finding matching FBConfig for" << format;
240XVisualInfo *
qglx_findVisualInfo(Display *display,
int screen, QSurfaceFormat *format,
int drawableBit,
int flags)
244 XVisualInfo *visualInfo =
nullptr;
246 GLXFBConfig config = qglx_findConfig(display, screen, *format,
false, drawableBit, flags);
248 visualInfo = glXGetVisualFromFBConfig(display, config);
251 qglx_surfaceFormatFromGLXFBConfig(format, display, config, flags);
257 QList<
int> attribs = qglx_buildSpec(*format, drawableBit, flags);
258 visualInfo = glXChooseVisual(display, screen, attribs.data());
261 qglx_surfaceFormatFromVisualInfo(format, display, visualInfo, flags);
264 }
while (qglx_reduceFormat(format));
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);
289 glXGetFBConfigAttrib(display, config, GLX_STEREO, &stereo);
290 if (flags & QGLX_SUPPORTS_SRGB)
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);
304 format->setColorSpace(QColorSpace::SRgb);
306 format->setColorSpace(QColorSpace());
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);
332 if (flags & QGLX_SUPPORTS_SRGB)
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);
346 format->setColorSpace(QColorSpace::SRgb);
348 format->setColorSpace(QColorSpace());
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);
384 if (format->swapBehavior() != QSurfaceFormat::SingleBuffer){
385 format->setSwapBehavior(QSurfaceFormat::SingleBuffer);
389 if (format->samples() > 1) {
390 format->setSamples(qMin(16, format->samples() / 2));
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);
409 if (format->hasAlpha()) {
410 format->setAlphaBufferSize(0);
414 if (format->stencilBufferSize() > 1) {
415 format->setStencilBufferSize(1);
419 if (format->stencilBufferSize() > 0) {
420 format->setStencilBufferSize(0);
424 if (format->stereo()) {
425 format->setStereo(
false);
429 if (format->colorSpace() == QColorSpace::SRgb) {
430 format->setColorSpace(QColorSpace());