218 QOpenGLContext *ctx = QOpenGLContext::currentContext();
219 QOpenGLExtensionMatcher extensions;
221 if ((extensions.match(
"GL_KHR_blend_equation_advanced")
222 || extensions.match(
"GL_NV_blend_equation_advanced")) &&
223 (extensions.match(
"GL_KHR_blend_equation_advanced_coherent")
224 || extensions.match(
"GL_NV_blend_equation_advanced_coherent"))) {
227 features |= QOpenGLFunctions::BlendEquationAdvanced;
229 if (ctx->isOpenGLES()) {
231 features |= QOpenGLFunctions::Multitexture |
232 QOpenGLFunctions::Shaders |
233 QOpenGLFunctions::Buffers |
234 QOpenGLFunctions::Framebuffers |
235 QOpenGLFunctions::BlendColor |
236 QOpenGLFunctions::BlendEquation |
237 QOpenGLFunctions::BlendEquationSeparate |
238 QOpenGLFunctions::BlendFuncSeparate |
239 QOpenGLFunctions::BlendSubtract |
240 QOpenGLFunctions::CompressedTextures |
241 QOpenGLFunctions::Multisample |
242 QOpenGLFunctions::StencilSeparate;
244 if (ctx->format().majorVersion() >= 3) {
245 features |= QOpenGLFunctions::NPOTTextures |
246 QOpenGLFunctions::NPOTTextureRepeat;
248 if (extensions.match(
"GL_IMG_texture_npot"))
249 features |= QOpenGLFunctions::NPOTTextures;
250 if (extensions.match(
"GL_OES_texture_npot"))
251 features |= QOpenGLFunctions::NPOTTextures |
252 QOpenGLFunctions::NPOTTextureRepeat;
254 if (ctx->format().majorVersion() >= 3 || extensions.match(
"GL_EXT_texture_rg"))
255 features |= QOpenGLFunctions::TextureRGFormats;
256 if (ctx->format().majorVersion() >= 3) {
257 features |= QOpenGLFunctions::MultipleRenderTargets;
258 if (ctx->format().minorVersion() >= 2 && extensions.match(
"GL_KHR_blend_equation_advanced_coherent")) {
260 features |= QOpenGLFunctions::BlendEquationAdvanced;
266 features |= QOpenGLFunctions::TextureRGFormats;
267 QSurfaceFormat format = QOpenGLContext::currentContext()->format();
269 if (format.majorVersion() >= 3)
270 features |= QOpenGLFunctions::Framebuffers | QOpenGLFunctions::MultipleRenderTargets;
271 else if (extensions.match(
"GL_EXT_framebuffer_object") || extensions.match(
"GL_ARB_framebuffer_object"))
272 features |= QOpenGLFunctions::Framebuffers | QOpenGLFunctions::MultipleRenderTargets;
274 if (format.majorVersion() >= 2) {
275 features |= QOpenGLFunctions::BlendColor |
276 QOpenGLFunctions::BlendEquation |
277 QOpenGLFunctions::BlendSubtract |
278 QOpenGLFunctions::Multitexture |
279 QOpenGLFunctions::CompressedTextures |
280 QOpenGLFunctions::Multisample |
281 QOpenGLFunctions::BlendFuncSeparate |
282 QOpenGLFunctions::Buffers |
283 QOpenGLFunctions::Shaders |
284 QOpenGLFunctions::StencilSeparate |
285 QOpenGLFunctions::BlendEquationSeparate |
286 QOpenGLFunctions::NPOTTextures |
287 QOpenGLFunctions::NPOTTextureRepeat;
290 if (extensions.match(
"GL_ARB_multitexture"))
291 features |= QOpenGLFunctions::Multitexture;
292 if (extensions.match(
"GL_ARB_shader_objects"))
293 features |= QOpenGLFunctions::Shaders;
294 if (extensions.match(
"GL_EXT_blend_color"))
295 features |= QOpenGLFunctions::BlendColor;
296 if (extensions.match(
"GL_EXT_blend_equation_separate"))
297 features |= QOpenGLFunctions::BlendEquationSeparate;
298 if (extensions.match(
"GL_EXT_blend_subtract"))
299 features |= QOpenGLFunctions::BlendSubtract;
300 if (extensions.match(
"GL_EXT_blend_func_separate"))
301 features |= QOpenGLFunctions::BlendFuncSeparate;
302 if (extensions.match(
"GL_ARB_texture_compression"))
303 features |= QOpenGLFunctions::CompressedTextures;
304 if (extensions.match(
"GL_ARB_multisample"))
305 features |= QOpenGLFunctions::Multisample;
306 if (extensions.match(
"GL_ARB_texture_non_power_of_two"))
307 features |= QOpenGLFunctions::NPOTTextures |
308 QOpenGLFunctions::NPOTTextureRepeat;
311 const std::pair<
int,
int> version = format.version();
312 if (version < std::pair(3, 0)
313 || (version == std::pair(3, 0) && format.testOption(QSurfaceFormat::DeprecatedFunctions))
314 || (version == std::pair(3, 1) && extensions.match(
"GL_ARB_compatibility"))
315 || (version >= std::pair(3, 2) && format.profile() == QSurfaceFormat::CompatibilityProfile)) {
316 features |= QOpenGLFunctions::FixedFunctionPipeline;
325 QOpenGLExtensionMatcher extensionMatcher;
326 QOpenGLContext *ctx = QOpenGLContext::currentContext();
327 QSurfaceFormat format = ctx->format();
329 if (extensionMatcher.match(
"GL_EXT_bgra"))
330 extensions |= QOpenGLExtensions::BGRATextureFormat;
331 if (extensionMatcher.match(
"GL_ARB_texture_rectangle"))
332 extensions |= QOpenGLExtensions::TextureRectangle;
333 if (extensionMatcher.match(
"GL_ARB_texture_compression"))
334 extensions |= QOpenGLExtensions::TextureCompression;
335 if (extensionMatcher.match(
"GL_EXT_texture_compression_s3tc"))
336 extensions |= QOpenGLExtensions::DDSTextureCompression;
337 if (extensionMatcher.match(
"GL_OES_compressed_ETC1_RGB8_texture"))
338 extensions |= QOpenGLExtensions::ETC1TextureCompression;
339 if (extensionMatcher.match(
"GL_IMG_texture_compression_pvrtc"))
340 extensions |= QOpenGLExtensions::PVRTCTextureCompression;
341 if (extensionMatcher.match(
"GL_KHR_texture_compression_astc_ldr"))
342 extensions |= QOpenGLExtensions::ASTCTextureCompression;
343 if (extensionMatcher.match(
"GL_ARB_texture_mirrored_repeat"))
344 extensions |= QOpenGLExtensions::MirroredRepeat;
345 if (extensionMatcher.match(
"GL_EXT_stencil_two_side"))
346 extensions |= QOpenGLExtensions::StencilTwoSide;
347 if (extensionMatcher.match(
"GL_EXT_stencil_wrap"))
348 extensions |= QOpenGLExtensions::StencilWrap;
349 if (extensionMatcher.match(
"GL_NV_float_buffer"))
350 extensions |= QOpenGLExtensions::NVFloatBuffer;
351 if (extensionMatcher.match(
"GL_ARB_pixel_buffer_object"))
352 extensions |= QOpenGLExtensions::PixelBufferObject;
353 if (extensionMatcher.match(
"GL_ARB_texture_swizzle") || extensionMatcher.match(
"GL_EXT_texture_swizzle"))
354 extensions |= QOpenGLExtensions::TextureSwizzle;
355 if (extensionMatcher.match(
"GL_OES_standard_derivatives"))
356 extensions |= QOpenGLExtensions::StandardDerivatives;
357 if (extensionMatcher.match(
"GL_ARB_half_float_vertex"))
358 extensions |= QOpenGLExtensions::HalfFloatVertex;
359 if (extensionMatcher.match(
"GL_OVR_multiview"))
360 extensions |= QOpenGLExtensions::MultiView;
361 if (extensionMatcher.match(
"GL_OVR_multiview2"))
362 extensions |= QOpenGLExtensions::MultiViewExtended;
364 if (ctx->isOpenGLES()) {
365 if (format.majorVersion() >= 2)
366 extensions |= QOpenGLExtensions::GenerateMipmap;
368 if (format.majorVersion() >= 3) {
369 extensions |= QOpenGLExtensions::PackedDepthStencil
370 | QOpenGLExtensions::Depth24
371 | QOpenGLExtensions::ElementIndexUint
372 | QOpenGLExtensions::MapBufferRange
373 | QOpenGLExtensions::FramebufferBlit
374 | QOpenGLExtensions::FramebufferMultisample
375 | QOpenGLExtensions::Sized8Formats
376 | QOpenGLExtensions::DiscardFramebuffer
377 | QOpenGLExtensions::StandardDerivatives
378 | QOpenGLExtensions::ETC2TextureCompression
379 | QOpenGLExtensions::HalfFloatVertex;
383 extensions |= QOpenGLExtensions::TextureSwizzle;
387 if (extensionMatcher.match(
"GL_OES_packed_depth_stencil"))
388 extensions |= QOpenGLExtensions::PackedDepthStencil;
389 if (extensionMatcher.match(
"GL_OES_depth24"))
390 extensions |= QOpenGLExtensions::Depth24;
391 if (extensionMatcher.match(
"GL_ANGLE_framebuffer_blit"))
392 extensions |= QOpenGLExtensions::FramebufferBlit;
393 if (extensionMatcher.match(
"GL_ANGLE_framebuffer_multisample"))
394 extensions |= QOpenGLExtensions::FramebufferMultisample;
395 if (extensionMatcher.match(
"GL_NV_framebuffer_blit"))
396 extensions |= QOpenGLExtensions::FramebufferBlit;
397 if (extensionMatcher.match(
"GL_NV_framebuffer_multisample"))
398 extensions |= QOpenGLExtensions::FramebufferMultisample;
399 if (extensionMatcher.match(
"GL_OES_rgb8_rgba8"))
400 extensions |= QOpenGLExtensions::Sized8Formats;
401 if (extensionMatcher.match(
"GL_OES_compressed_ETC2_RGB8_texture"))
402 extensions |= QOpenGLExtensions::ETC2TextureCompression;
405 if (extensionMatcher.match(
"GL_OES_mapbuffer"))
406 extensions |= QOpenGLExtensions::MapBuffer;
407 if (extensionMatcher.match(
"GL_OES_element_index_uint"))
408 extensions |= QOpenGLExtensions::ElementIndexUint;
410 if (extensionMatcher.match(
"GL_IMG_texture_format_BGRA8888") || extensionMatcher.match(
"GL_EXT_texture_format_BGRA8888"))
411 extensions |= QOpenGLExtensions::BGRATextureFormat;
413 QString *deviceName =
414 static_cast<QString *>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration(
"AndroidDeviceName"));
415 static bool wrongfullyReportsBgra8888Support = deviceName != 0
416 && (deviceName->compare(
"samsung SM-T211"_L1, Qt::CaseInsensitive) == 0
417 || deviceName->compare(
"samsung SM-T210"_L1, Qt::CaseInsensitive) == 0
418 || deviceName->compare(
"samsung SM-T215"_L1, Qt::CaseInsensitive) == 0);
419 if (wrongfullyReportsBgra8888Support)
420 extensions &= ~QOpenGLExtensions::BGRATextureFormat;
423 if (extensionMatcher.match(
"GL_EXT_discard_framebuffer"))
424 extensions |= QOpenGLExtensions::DiscardFramebuffer;
425 if (extensionMatcher.match(
"GL_EXT_texture_norm16"))
426 extensions |= QOpenGLExtensions::Sized16Formats;
428 extensions |= QOpenGLExtensions::ElementIndexUint
429 | QOpenGLExtensions::MapBuffer
430 | QOpenGLExtensions::Sized16Formats;
432 if (format.version() >= std::pair(1, 2))
433 extensions |= QOpenGLExtensions::BGRATextureFormat;
435 if (format.version() >= std::pair(1, 4) || extensionMatcher.match(
"GL_SGIS_generate_mipmap"))
436 extensions |= QOpenGLExtensions::GenerateMipmap;
438 if (format.majorVersion() >= 2)
439 extensions |= QOpenGLExtensions::StandardDerivatives;
441 if (format.majorVersion() >= 3 || extensionMatcher.match(
"GL_ARB_framebuffer_object")) {
442 extensions |= QOpenGLExtensions::FramebufferMultisample
443 | QOpenGLExtensions::FramebufferBlit
444 | QOpenGLExtensions::PackedDepthStencil
445 | QOpenGLExtensions::Sized8Formats;
448 if (extensionMatcher.match(
"GL_EXT_framebuffer_multisample"))
449 extensions |= QOpenGLExtensions::FramebufferMultisample;
450 if (extensionMatcher.match(
"GL_EXT_framebuffer_blit"))
451 extensions |= QOpenGLExtensions::FramebufferBlit;
452 if (extensionMatcher.match(
"GL_EXT_packed_depth_stencil"))
453 extensions |= QOpenGLExtensions::PackedDepthStencil;
456 if (format.version() >= std::pair(3, 2) || extensionMatcher.match(
"GL_ARB_geometry_shader4"))
457 extensions |= QOpenGLExtensions::GeometryShaders;
459 if (format.version() >= std::pair(3, 3))
460 extensions |= QOpenGLExtensions::TextureSwizzle;
462 if (format.version() >= std::pair(4, 3) || extensionMatcher.match(
"GL_ARB_invalidate_subdata"))
463 extensions |= QOpenGLExtensions::DiscardFramebuffer;
465 if (extensionMatcher.match(
"GL_ARB_map_buffer_range"))
466 extensions |= QOpenGLExtensions::MapBufferRange;
468 if (extensionMatcher.match(
"GL_EXT_framebuffer_sRGB")) {
469 GLboolean srgbCapableFramebuffers =
false;
471 if (srgbCapableFramebuffers)
472 extensions |= QOpenGLExtensions::SRGBFrameBuffer;
475 if (extensionMatcher.match(
"GL_ARB_ES3_compatibility"))
476 extensions |= QOpenGLExtensions::ETC2TextureCompression;