245 QOpenGLContext *ctx = QOpenGLContext::currentContext();
246 QOpenGLExtensionMatcher extensions;
248 if ((extensions.match(
"GL_KHR_blend_equation_advanced")
249 || extensions.match(
"GL_NV_blend_equation_advanced")) &&
250 (extensions.match(
"GL_KHR_blend_equation_advanced_coherent")
251 || extensions.match(
"GL_NV_blend_equation_advanced_coherent"))) {
254 features |= QOpenGLFunctions::BlendEquationAdvanced;
256 if (ctx->isOpenGLES()) {
258 features |= QOpenGLFunctions::Multitexture |
259 QOpenGLFunctions::Shaders |
260 QOpenGLFunctions::Buffers |
261 QOpenGLFunctions::Framebuffers |
262 QOpenGLFunctions::BlendColor |
263 QOpenGLFunctions::BlendEquation |
264 QOpenGLFunctions::BlendEquationSeparate |
265 QOpenGLFunctions::BlendFuncSeparate |
266 QOpenGLFunctions::BlendSubtract |
267 QOpenGLFunctions::CompressedTextures |
268 QOpenGLFunctions::Multisample |
269 QOpenGLFunctions::StencilSeparate;
271 if (ctx->format().majorVersion() >= 3) {
272 features |= QOpenGLFunctions::NPOTTextures |
273 QOpenGLFunctions::NPOTTextureRepeat;
275 if (extensions.match(
"GL_IMG_texture_npot"))
276 features |= QOpenGLFunctions::NPOTTextures;
277 if (extensions.match(
"GL_OES_texture_npot"))
278 features |= QOpenGLFunctions::NPOTTextures |
279 QOpenGLFunctions::NPOTTextureRepeat;
281 if (ctx->format().majorVersion() >= 3 || extensions.match(
"GL_EXT_texture_rg"))
282 features |= QOpenGLFunctions::TextureRGFormats;
283 if (ctx->format().majorVersion() >= 3) {
284 features |= QOpenGLFunctions::MultipleRenderTargets;
285 if (ctx->format().minorVersion() >= 2 && extensions.match(
"GL_KHR_blend_equation_advanced_coherent")) {
287 features |= QOpenGLFunctions::BlendEquationAdvanced;
293 features |= QOpenGLFunctions::TextureRGFormats;
294 QSurfaceFormat format = QOpenGLContext::currentContext()->format();
296 if (format.majorVersion() >= 3)
297 features |= QOpenGLFunctions::Framebuffers | QOpenGLFunctions::MultipleRenderTargets;
298 else if (extensions.match(
"GL_EXT_framebuffer_object") || extensions.match(
"GL_ARB_framebuffer_object"))
299 features |= QOpenGLFunctions::Framebuffers | QOpenGLFunctions::MultipleRenderTargets;
301 if (format.majorVersion() >= 2) {
302 features |= QOpenGLFunctions::BlendColor |
303 QOpenGLFunctions::BlendEquation |
304 QOpenGLFunctions::BlendSubtract |
305 QOpenGLFunctions::Multitexture |
306 QOpenGLFunctions::CompressedTextures |
307 QOpenGLFunctions::Multisample |
308 QOpenGLFunctions::BlendFuncSeparate |
309 QOpenGLFunctions::Buffers |
310 QOpenGLFunctions::Shaders |
311 QOpenGLFunctions::StencilSeparate |
312 QOpenGLFunctions::BlendEquationSeparate |
313 QOpenGLFunctions::NPOTTextures |
314 QOpenGLFunctions::NPOTTextureRepeat;
317 if (extensions.match(
"GL_ARB_multitexture"))
318 features |= QOpenGLFunctions::Multitexture;
319 if (extensions.match(
"GL_ARB_shader_objects"))
320 features |= QOpenGLFunctions::Shaders;
321 if (extensions.match(
"GL_EXT_blend_color"))
322 features |= QOpenGLFunctions::BlendColor;
323 if (extensions.match(
"GL_EXT_blend_equation_separate"))
324 features |= QOpenGLFunctions::BlendEquationSeparate;
325 if (extensions.match(
"GL_EXT_blend_subtract"))
326 features |= QOpenGLFunctions::BlendSubtract;
327 if (extensions.match(
"GL_EXT_blend_func_separate"))
328 features |= QOpenGLFunctions::BlendFuncSeparate;
329 if (extensions.match(
"GL_ARB_texture_compression"))
330 features |= QOpenGLFunctions::CompressedTextures;
331 if (extensions.match(
"GL_ARB_multisample"))
332 features |= QOpenGLFunctions::Multisample;
333 if (extensions.match(
"GL_ARB_texture_non_power_of_two"))
334 features |= QOpenGLFunctions::NPOTTextures |
335 QOpenGLFunctions::NPOTTextureRepeat;
338 const std::pair<
int,
int> version = format.version();
339 if (version < std::pair(3, 0)
340 || (version == std::pair(3, 0) && format.testOption(QSurfaceFormat::DeprecatedFunctions))
341 || (version == std::pair(3, 1) && extensions.match(
"GL_ARB_compatibility"))
342 || (version >= std::pair(3, 2) && format.profile() == QSurfaceFormat::CompatibilityProfile)) {
343 features |= QOpenGLFunctions::FixedFunctionPipeline;
352 QOpenGLExtensionMatcher extensionMatcher;
353 QOpenGLContext *ctx = QOpenGLContext::currentContext();
354 QSurfaceFormat format = ctx->format();
356 if (extensionMatcher.match(
"GL_EXT_bgra"))
357 extensions |= QOpenGLExtensions::BGRATextureFormat;
358 if (extensionMatcher.match(
"GL_ARB_texture_rectangle"))
359 extensions |= QOpenGLExtensions::TextureRectangle;
360 if (extensionMatcher.match(
"GL_ARB_texture_compression"))
361 extensions |= QOpenGLExtensions::TextureCompression;
362 if (extensionMatcher.match(
"GL_EXT_texture_compression_s3tc"))
363 extensions |= QOpenGLExtensions::DDSTextureCompression;
364 if (extensionMatcher.match(
"GL_OES_compressed_ETC1_RGB8_texture"))
365 extensions |= QOpenGLExtensions::ETC1TextureCompression;
366 if (extensionMatcher.match(
"GL_IMG_texture_compression_pvrtc"))
367 extensions |= QOpenGLExtensions::PVRTCTextureCompression;
368 if (extensionMatcher.match(
"GL_KHR_texture_compression_astc_ldr"))
369 extensions |= QOpenGLExtensions::ASTCTextureCompression;
370 if (extensionMatcher.match(
"GL_ARB_texture_mirrored_repeat"))
371 extensions |= QOpenGLExtensions::MirroredRepeat;
372 if (extensionMatcher.match(
"GL_EXT_stencil_two_side"))
373 extensions |= QOpenGLExtensions::StencilTwoSide;
374 if (extensionMatcher.match(
"GL_EXT_stencil_wrap"))
375 extensions |= QOpenGLExtensions::StencilWrap;
376 if (extensionMatcher.match(
"GL_NV_float_buffer"))
377 extensions |= QOpenGLExtensions::NVFloatBuffer;
378 if (extensionMatcher.match(
"GL_ARB_pixel_buffer_object"))
379 extensions |= QOpenGLExtensions::PixelBufferObject;
380 if (extensionMatcher.match(
"GL_ARB_texture_swizzle") || extensionMatcher.match(
"GL_EXT_texture_swizzle"))
381 extensions |= QOpenGLExtensions::TextureSwizzle;
382 if (extensionMatcher.match(
"GL_OES_standard_derivatives"))
383 extensions |= QOpenGLExtensions::StandardDerivatives;
384 if (extensionMatcher.match(
"GL_ARB_half_float_vertex"))
385 extensions |= QOpenGLExtensions::HalfFloatVertex;
386 if (extensionMatcher.match(
"GL_OVR_multiview"))
387 extensions |= QOpenGLExtensions::MultiView;
388 if (extensionMatcher.match(
"GL_OVR_multiview2"))
389 extensions |= QOpenGLExtensions::MultiViewExtended;
391 if (ctx->isOpenGLES()) {
392 if (format.majorVersion() >= 2)
393 extensions |= QOpenGLExtensions::GenerateMipmap;
395 if (format.majorVersion() >= 3) {
396 extensions |= QOpenGLExtensions::PackedDepthStencil
397 | QOpenGLExtensions::Depth24
398 | QOpenGLExtensions::ElementIndexUint
399 | QOpenGLExtensions::MapBufferRange
400 | QOpenGLExtensions::FramebufferBlit
401 | QOpenGLExtensions::FramebufferMultisample
402 | QOpenGLExtensions::Sized8Formats
403 | QOpenGLExtensions::DiscardFramebuffer
404 | QOpenGLExtensions::StandardDerivatives
405 | QOpenGLExtensions::ETC2TextureCompression
406 | QOpenGLExtensions::HalfFloatVertex;
410 extensions |= QOpenGLExtensions::TextureSwizzle;
414 if (extensionMatcher.match(
"GL_OES_packed_depth_stencil"))
415 extensions |= QOpenGLExtensions::PackedDepthStencil;
416 if (extensionMatcher.match(
"GL_OES_depth24"))
417 extensions |= QOpenGLExtensions::Depth24;
418 if (extensionMatcher.match(
"GL_ANGLE_framebuffer_blit"))
419 extensions |= QOpenGLExtensions::FramebufferBlit;
420 if (extensionMatcher.match(
"GL_ANGLE_framebuffer_multisample"))
421 extensions |= QOpenGLExtensions::FramebufferMultisample;
422 if (extensionMatcher.match(
"GL_NV_framebuffer_blit"))
423 extensions |= QOpenGLExtensions::FramebufferBlit;
424 if (extensionMatcher.match(
"GL_NV_framebuffer_multisample"))
425 extensions |= QOpenGLExtensions::FramebufferMultisample;
426 if (extensionMatcher.match(
"GL_OES_rgb8_rgba8"))
427 extensions |= QOpenGLExtensions::Sized8Formats;
428 if (extensionMatcher.match(
"GL_OES_compressed_ETC2_RGB8_texture"))
429 extensions |= QOpenGLExtensions::ETC2TextureCompression;
432 if (extensionMatcher.match(
"GL_OES_mapbuffer"))
433 extensions |= QOpenGLExtensions::MapBuffer;
434 if (extensionMatcher.match(
"GL_OES_element_index_uint"))
435 extensions |= QOpenGLExtensions::ElementIndexUint;
437 if (extensionMatcher.match(
"GL_IMG_texture_format_BGRA8888") || extensionMatcher.match(
"GL_EXT_texture_format_BGRA8888"))
438 extensions |= QOpenGLExtensions::BGRATextureFormat;
440 QString *deviceName =
441 static_cast<QString *>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration(
"AndroidDeviceName"));
442 static bool wrongfullyReportsBgra8888Support = deviceName != 0
443 && (deviceName->compare(
"samsung SM-T211"_L1, Qt::CaseInsensitive) == 0
444 || deviceName->compare(
"samsung SM-T210"_L1, Qt::CaseInsensitive) == 0
445 || deviceName->compare(
"samsung SM-T215"_L1, Qt::CaseInsensitive) == 0);
446 if (wrongfullyReportsBgra8888Support)
447 extensions &= ~QOpenGLExtensions::BGRATextureFormat;
450 if (extensionMatcher.match(
"GL_EXT_discard_framebuffer"))
451 extensions |= QOpenGLExtensions::DiscardFramebuffer;
452 if (extensionMatcher.match(
"GL_EXT_texture_norm16"))
453 extensions |= QOpenGLExtensions::Sized16Formats;
455 extensions |= QOpenGLExtensions::ElementIndexUint
456 | QOpenGLExtensions::MapBuffer
457 | QOpenGLExtensions::Sized16Formats;
459 if (format.version() >= std::pair(1, 2))
460 extensions |= QOpenGLExtensions::BGRATextureFormat;
462 if (format.version() >= std::pair(1, 4) || extensionMatcher.match(
"GL_SGIS_generate_mipmap"))
463 extensions |= QOpenGLExtensions::GenerateMipmap;
465 if (format.majorVersion() >= 2)
466 extensions |= QOpenGLExtensions::StandardDerivatives;
468 if (format.majorVersion() >= 3 || extensionMatcher.match(
"GL_ARB_framebuffer_object")) {
469 extensions |= QOpenGLExtensions::FramebufferMultisample
470 | QOpenGLExtensions::FramebufferBlit
471 | QOpenGLExtensions::PackedDepthStencil
472 | QOpenGLExtensions::Sized8Formats;
475 if (extensionMatcher.match(
"GL_EXT_framebuffer_multisample"))
476 extensions |= QOpenGLExtensions::FramebufferMultisample;
477 if (extensionMatcher.match(
"GL_EXT_framebuffer_blit"))
478 extensions |= QOpenGLExtensions::FramebufferBlit;
479 if (extensionMatcher.match(
"GL_EXT_packed_depth_stencil"))
480 extensions |= QOpenGLExtensions::PackedDepthStencil;
483 if (format.version() >= std::pair(3, 2) || extensionMatcher.match(
"GL_ARB_geometry_shader4"))
484 extensions |= QOpenGLExtensions::GeometryShaders;
486 if (format.version() >= std::pair(3, 3))
487 extensions |= QOpenGLExtensions::TextureSwizzle;
489 if (format.version() >= std::pair(4, 3) || extensionMatcher.match(
"GL_ARB_invalidate_subdata"))
490 extensions |= QOpenGLExtensions::DiscardFramebuffer;
492 if (extensionMatcher.match(
"GL_ARB_map_buffer_range"))
493 extensions |= QOpenGLExtensions::MapBufferRange;
495 if (extensionMatcher.match(
"GL_EXT_framebuffer_sRGB")) {
496 GLboolean srgbCapableFramebuffers =
false;
498 if (srgbCapableFramebuffers)
499 extensions |= QOpenGLExtensions::SRGBFrameBuffer;
502 if (extensionMatcher.match(
"GL_ARB_ES3_compatibility"))
503 extensions |= QOpenGLExtensions::ETC2TextureCompression;