Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohosegl.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qohosegl.h"
5#include <QtCore/private/qohoscommon_p.h>
6#include <qohosjsenv_p.h>
7
8#include <QtCore/qmap.h>
9
11
12void QOhosEGLSurface::setNativeWindowSurface(EGLNativeWindowType nativeWindow)
13{
14 m_refTargetNativeWindow = nativeWindow;
15}
16
17void QOhosEGLSurface::tryCreateSurface(EGLDisplay display, EGLConfig config, SurfaceFlags surfaceFlags)
18{
19 bool canBuild = m_refTargetNativeWindow != nullptr;
20 if (!canBuild)
21 return;
22
23 EGLint surfaceAttribs[] = {
24 EGL_RENDER_BUFFER, EGL_BACK_BUFFER,
25 EGL_NONE
26 };
27
28 EGLNativeWindowType eglNativeWindow = m_refTargetNativeWindow;
29
30 EGLSurface surface = eglCreateWindowSurface(
31 display,
32 config,
33 eglNativeWindow,
34 surfaceAttribs);
35
36 std::string errMessage;
37 if (surface == EGL_NO_SURFACE) {
38 auto eglErrorCode = eglGetError();
39 switch (eglErrorCode) {
40 case EGL_BAD_MATCH: errMessage = "EGL_BAD_MATCH"; break;
41 case EGL_BAD_CONFIG: errMessage = "EGL_BAD_CONFIG"; break;
42 case EGL_BAD_NATIVE_WINDOW: errMessage = "EGL_BAD_NATIVE_WINDOW"; break;
43 case EGL_BAD_ALLOC: errMessage = "EGL_BAD_ALLOC"; break;
44 }
45 qOhosReportFatalErrorAndAbort(
46 "Failed to create surface with error: %d - %s",
47 eglErrorCode,
48 errMessage.c_str());
49 }
50
51 bool preserveBufOnSwapRequested = surfaceFlags.testFlag(
52 SurfaceFlagBits::PreserveBufferContentsOnSwap);
53 if (preserveBufOnSwapRequested
54 && eglSurfaceAttrib(display, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED) == EGL_FALSE) {
55 qOhosReportFatalErrorAndAbort("Failed to set EGL_BUFFER_PRESERVED surface attrib");
56 }
57
58 m_ownEglSurface = surface;
59 m_refCurrentConfig = config;
60 m_refCurrentDisplay = display;
61 m_refCurrentNativeWindow = m_refTargetNativeWindow;
62 m_currentSurfaceFlags = surfaceFlags;
63}
64
65EGLSurface QOhosEGLSurface::tryGetOrCreateEGLWindowSurface(
66 EGLDisplay display, EGLConfig config, SurfaceFlags surfaceFlags)
67{
68 bool needsRebuild = m_ownEglSurface == EGL_NO_SURFACE
69 || m_refCurrentNativeWindow != m_refTargetNativeWindow
70 || m_refCurrentDisplay != display
71 || m_refCurrentConfig != config
72 || m_currentSurfaceFlags != surfaceFlags;
73
74
75 if (!needsRebuild)
76 return m_ownEglSurface;
77
78 cleanup();
79 tryCreateSurface(display, config, surfaceFlags);
80
81 return m_ownEglSurface;
82}
83
84void QOhosEGLSurface::cleanup()
85{
86 if (m_ownEglSurface != EGL_NO_SURFACE && eglDestroySurface(m_refCurrentDisplay, m_ownEglSurface) == EGL_FALSE)
87 qOhosPrintfDebug("Failed to destroy surface");
88
89 m_refCurrentDisplay = EGL_NO_DISPLAY;
90 m_refCurrentConfig = nullptr;
91 m_refCurrentNativeWindow = nullptr;
92 m_ownEglSurface = EGL_NO_SURFACE;
93 m_currentSurfaceFlags = {};
94}
95
96QOhosEGLSurface::~QOhosEGLSurface()
97{
98 cleanup();
99}
100
101QOhosEGLSurface::SurfaceFlags QOhosEGLSurface::currentSurfaceFlags() const
102{
103 return m_currentSurfaceFlags;
104}
105
106QT_END_NAMESPACE
Combined button and popup list for selecting options.