27 std::optional<xcb_visualid_t> requestedVisualId,
28 std::optional<uint8_t> requestedDepth =
std::nullopt)
30 xcb_depth_iterator_t depthIterator = xcb_screen_allowed_depths_iterator(screen);
32 while (depthIterator.rem) {
33 xcb_depth_t *depth = depthIterator.data;
34 xcb_visualtype_iterator_t visualTypeIterator = xcb_depth_visuals_iterator(depth);
36 while (visualTypeIterator.rem) {
37 xcb_visualtype_t *visualType = visualTypeIterator.data;
38 if (requestedVisualId && visualType->visual_id != *requestedVisualId) {
39 xcb_visualtype_next(&visualTypeIterator);
43 if (requestedDepth && depth->depth != *requestedDepth) {
44 xcb_visualtype_next(&visualTypeIterator);
48 return VisualInfo{ *visualType, depth->depth };
51 xcb_depth_next(&depthIterator);
75 m_connection = connection;
77 const char *extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
79#if QT_CONFIG(xcb_xlib)
80 if (extensions && strstr(extensions,
"EGL_EXT_platform_x11")) {
81 QEGLStreamConvenience streamFuncs;
82 m_egl_display = streamFuncs.get_platform_display(EGL_PLATFORM_X11_KHR,
83 m_connection->xlib_display(),
85 m_using_platform_display =
true;
90 m_egl_display = eglGetDisplay(
reinterpret_cast<EGLNativeDisplayType>(m_connection->xlib_display()));
93 if (extensions && (strstr(extensions,
"EGL_EXT_platform_xcb") || strstr(extensions,
"EGL_MESA_platform_xcb"))) {
94 QEGLStreamConvenience streamFuncs;
95 m_egl_display = streamFuncs.get_platform_display(EGL_PLATFORM_XCB_KHR,
96 reinterpret_cast<
void *>(connection->xcb_connection()),
98 m_using_platform_display =
true;
103 bool success = eglInitialize(m_egl_display, &major, &minor);
104#if QT_CONFIG(egl_x11)
106 m_egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
107 qCDebug(lcQpaGl) <<
"Xcb EGL gl-integration retrying with display" << m_egl_display;
108 success = eglInitialize(m_egl_display, &major, &minor);
112 m_native_interface_handler.reset(
new QXcbEglNativeInterfaceHandler(connection->nativeInterface()));
115 qCDebug(lcQpaGl) <<
"Xcb EGL gl-integration successfully initialized";
117 qCWarning(lcQpaGl) <<
"Xcb EGL gl-integration initialize failed";
149 xcb_visualid_t visualId = 0;
152 EGLint configRedSize = 0;
153 eglGetConfigAttrib(eglDisplay(), config, EGL_RED_SIZE, &configRedSize);
155 EGLint configGreenSize = 0;
156 eglGetConfigAttrib(eglDisplay(), config, EGL_GREEN_SIZE, &configGreenSize);
158 EGLint configBlueSize = 0;
159 eglGetConfigAttrib(eglDisplay(), config, EGL_BLUE_SIZE, &configBlueSize);
161 EGLint configAlphaSize = 0;
162 eglGetConfigAttrib(eglDisplay(), config, EGL_ALPHA_SIZE, &configAlphaSize);
164 eglGetConfigAttrib(eglDisplay(), config, EGL_CONFIG_ID, &eglValue);
165 int configId = eglValue;
168 eglGetConfigAttrib(eglDisplay(), config, EGL_NATIVE_VISUAL_ID, &eglValue);
172 std::optional<
VisualInfo> chosenVisualInfo = getVisualInfo(screen, visualId);
173 if (chosenVisualInfo) {
176 if (q_hasEglExtension(eglDisplay(),
"EGL_NV_post_convert_rounding"))
179 const char *vendor = eglQueryString(eglDisplay(), EGL_VENDOR);
180 if (vendor && strstr(vendor,
"Vivante"))
183 int visualRedSize = qPopulationCount(chosenVisualInfo->visualType.red_mask);
184 int visualGreenSize = qPopulationCount(chosenVisualInfo->visualType.green_mask);
185 int visualBlueSize = qPopulationCount(chosenVisualInfo->visualType.blue_mask);
186 int visualAlphaSize = chosenVisualInfo->depth - visualRedSize - visualBlueSize - visualGreenSize;
188 const bool visualMatchesConfig = visualRedSize >= configRedSize
189 && visualGreenSize >= configGreenSize
190 && visualBlueSize >= configBlueSize
191 && visualAlphaSize >= configAlphaSize;
195 if (!visualMatchesConfig) {
198 "EGL suggested using X Visual ID %d (%d %d %d %d depth %d) for EGL config %d"
199 "(%d %d %d %d), but this is incompatible",
200 visualId, visualRedSize, visualGreenSize, visualBlueSize, visualAlphaSize, chosenVisualInfo->depth,
201 configId, configRedSize, configGreenSize, configBlueSize, configAlphaSize);
204 qCDebug(lcQpaGl,
"EGL suggested using X Visual ID %d for EGL config %d, but that isn't a valid ID",
210 qCDebug(lcQpaGl,
"EGL did not suggest a VisualID (EGL_NATIVE_VISUAL_ID was zero) for EGLConfig %d", configId);
213 qCDebug(lcQpaGl, configAlphaSize > 0
214 ?
"Using ARGB Visual ID %d provided by EGL for config %d"
215 :
"Using Opaque Visual ID %d provided by EGL for config %d", visualId, configId);
221 uint8_t depth = configRedSize + configGreenSize + configBlueSize + configAlphaSize;
222 std::optional<
VisualInfo> matchingVisual = getVisualInfo(screen, std::nullopt, depth);
223 if (!matchingVisual) {
225 depth = configRedSize + configGreenSize + configBlueSize;
226 matchingVisual = getVisualInfo(screen, std::nullopt, depth);
230 visualId = matchingVisual->visualType.visual_id;
234 qCDebug(lcQpaGl,
"Using Visual ID %d provided by getVisualInfo for EGL config %d", visualId, configId);
238 qWarning(
"Unable to find an X11 visual which matches EGL config %d", configId);