From f231363bb66c214a816cac5d5bbfb428538dd32d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 13 Feb 2022 12:07:03 +0100 Subject: [PATCH] GL: improve ANGLE detection on WebGL. It's quite easy if WEBGL_debug_renderer_info is present, but if it isn't then our only hope is to check for ANGLE-specific extensions. Which may cause some false positives, but since we need to enable various workarounds for ANGLE to avoid issues, it's better than having the detection too conservative. The original ANGLE detection based on line size is probably not so relevant anymore, but let's keep it there. --- .../GL/Implementation/driverSpecific.cpp | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/Magnum/GL/Implementation/driverSpecific.cpp b/src/Magnum/GL/Implementation/driverSpecific.cpp index d5c192741..f224cf568 100644 --- a/src/Magnum/GL/Implementation/driverSpecific.cpp +++ b/src/Magnum/GL/Implementation/driverSpecific.cpp @@ -520,32 +520,36 @@ auto Context::detectedDriver() -> DetectedDrivers { if(renderer.contains("ANGLE"_s)) *_detectedDrivers |= DetectedDriver::Angle; #ifdef MAGNUM_TARGET_WEBGL - /* Otherwise assume ANGLE is present if WEBGL_debug_renderer_info isn't - present (which would tell us so already) and the ANGLE_instanced_arrays - is present on WebGL 1. Although e.g. Firefox exposes it even though it - renders directly through GL drivers on Linux, so this may catch more - drivers than just ANGLE. */ + /* If the unmasked renderer string is not available, try other means */ /** @todo this (and below) incorrectly detects ANGLE on FF 92+, as it has the WEBGL_debug_renderer_info disabled */ - #ifdef MAGNUM_TARGET_GLES2 - else if(!isExtensionSupported() && isExtensionSupported()) - /* Or if WEBGL_debug_renderer_info isn't present and WEBGL_multi_draw - (which is based on ANGLE_multi_draw) is present on WebGL 2. This - extension is rather recent (appearing in browsers in late 2020) so it - may not catch all ANGLE implementations. */ - #else - else if(!isExtensionSupported() && isExtensionSupported()) - #endif - *_detectedDrivers |= DetectedDriver::Angle; - /* Otherwise try to detect a D3D ANGLE backend by querying line width. It's - always exactly just 1 on D3D, usually more on GL, not sure about Metal. - so this is not a 100% match. Sources: http://stackoverflow.com/a/20149090 - and http://webglreport.com */ - else { - Range1Di range; - glGetIntegerv(GL_ALIASED_LINE_WIDTH_RANGE, range.data()); - if(range.min() == 1 && range.max() == 1 && vendor != "Internet Explorer"_s) + else if(!isExtensionSupported()) { + /* Otherwise assume ANGLE is present if the ANGLE_instanced_arrays is + present on WebGL 1. Although e.g. Firefox exposes it even though it + renders directly through GL drivers on Linux, so this may catch more + drivers than just ANGLE. */ + #ifdef MAGNUM_TARGET_GLES2 + if(isExtensionSupported()) + /* Or if WEBGL_multi_draw (which is based on ANGLE_multi_draw) is + present on WebGL 2. This extension is rather recent (appearing in + browsers in late 2020) so it may not catch all ANGLE + implementations. */ + #else + if(isExtensionSupported()) + #endif *_detectedDrivers |= DetectedDriver::Angle; + /* Otherwise try to detect a D3D ANGLE backend by querying line width. + It's always exactly just 1 on D3D, usually (but not always) more on + GL, not sure about Metal. So this is not a 100% match. Sources: + http://stackoverflow.com/a/20149090 and http://webglreport.com */ + else { + Range1Di range; + glGetIntegerv(GL_ALIASED_LINE_WIDTH_RANGE, range.data()); + if(range.min() == 1 && range.max() == 1 && vendor != "Internet Explorer"_s) { + !Debug{}; + *_detectedDrivers |= DetectedDriver::Angle; + } + } } #endif