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";
154 xcb_visualid_t visualId = 0;
157 EGLint configRedSize = 0;
158 eglGetConfigAttrib(eglDisplay(), config, EGL_RED_SIZE, &configRedSize);
160 EGLint configGreenSize = 0;
161 eglGetConfigAttrib(eglDisplay(), config, EGL_GREEN_SIZE, &configGreenSize);
163 EGLint configBlueSize = 0;
164 eglGetConfigAttrib(eglDisplay(), config, EGL_BLUE_SIZE, &configBlueSize);
166 EGLint configAlphaSize = 0;
167 eglGetConfigAttrib(eglDisplay(), config, EGL_ALPHA_SIZE, &configAlphaSize);
169 eglGetConfigAttrib(eglDisplay(), config, EGL_CONFIG_ID, &eglValue);
170 int configId = eglValue;
173 eglGetConfigAttrib(eglDisplay(), config, EGL_NATIVE_VISUAL_ID, &eglValue);
177 std::optional<
VisualInfo> chosenVisualInfo = getVisualInfo(screen, visualId);
178 if (chosenVisualInfo) {
181 if (q_hasEglExtension(eglDisplay(),
"EGL_NV_post_convert_rounding"))
184 const char *vendor = eglQueryString(eglDisplay(), EGL_VENDOR);
185 if (vendor && strstr(vendor,
"Vivante"))
188 int visualRedSize = qPopulationCount(chosenVisualInfo->visualType.red_mask);
189 int visualGreenSize = qPopulationCount(chosenVisualInfo->visualType.green_mask);
190 int visualBlueSize = qPopulationCount(chosenVisualInfo->visualType.blue_mask);
191 int visualAlphaSize = chosenVisualInfo->depth - visualRedSize - visualBlueSize - visualGreenSize;
193 const bool visualMatchesConfig = visualRedSize >= configRedSize
194 && visualGreenSize >= configGreenSize
195 && visualBlueSize >= configBlueSize
196 && visualAlphaSize >= configAlphaSize;
200 if (!visualMatchesConfig) {
203 "EGL suggested using X Visual ID %d (%d %d %d %d depth %d) for EGL config %d"
204 "(%d %d %d %d), but this is incompatible",
205 visualId, visualRedSize, visualGreenSize, visualBlueSize, visualAlphaSize, chosenVisualInfo->depth,
206 configId, configRedSize, configGreenSize, configBlueSize, configAlphaSize);
209 qCDebug(lcQpaGl,
"EGL suggested using X Visual ID %d for EGL config %d, but that isn't a valid ID",
215 qCDebug(lcQpaGl,
"EGL did not suggest a VisualID (EGL_NATIVE_VISUAL_ID was zero) for EGLConfig %d", configId);
218 qCDebug(lcQpaGl, configAlphaSize > 0
219 ?
"Using ARGB Visual ID %d provided by EGL for config %d"
220 :
"Using Opaque Visual ID %d provided by EGL for config %d", visualId, configId);
226 uint8_t depth = configRedSize + configGreenSize + configBlueSize + configAlphaSize;
227 std::optional<
VisualInfo> matchingVisual = getVisualInfo(screen, std::nullopt, depth);
228 if (!matchingVisual) {
230 depth = configRedSize + configGreenSize + configBlueSize;
231 matchingVisual = getVisualInfo(screen, std::nullopt, depth);
235 visualId = matchingVisual->visualType.visual_id;
239 qCDebug(lcQpaGl,
"Using Visual ID %d provided by getVisualInfo for EGL config %d", visualId, configId);
243 qWarning(
"Unable to find an X11 visual which matches EGL config %d", configId);