Changeset View
Changeset View
Standalone View
Standalone View
plugins/qpa/abstractplatformcontext.cpp
Show First 20 Lines • Show All 140 Lines • ▼ Show 20 Line(s) | |||||
141 | } | 141 | } | ||
142 | 142 | | |||
143 | void AbstractPlatformContext::createContext(EGLContext shareContext) | 143 | void AbstractPlatformContext::createContext(EGLContext shareContext) | ||
144 | { | 144 | { | ||
145 | const QByteArray eglExtensions = eglQueryString(eglDisplay(), EGL_EXTENSIONS); | 145 | const QByteArray eglExtensions = eglQueryString(eglDisplay(), EGL_EXTENSIONS); | ||
146 | const QList<QByteArray> extensions = eglExtensions.split(' '); | 146 | const QList<QByteArray> extensions = eglExtensions.split(' '); | ||
147 | const bool haveRobustness = extensions.contains(QByteArrayLiteral("EGL_EXT_create_context_robustness")); | 147 | const bool haveRobustness = extensions.contains(QByteArrayLiteral("EGL_EXT_create_context_robustness")); | ||
148 | const bool haveCreateContext = extensions.contains(QByteArrayLiteral("EGL_KHR_create_context")); | 148 | const bool haveCreateContext = extensions.contains(QByteArrayLiteral("EGL_KHR_create_context")); | ||
149 | const bool haveContextPriority = extensions.contains(QByteArrayLiteral("EGL_IMG_context_priority")); | ||||
149 | 150 | | |||
150 | std::vector<std::unique_ptr<AbstractOpenGLContextAttributeBuilder>> candidates; | 151 | std::vector<std::unique_ptr<AbstractOpenGLContextAttributeBuilder>> candidates; | ||
151 | if (isOpenGLES()) { | 152 | if (isOpenGLES()) { | ||
153 | if (haveCreateContext && haveRobustness && haveContextPriority) { | ||||
154 | auto glesRobustPriority = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglOpenGLESContextAttributeBuilder); | ||||
155 | glesRobustPriority->setVersion(2); | ||||
156 | glesRobustPriority->setRobust(true); | ||||
157 | glesRobustPriority->setHighPriority(true); | ||||
158 | candidates.push_back(std::move(glesRobustPriority)); | ||||
159 | } | ||||
152 | if (haveCreateContext && haveRobustness) { | 160 | if (haveCreateContext && haveRobustness) { | ||
153 | auto glesRobust = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglOpenGLESContextAttributeBuilder); | 161 | auto glesRobust = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglOpenGLESContextAttributeBuilder); | ||
154 | glesRobust->setVersion(2); | 162 | glesRobust->setVersion(2); | ||
155 | glesRobust->setRobust(true); | 163 | glesRobust->setRobust(true); | ||
156 | candidates.push_back(std::move(glesRobust)); | 164 | candidates.push_back(std::move(glesRobust)); | ||
157 | } | 165 | } | ||
166 | if (haveContextPriority) { | ||||
167 | auto glesPriority = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglOpenGLESContextAttributeBuilder); | ||||
168 | glesPriority->setVersion(2); | ||||
169 | glesPriority->setHighPriority(true); | ||||
170 | candidates.push_back(std::move(glesPriority)); | ||||
171 | } | ||||
158 | auto gles = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglOpenGLESContextAttributeBuilder); | 172 | auto gles = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglOpenGLESContextAttributeBuilder); | ||
159 | gles->setVersion(2); | 173 | gles->setVersion(2); | ||
160 | candidates.push_back(std::move(gles)); | 174 | candidates.push_back(std::move(gles)); | ||
161 | } else { | 175 | } else { | ||
162 | // Try to create a 3.1 core context | 176 | // Try to create a 3.1 core context | ||
163 | if (m_format.majorVersion() >= 3 && haveCreateContext) { | 177 | if (m_format.majorVersion() >= 3 && haveCreateContext) { | ||
178 | if (haveRobustness && haveContextPriority) { | ||||
179 | auto robustCorePriority = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglContextAttributeBuilder); | ||||
180 | robustCorePriority->setVersion(m_format.majorVersion(), m_format.minorVersion()); | ||||
181 | robustCorePriority->setRobust(true); | ||||
182 | robustCorePriority->setForwardCompatible(true); | ||||
183 | if (m_format.profile() == QSurfaceFormat::CoreProfile) { | ||||
184 | robustCorePriority->setCoreProfile(true); | ||||
185 | } else if (m_format.profile() == QSurfaceFormat::CompatibilityProfile) { | ||||
186 | robustCorePriority->setCompatibilityProfile(true); | ||||
187 | } | ||||
188 | robustCorePriority->setHighPriority(true); | ||||
189 | candidates.push_back(std::move(robustCorePriority)); | ||||
190 | } | ||||
164 | if (haveRobustness) { | 191 | if (haveRobustness) { | ||
165 | auto robustCore = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglContextAttributeBuilder); | 192 | auto robustCore = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglContextAttributeBuilder); | ||
166 | robustCore->setVersion(m_format.majorVersion(), m_format.minorVersion()); | 193 | robustCore->setVersion(m_format.majorVersion(), m_format.minorVersion()); | ||
167 | robustCore->setRobust(true); | 194 | robustCore->setRobust(true); | ||
168 | robustCore->setForwardCompatible(true); | 195 | robustCore->setForwardCompatible(true); | ||
169 | if (m_format.profile() == QSurfaceFormat::CoreProfile) { | 196 | if (m_format.profile() == QSurfaceFormat::CoreProfile) { | ||
170 | robustCore->setCoreProfile(true); | 197 | robustCore->setCoreProfile(true); | ||
171 | } else if (m_format.profile() == QSurfaceFormat::CompatibilityProfile) { | 198 | } else if (m_format.profile() == QSurfaceFormat::CompatibilityProfile) { | ||
172 | robustCore->setCompatibilityProfile(true); | 199 | robustCore->setCompatibilityProfile(true); | ||
173 | } | 200 | } | ||
174 | candidates.push_back(std::move(robustCore)); | 201 | candidates.push_back(std::move(robustCore)); | ||
175 | } | 202 | } | ||
203 | if (haveContextPriority) { | ||||
204 | auto corePriority = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglContextAttributeBuilder); | ||||
205 | corePriority->setVersion(m_format.majorVersion(), m_format.minorVersion()); | ||||
206 | corePriority->setForwardCompatible(true); | ||||
207 | if (m_format.profile() == QSurfaceFormat::CoreProfile) { | ||||
208 | corePriority->setCoreProfile(true); | ||||
209 | } else if (m_format.profile() == QSurfaceFormat::CompatibilityProfile) { | ||||
210 | corePriority->setCompatibilityProfile(true); | ||||
211 | } | ||||
212 | corePriority->setHighPriority(true); | ||||
213 | candidates.push_back(std::move(corePriority)); | ||||
214 | } | ||||
176 | auto core = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglContextAttributeBuilder); | 215 | auto core = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglContextAttributeBuilder); | ||
177 | core->setVersion(m_format.majorVersion(), m_format.minorVersion()); | 216 | core->setVersion(m_format.majorVersion(), m_format.minorVersion()); | ||
178 | core->setForwardCompatible(true); | 217 | core->setForwardCompatible(true); | ||
179 | if (m_format.profile() == QSurfaceFormat::CoreProfile) { | 218 | if (m_format.profile() == QSurfaceFormat::CoreProfile) { | ||
180 | core->setCoreProfile(true); | 219 | core->setCoreProfile(true); | ||
181 | } else if (m_format.profile() == QSurfaceFormat::CompatibilityProfile) { | 220 | } else if (m_format.profile() == QSurfaceFormat::CompatibilityProfile) { | ||
182 | core->setCompatibilityProfile(true); | 221 | core->setCompatibilityProfile(true); | ||
183 | } | 222 | } | ||
184 | candidates.push_back(std::move(core)); | 223 | candidates.push_back(std::move(core)); | ||
185 | } | 224 | } | ||
186 | 225 | if (haveRobustness && haveCreateContext && haveContextPriority) { | |||
226 | auto robustPriority = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglContextAttributeBuilder); | ||||
227 | robustPriority->setRobust(true); | ||||
228 | robustPriority->setHighPriority(true); | ||||
229 | candidates.push_back(std::move(robustPriority)); | ||||
230 | } | ||||
187 | if (haveRobustness && haveCreateContext) { | 231 | if (haveRobustness && haveCreateContext) { | ||
188 | auto robust = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglContextAttributeBuilder); | 232 | auto robust = std::unique_ptr<AbstractOpenGLContextAttributeBuilder>(new EglContextAttributeBuilder); | ||
189 | robust->setRobust(true); | 233 | robust->setRobust(true); | ||
190 | candidates.push_back(std::move(robust)); | 234 | candidates.push_back(std::move(robust)); | ||
191 | } | 235 | } | ||
192 | candidates.emplace_back(new EglContextAttributeBuilder); | 236 | candidates.emplace_back(new EglContextAttributeBuilder); | ||
193 | } | 237 | } | ||
194 | 238 | | |||
Show All 19 Lines |