5#include <QtCore/private/qohoscommon_p.h>
7#include <QtCore/qmap.h>
11void QOhosEGLSurface::setNativeWindowSurface(
12 EGLNativeWindowType nativeWindow,
const std::optional<QSize> &optSurfaceSize)
14 m_targetSurfaceSize = optSurfaceSize;
15 m_refTargetNativeWindow = nativeWindow;
18void QOhosEGLSurface::tryCreateSurface(EGLDisplay display, EGLConfig config, SurfaceFlags surfaceFlags)
20 bool canBuild = m_refTargetNativeWindow !=
nullptr;
24 EGLint surfaceAttribs[] = {
25 EGL_RENDER_BUFFER, EGL_BACK_BUFFER,
29 EGLNativeWindowType eglNativeWindow = m_refTargetNativeWindow;
31 EGLSurface surface = eglCreateWindowSurface(
37 std::string errMessage;
38 if (surface == EGL_NO_SURFACE) {
39 auto eglErrorCode = eglGetError();
40 switch (eglErrorCode) {
41 case EGL_BAD_MATCH: errMessage =
"EGL_BAD_MATCH";
break;
42 case EGL_BAD_CONFIG: errMessage =
"EGL_BAD_CONFIG";
break;
43 case EGL_BAD_NATIVE_WINDOW: errMessage =
"EGL_BAD_NATIVE_WINDOW";
break;
44 case EGL_BAD_ALLOC: errMessage =
"EGL_BAD_ALLOC";
break;
46 qOhosReportFatalErrorAndAbort(
47 "Failed to create surface with error: %d - %s",
52 bool preserveBufOnSwapRequested = surfaceFlags.testFlag(
53 SurfaceFlagBits::PreserveBufferContentsOnSwap);
54 if (preserveBufOnSwapRequested
55 && eglSurfaceAttrib(display, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED) == EGL_FALSE) {
56 qOhosReportFatalErrorAndAbort(
"Failed to set EGL_BUFFER_PRESERVED surface attrib");
59 m_ownEglSurface = surface;
60 m_refCurrentConfig = config;
61 m_refCurrentDisplay = display;
62 m_refCurrentNativeWindow = m_refTargetNativeWindow;
63 m_currentSurfaceFlags = surfaceFlags;
66std::optional<QSize> QOhosEGLSurface::currentSurfaceSize()
const
68 if (m_refCurrentDisplay == EGL_NO_DISPLAY || m_ownEglSurface == EGL_NO_SURFACE)
72 if (eglQuerySurface(m_refCurrentDisplay, m_ownEglSurface, EGL_WIDTH, &width) != EGL_TRUE) {
73 qOhosPrintfWarning(
"%s - cannot get surface width, error: %d", Q_FUNC_INFO, eglGetError());
78 if (eglQuerySurface(m_refCurrentDisplay, m_ownEglSurface, EGL_HEIGHT, &height) != EGL_TRUE) {
79 qOhosPrintfWarning(
"%s - cannot get surface height, error: %d", Q_FUNC_INFO, eglGetError());
83 return QSize(width, height);
86EGLSurface QOhosEGLSurface::tryGetOrCreateEGLWindowSurface(
87 EGLDisplay display, EGLConfig config,
bool swappingBuffers, SurfaceFlags surfaceFlags)
90 return m_ownEglSurface;
92 bool needsRebuild = m_ownEglSurface == EGL_NO_SURFACE
93 || m_refCurrentNativeWindow != m_refTargetNativeWindow
94 || m_refCurrentDisplay != display
95 || m_refCurrentConfig != config
96 || m_currentSurfaceFlags != surfaceFlags
97 || (m_targetSurfaceSize.has_value() && m_targetSurfaceSize != currentSurfaceSize());
100 return m_ownEglSurface;
103 tryCreateSurface(display, config, surfaceFlags);
105 return m_ownEglSurface;
108void QOhosEGLSurface::cleanup()
110 if (m_refCurrentDisplay != EGL_NO_DISPLAY
111 && eglMakeCurrent(m_refCurrentDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT) == EGL_FALSE) {
113 "%s: failed to unbind context from the current rendering thread, error: %d", Q_FUNC_INFO,
117 if (m_ownEglSurface != EGL_NO_SURFACE && eglDestroySurface(m_refCurrentDisplay, m_ownEglSurface) == EGL_FALSE)
118 qOhosPrintfDebug(
"Failed to destroy surface");
120 m_refCurrentDisplay = EGL_NO_DISPLAY;
121 m_refCurrentConfig =
nullptr;
122 m_refCurrentNativeWindow =
nullptr;
123 m_ownEglSurface = EGL_NO_SURFACE;
124 m_currentSurfaceFlags = {};
125 m_targetSurfaceSize = {};
128QOhosEGLSurface::~QOhosEGLSurface()
133QOhosEGLSurface::SurfaceFlags QOhosEGLSurface::currentSurfaceFlags()
const
135 return m_currentSurfaceFlags;
Combined button and popup list for selecting options.