36EGLDisplay QEglFSKmsEglDeviceIntegration::createDisplay(EGLNativeDisplayType nativeDisplay)
38 qCDebug(qLcEglfsKmsDebug,
"Creating display");
42 EGLint egldevice_fd = device()->fd();
44 const EGLint attribs[] = { EGL_DRM_MASTER_FD_EXT, egldevice_fd, EGL_NONE };
45 if (m_funcs->has_egl_platform_device) {
46 display = m_funcs->get_platform_display(EGL_PLATFORM_DEVICE_EXT, nativeDisplay, attribs);
48 qWarning(
"EGL_EXT_platform_device not available, falling back to legacy path!");
49 display = eglGetDisplay(nativeDisplay);
52 if (Q_UNLIKELY(display == EGL_NO_DISPLAY))
53 qFatal(
"Could not get EGL display");
56 if (Q_UNLIKELY(!eglInitialize(display, &major, &minor)))
57 qFatal(
"Could not initialize egl display");
59 if (Q_UNLIKELY(!eglBindAPI(EGL_OPENGL_ES_API)))
60 qFatal(
"Failed to bind EGL_OPENGL_ES_API\n");
105 qCDebug(qLcEglfsKmsDebug,
"Creating stream");
107 EGLDisplay display = screen()->display();
108 EGLint streamAttribs[3];
109 int streamAttribCount = 0;
110 int fifoLength = qEnvironmentVariableIntValue(
"QT_QPA_EGLFS_STREAM_FIFO_LENGTH");
111 if (fifoLength > 0) {
112 streamAttribs[streamAttribCount++] = EGL_STREAM_FIFO_LENGTH_KHR;
113 streamAttribs[streamAttribCount++] = fifoLength;
115 streamAttribs[streamAttribCount++] = EGL_NONE;
117 m_egl_stream = m_integration->m_funcs->create_stream(display, streamAttribs);
118 if (m_egl_stream == EGL_NO_STREAM_KHR) {
119 qWarning(
"resetSurface: Couldn't create EGLStream for native window");
123 qCDebug(qLcEglfsKmsDebug,
"Created stream %p on display %p", m_egl_stream, display);
126 if (
m_integration->m_funcs->query_stream(display, m_egl_stream, EGL_STREAM_FIFO_LENGTH_KHR, &count)) {
128 qCDebug(qLcEglfsKmsDebug,
"Using EGLStream FIFO mode with %d frames", count);
130 qCDebug(qLcEglfsKmsDebug,
"Using EGLStream mailbox mode");
132 qCDebug(qLcEglfsKmsDebug,
"Could not query number of EGLStream FIFO frames");
135 if (!
m_integration->m_funcs->get_output_layers(display,
nullptr,
nullptr, 0, &count) || count == 0) {
136 qWarning(
"No output layers found");
140 qCDebug(qLcEglfsKmsDebug,
"Output has %d layers", count);
142 QList<EGLOutputLayerEXT> layers;
143 layers.resize(count);
145 if (!
m_integration->m_funcs->get_output_layers(display,
nullptr, layers.data(), count, &actualCount)) {
146 qWarning(
"Failed to get layers");
151 Q_ASSERT(cur_screen);
152 QKmsOutput &output(cur_screen->output());
153 const uint32_t wantedId = !output.wants_forced_plane ? output.crtc_id : output.forced_plane_id;
154 qCDebug(qLcEglfsKmsDebug,
"Searching for id: %d", wantedId);
156 EGLOutputLayerEXT layer = EGL_NO_OUTPUT_LAYER_EXT;
157 for (
int i = 0; i < actualCount; ++i) {
159 if (
m_integration->m_funcs->query_output_layer_attrib(display, layers[i], EGL_DRM_CRTC_EXT, &id)) {
160 qCDebug(qLcEglfsKmsDebug,
" [%d] layer %p - crtc %d", i, layers[i], (
int) id);
161 if (id == EGLAttrib(wantedId))
163 }
else if (
m_integration->m_funcs->query_output_layer_attrib(display, layers[i], EGL_DRM_PLANE_EXT, &id)) {
164 qCDebug(qLcEglfsKmsDebug,
" [%d] layer %p - plane %d", i, layers[i], (
int) id);
165 if (id == EGLAttrib(wantedId))
168 qCDebug(qLcEglfsKmsDebug,
" [%d] layer %p - unknown", i, layers[i]);
172 QByteArray reqLayerIndex = qgetenv(
"QT_QPA_EGLFS_LAYER_INDEX");
173 if (!reqLayerIndex.isEmpty()) {
174 int idx = reqLayerIndex.toInt();
175 if (idx >= 0 && idx < layers.size()) {
176 qCDebug(qLcEglfsKmsDebug,
"EGLOutput layer index override = %d", idx);
181 if (layer == EGL_NO_OUTPUT_LAYER_EXT) {
182 qWarning(
"resetSurface: Couldn't get EGLOutputLayer for native window");
186 qCDebug(qLcEglfsKmsDebug,
"Using layer %p", layer);
188 if (!
m_integration->m_funcs->stream_consumer_output(display, m_egl_stream, layer))
189 qWarning(
"resetSurface: Unable to connect stream");
191 m_config = QEglFSDeviceIntegration::chooseConfig(display, m_integration->surfaceFormatFor(window()->requestedFormat()));
192 m_format = q_glFormatFromConfig(display, m_config);
193 qCDebug(qLcEglfsKmsDebug) <<
"Stream producer format is" << m_format;
195 const int w = cur_screen->rawGeometry().width();
196 const int h = cur_screen->rawGeometry().height();
197 qCDebug(qLcEglfsKmsDebug,
"Creating stream producer surface of size %dx%d", w, h);
199 const EGLint stream_producer_attribs[] = {
205 m_surface = m_integration->m_funcs->create_stream_producer_surface(display, m_config, m_egl_stream, stream_producer_attribs);
206 if (m_surface == EGL_NO_SURFACE)
209 qCDebug(qLcEglfsKmsDebug,
"Created stream producer surface %p", m_surface);