212 QOpenGLContext *ctx = QOpenGLContext::currentContext();
213 QOpenGLExtensionMatcher extensions;
215 if ((extensions.match(
"GL_KHR_blend_equation_advanced")
216 || extensions.match(
"GL_NV_blend_equation_advanced")) &&
217 (extensions.match(
"GL_KHR_blend_equation_advanced_coherent")
218 || extensions.match(
"GL_NV_blend_equation_advanced_coherent"))) {
221 features |= QOpenGLFunctions::BlendEquationAdvanced;
223 if (ctx->isOpenGLES()) {
225 features |= QOpenGLFunctions::Multitexture |
226 QOpenGLFunctions::Shaders |
227 QOpenGLFunctions::Buffers |
228 QOpenGLFunctions::Framebuffers |
229 QOpenGLFunctions::BlendColor |
230 QOpenGLFunctions::BlendEquation |
231 QOpenGLFunctions::BlendEquationSeparate |
232 QOpenGLFunctions::BlendFuncSeparate |
233 QOpenGLFunctions::BlendSubtract |
234 QOpenGLFunctions::CompressedTextures |
235 QOpenGLFunctions::Multisample |
236 QOpenGLFunctions::StencilSeparate;
238 if (ctx->format().majorVersion() >= 3) {
239 features |= QOpenGLFunctions::NPOTTextures |
240 QOpenGLFunctions::NPOTTextureRepeat;
242 if (extensions.match(
"GL_IMG_texture_npot"))
243 features |= QOpenGLFunctions::NPOTTextures;
244 if (extensions.match(
"GL_OES_texture_npot"))
245 features |= QOpenGLFunctions::NPOTTextures |
246 QOpenGLFunctions::NPOTTextureRepeat;
248 if (ctx->format().majorVersion() >= 3 || extensions.match(
"GL_EXT_texture_rg"))
249 features |= QOpenGLFunctions::TextureRGFormats;
250 if (ctx->format().majorVersion() >= 3) {
251 features |= QOpenGLFunctions::MultipleRenderTargets;
252 if (ctx->format().minorVersion() >= 2 && extensions.match(
"GL_KHR_blend_equation_advanced_coherent")) {
254 features |= QOpenGLFunctions::BlendEquationAdvanced;
260 features |= QOpenGLFunctions::TextureRGFormats;
261 QSurfaceFormat format = QOpenGLContext::currentContext()->format();
263 if (format.majorVersion() >= 3)
264 features |= QOpenGLFunctions::Framebuffers | QOpenGLFunctions::MultipleRenderTargets;
265 else if (extensions.match(
"GL_EXT_framebuffer_object") || extensions.match(
"GL_ARB_framebuffer_object"))
266 features |= QOpenGLFunctions::Framebuffers | QOpenGLFunctions::MultipleRenderTargets;
268 if (format.majorVersion() >= 2) {
269 features |= QOpenGLFunctions::BlendColor |
270 QOpenGLFunctions::BlendEquation |
271 QOpenGLFunctions::BlendSubtract |
272 QOpenGLFunctions::Multitexture |
273 QOpenGLFunctions::CompressedTextures |
274 QOpenGLFunctions::Multisample |
275 QOpenGLFunctions::BlendFuncSeparate |
276 QOpenGLFunctions::Buffers |
277 QOpenGLFunctions::Shaders |
278 QOpenGLFunctions::StencilSeparate |
279 QOpenGLFunctions::BlendEquationSeparate |
280 QOpenGLFunctions::NPOTTextures |
281 QOpenGLFunctions::NPOTTextureRepeat;
284 if (extensions.match(
"GL_ARB_multitexture"))
285 features |= QOpenGLFunctions::Multitexture;
286 if (extensions.match(
"GL_ARB_shader_objects"))
287 features |= QOpenGLFunctions::Shaders;
288 if (extensions.match(
"GL_EXT_blend_color"))
289 features |= QOpenGLFunctions::BlendColor;
290 if (extensions.match(
"GL_EXT_blend_equation_separate"))
291 features |= QOpenGLFunctions::BlendEquationSeparate;
292 if (extensions.match(
"GL_EXT_blend_subtract"))
293 features |= QOpenGLFunctions::BlendSubtract;
294 if (extensions.match(
"GL_EXT_blend_func_separate"))
295 features |= QOpenGLFunctions::BlendFuncSeparate;
296 if (extensions.match(
"GL_ARB_texture_compression"))
297 features |= QOpenGLFunctions::CompressedTextures;
298 if (extensions.match(
"GL_ARB_multisample"))
299 features |= QOpenGLFunctions::Multisample;
300 if (extensions.match(
"GL_ARB_texture_non_power_of_two"))
301 features |= QOpenGLFunctions::NPOTTextures |
302 QOpenGLFunctions::NPOTTextureRepeat;
305 const std::pair<
int,
int> version = format.version();
306 if (version < std::pair(3, 0)
307 || (version == std::pair(3, 0) && format.testOption(QSurfaceFormat::DeprecatedFunctions))
308 || (version == std::pair(3, 1) && extensions.match(
"GL_ARB_compatibility"))
309 || (version >= std::pair(3, 2) && format.profile() == QSurfaceFormat::CompatibilityProfile)) {
310 features |= QOpenGLFunctions::FixedFunctionPipeline;
319 QOpenGLExtensionMatcher extensionMatcher;
320 QOpenGLContext *ctx = QOpenGLContext::currentContext();
321 QSurfaceFormat format = ctx->format();
323 if (extensionMatcher.match(
"GL_EXT_bgra"))
324 extensions |= QOpenGLExtensions::BGRATextureFormat;
325 if (extensionMatcher.match(
"GL_ARB_texture_rectangle"))
326 extensions |= QOpenGLExtensions::TextureRectangle;
327 if (extensionMatcher.match(
"GL_ARB_texture_compression"))
328 extensions |= QOpenGLExtensions::TextureCompression;
329 if (extensionMatcher.match(
"GL_EXT_texture_compression_s3tc"))
330 extensions |= QOpenGLExtensions::DDSTextureCompression;
331 if (extensionMatcher.match(
"GL_OES_compressed_ETC1_RGB8_texture"))
332 extensions |= QOpenGLExtensions::ETC1TextureCompression;
333 if (extensionMatcher.match(
"GL_IMG_texture_compression_pvrtc"))
334 extensions |= QOpenGLExtensions::PVRTCTextureCompression;
335 if (extensionMatcher.match(
"GL_KHR_texture_compression_astc_ldr"))
336 extensions |= QOpenGLExtensions::ASTCTextureCompression;
337 if (extensionMatcher.match(
"GL_ARB_texture_mirrored_repeat"))
338 extensions |= QOpenGLExtensions::MirroredRepeat;
339 if (extensionMatcher.match(
"GL_EXT_stencil_two_side"))
340 extensions |= QOpenGLExtensions::StencilTwoSide;
341 if (extensionMatcher.match(
"GL_EXT_stencil_wrap"))
342 extensions |= QOpenGLExtensions::StencilWrap;
343 if (extensionMatcher.match(
"GL_NV_float_buffer"))
344 extensions |= QOpenGLExtensions::NVFloatBuffer;
345 if (extensionMatcher.match(
"GL_ARB_pixel_buffer_object"))
346 extensions |= QOpenGLExtensions::PixelBufferObject;
347 if (extensionMatcher.match(
"GL_ARB_texture_swizzle") || extensionMatcher.match(
"GL_EXT_texture_swizzle"))
348 extensions |= QOpenGLExtensions::TextureSwizzle;
349 if (extensionMatcher.match(
"GL_OES_standard_derivatives"))
350 extensions |= QOpenGLExtensions::StandardDerivatives;
351 if (extensionMatcher.match(
"GL_ARB_half_float_vertex"))
352 extensions |= QOpenGLExtensions::HalfFloatVertex;
353 if (extensionMatcher.match(
"GL_OVR_multiview"))
354 extensions |= QOpenGLExtensions::MultiView;
355 if (extensionMatcher.match(
"GL_OVR_multiview2"))
356 extensions |= QOpenGLExtensions::MultiViewExtended;
358 if (ctx->isOpenGLES()) {
359 if (format.majorVersion() >= 2)
360 extensions |= QOpenGLExtensions::GenerateMipmap;
362 if (format.majorVersion() >= 3) {
363 extensions |= QOpenGLExtensions::PackedDepthStencil
364 | QOpenGLExtensions::Depth24
365 | QOpenGLExtensions::ElementIndexUint
366 | QOpenGLExtensions::MapBufferRange
367 | QOpenGLExtensions::FramebufferBlit
368 | QOpenGLExtensions::FramebufferMultisample
369 | QOpenGLExtensions::Sized8Formats
370 | QOpenGLExtensions::DiscardFramebuffer
371 | QOpenGLExtensions::StandardDerivatives
372 | QOpenGLExtensions::ETC2TextureCompression
373 | QOpenGLExtensions::HalfFloatVertex;
377 extensions |= QOpenGLExtensions::TextureSwizzle;
381 if (extensionMatcher.match(
"GL_OES_packed_depth_stencil"))
382 extensions |= QOpenGLExtensions::PackedDepthStencil;
383 if (extensionMatcher.match(
"GL_OES_depth24"))
384 extensions |= QOpenGLExtensions::Depth24;
385 if (extensionMatcher.match(
"GL_ANGLE_framebuffer_blit"))
386 extensions |= QOpenGLExtensions::FramebufferBlit;
387 if (extensionMatcher.match(
"GL_ANGLE_framebuffer_multisample"))
388 extensions |= QOpenGLExtensions::FramebufferMultisample;
389 if (extensionMatcher.match(
"GL_NV_framebuffer_blit"))
390 extensions |= QOpenGLExtensions::FramebufferBlit;
391 if (extensionMatcher.match(
"GL_NV_framebuffer_multisample"))
392 extensions |= QOpenGLExtensions::FramebufferMultisample;
393 if (extensionMatcher.match(
"GL_OES_rgb8_rgba8"))
394 extensions |= QOpenGLExtensions::Sized8Formats;
395 if (extensionMatcher.match(
"GL_OES_compressed_ETC2_RGB8_texture"))
396 extensions |= QOpenGLExtensions::ETC2TextureCompression;
399 if (extensionMatcher.match(
"GL_OES_mapbuffer"))
400 extensions |= QOpenGLExtensions::MapBuffer;
401 if (extensionMatcher.match(
"GL_OES_element_index_uint"))
402 extensions |= QOpenGLExtensions::ElementIndexUint;
404 if (extensionMatcher.match(
"GL_IMG_texture_format_BGRA8888") || extensionMatcher.match(
"GL_EXT_texture_format_BGRA8888"))
405 extensions |= QOpenGLExtensions::BGRATextureFormat;
407 QString *deviceName =
408 static_cast<QString *>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration(
"AndroidDeviceName"));
409 static bool wrongfullyReportsBgra8888Support = deviceName != 0
410 && (deviceName->compare(
"samsung SM-T211"_L1, Qt::CaseInsensitive) == 0
411 || deviceName->compare(
"samsung SM-T210"_L1, Qt::CaseInsensitive) == 0
412 || deviceName->compare(
"samsung SM-T215"_L1, Qt::CaseInsensitive) == 0);
413 if (wrongfullyReportsBgra8888Support)
414 extensions &= ~QOpenGLExtensions::BGRATextureFormat;
417 if (extensionMatcher.match(
"GL_EXT_discard_framebuffer"))
418 extensions |= QOpenGLExtensions::DiscardFramebuffer;
419 if (extensionMatcher.match(
"GL_EXT_texture_norm16"))
420 extensions |= QOpenGLExtensions::Sized16Formats;
422 extensions |= QOpenGLExtensions::ElementIndexUint
423 | QOpenGLExtensions::MapBuffer
424 | QOpenGLExtensions::Sized16Formats;
426 if (format.version() >= std::pair(1, 2))
427 extensions |= QOpenGLExtensions::BGRATextureFormat;
429 if (format.version() >= std::pair(1, 4) || extensionMatcher.match(
"GL_SGIS_generate_mipmap"))
430 extensions |= QOpenGLExtensions::GenerateMipmap;
432 if (format.majorVersion() >= 2)
433 extensions |= QOpenGLExtensions::StandardDerivatives;
435 if (format.majorVersion() >= 3 || extensionMatcher.match(
"GL_ARB_framebuffer_object")) {
436 extensions |= QOpenGLExtensions::FramebufferMultisample
437 | QOpenGLExtensions::FramebufferBlit
438 | QOpenGLExtensions::PackedDepthStencil
439 | QOpenGLExtensions::Sized8Formats;
442 if (extensionMatcher.match(
"GL_EXT_framebuffer_multisample"))
443 extensions |= QOpenGLExtensions::FramebufferMultisample;
444 if (extensionMatcher.match(
"GL_EXT_framebuffer_blit"))
445 extensions |= QOpenGLExtensions::FramebufferBlit;
446 if (extensionMatcher.match(
"GL_EXT_packed_depth_stencil"))
447 extensions |= QOpenGLExtensions::PackedDepthStencil;
450 if (format.version() >= std::pair(3, 2) || extensionMatcher.match(
"GL_ARB_geometry_shader4"))
451 extensions |= QOpenGLExtensions::GeometryShaders;
453 if (format.version() >= std::pair(3, 3))
454 extensions |= QOpenGLExtensions::TextureSwizzle;
456 if (format.version() >= std::pair(4, 3) || extensionMatcher.match(
"GL_ARB_invalidate_subdata"))
457 extensions |= QOpenGLExtensions::DiscardFramebuffer;
459 if (extensionMatcher.match(
"GL_ARB_map_buffer_range"))
460 extensions |= QOpenGLExtensions::MapBufferRange;
462 if (extensionMatcher.match(
"GL_EXT_framebuffer_sRGB")) {
463 GLboolean srgbCapableFramebuffers =
false;
465 if (srgbCapableFramebuffers)
466 extensions |= QOpenGLExtensions::SRGBFrameBuffer;
469 if (extensionMatcher.match(
"GL_ARB_ES3_compatibility"))
470 extensions |= QOpenGLExtensions::ETC2TextureCompression;