diff --git a/src/Magnum/Implementation/driverSpecific.cpp b/src/Magnum/Implementation/driverSpecific.cpp index 1caa77ba4..e282739b3 100644 --- a/src/Magnum/Implementation/driverSpecific.cpp +++ b/src/Magnum/Implementation/driverSpecific.cpp @@ -34,10 +34,35 @@ namespace Magnum { namespace { std::vector KnownWorkarounds{ + #ifndef MAGNUM_TARGET_GLES /* Creating core context with specific version on AMD and NV proprietary drivers causes the context to be forced to given version instead of selecting latest available version */ - "amd-nv-no-forward-compatible-core-context" + "amd-nv-no-forward-compatible-core-context", + + /* Using ARB_explicit_uniform_location on AMD linux drivers 13.251 + caused the GLSL compiler to crash */ + "amd-explicit-uniform-location-crash", + + #ifdef CORRADE_TARGET_WINDOWS + /* On Windows Intel drivers ARB_shading_language_420pack is exposed in + GLSL even though the extension (e.g. binding keyword) is not + supported */ + "intel-windows-glsl-exposes-unsupported-shading-language-420pack", + #endif + + /* Layout qualifier causes compiler error with GLSL 1.20 on Mesa, GLSL + 1.30 on NVidia and 1.40 on Mac OS X. Everything is fine when using + newer GLSL version. */ + "no-layout-qualifiers-on-old-glsl", + #endif + + #ifdef CORRADE_TARGET_NACL + /* NaCl advertises some additional extensions but the GLESv2 library + does not have any entrypoints for them and there is no GetProcAddress + equivalent, thus marking them as unsupported. */ + "nacl-missing-extension-entrypoints" + #endif }; } @@ -132,56 +157,53 @@ void Context::setupDriverWorkarounds() { _extensionRequiredVersion[Extensions::extension::Index] = Version::version #ifndef MAGNUM_TARGET_GLES - /* This extension causes crash in GLSL compiler on AMD linux drivers 13.251 */ - if(detectedDriver() & DetectedDriver::AMD) + if((detectedDriver() & DetectedDriver::AMD) && !isDriverWorkaroundDisabled("amd-explicit-uniform-location-crash")) _setRequiredVersion(GL::ARB::explicit_uniform_location, None); #ifdef CORRADE_TARGET_WINDOWS - /* On Windows Intel drivers ARB_shading_language_420pack is exposed in GLSL - even that the extension (e.g. binding keyword) is not supported */ - if((detectedDriver() & DetectedDriver::IntelWindows) && !isExtensionSupported()) + if((detectedDriver() & DetectedDriver::IntelWindows) && !isExtensionSupported() && !isDriverWorkaroundDisabled("intel-windows-glsl-exposes-unsupported-shading-language-420pack")) _setRequiredVersion(GL::ARB::shading_language_420pack, None); #endif - /* Layout qualifier causes compiler error with GLSL 1.20 on Mesa, GLSL 1.30 - on NVidia and 1.40 on Mac OS X */ - /** @todo Different version on different vendors? */ - _setRequiredVersion(GL::ARB::explicit_attrib_location, GL320); - _setRequiredVersion(GL::ARB::explicit_uniform_location, GL320); - _setRequiredVersion(GL::ARB::shading_language_420pack, GL320); + if(!isDriverWorkaroundDisabled("no-layout-qualifiers-on-old-glsl")) { + _setRequiredVersion(GL::ARB::explicit_attrib_location, GL320); + _setRequiredVersion(GL::ARB::explicit_uniform_location, GL320); + _setRequiredVersion(GL::ARB::shading_language_420pack, GL320); + } #endif - /* Disable extensions not available on NaCl */ #ifdef CORRADE_TARGET_NACL - _setRequiredVersion(GL::EXT::multi_draw_arrays, None); - _setRequiredVersion(GL::EXT::debug_label, None); - _setRequiredVersion(GL::EXT::debug_marker, None); - _setRequiredVersion(GL::EXT::disjoint_timer_query, None); - _setRequiredVersion(GL::EXT::separate_shader_objects, None); - _setRequiredVersion(GL::EXT::multisampled_render_to_texture, None); - _setRequiredVersion(GL::EXT::robustness, None); - _setRequiredVersion(GL::KHR::debug, None); - _setRequiredVersion(GL::NV::read_buffer_front, None); - _setRequiredVersion(GL::OES::mapbuffer, None); - _setRequiredVersion(GL::ANGLE::framebuffer_blit, None); - _setRequiredVersion(GL::ANGLE::framebuffer_multisample, None); - _setRequiredVersion(GL::ANGLE::instanced_arrays, None); - _setRequiredVersion(GL::APPLE::framebuffer_multisample, None); - _setRequiredVersion(GL::EXT::discard_framebuffer, None); - _setRequiredVersion(GL::EXT::blend_minmax, None); - _setRequiredVersion(GL::EXT::texture_storage, None); - _setRequiredVersion(GL::EXT::map_buffer_range, None); - _setRequiredVersion(GL::EXT::instanced_arrays, None); - _setRequiredVersion(GL::EXT::draw_instanced, None); - _setRequiredVersion(GL::NV::draw_buffers, None); - _setRequiredVersion(GL::NV::fbo_color_attachments, None); // ?? - _setRequiredVersion(GL::NV::read_buffer, None); - _setRequiredVersion(GL::NV::draw_instanced, None); - _setRequiredVersion(GL::NV::framebuffer_blit, None); - _setRequiredVersion(GL::NV::framebuffer_multisample, None); - _setRequiredVersion(GL::NV::instanced_arrays, None); - _setRequiredVersion(GL::OES::texture_3D, None); - _setRequiredVersion(GL::OES::vertex_array_object, None); + if(!isDriverWorkaroundDisabled("nacl-missing-extension-entrypoints")) { + _setRequiredVersion(GL::EXT::multi_draw_arrays, None); + _setRequiredVersion(GL::EXT::debug_label, None); + _setRequiredVersion(GL::EXT::debug_marker, None); + _setRequiredVersion(GL::EXT::disjoint_timer_query, None); + _setRequiredVersion(GL::EXT::separate_shader_objects, None); + _setRequiredVersion(GL::EXT::multisampled_render_to_texture, None); + _setRequiredVersion(GL::EXT::robustness, None); + _setRequiredVersion(GL::KHR::debug, None); + _setRequiredVersion(GL::NV::read_buffer_front, None); + _setRequiredVersion(GL::OES::mapbuffer, None); + _setRequiredVersion(GL::ANGLE::framebuffer_blit, None); + _setRequiredVersion(GL::ANGLE::framebuffer_multisample, None); + _setRequiredVersion(GL::ANGLE::instanced_arrays, None); + _setRequiredVersion(GL::APPLE::framebuffer_multisample, None); + _setRequiredVersion(GL::EXT::discard_framebuffer, None); + _setRequiredVersion(GL::EXT::blend_minmax, None); + _setRequiredVersion(GL::EXT::texture_storage, None); + _setRequiredVersion(GL::EXT::map_buffer_range, None); + _setRequiredVersion(GL::EXT::instanced_arrays, None); + _setRequiredVersion(GL::EXT::draw_instanced, None); + _setRequiredVersion(GL::NV::draw_buffers, None); + _setRequiredVersion(GL::NV::fbo_color_attachments, None); // ?? + _setRequiredVersion(GL::NV::read_buffer, None); + _setRequiredVersion(GL::NV::draw_instanced, None); + _setRequiredVersion(GL::NV::framebuffer_blit, None); + _setRequiredVersion(GL::NV::framebuffer_multisample, None); + _setRequiredVersion(GL::NV::instanced_arrays, None); + _setRequiredVersion(GL::OES::texture_3D, None); + _setRequiredVersion(GL::OES::vertex_array_object, None); + } #endif #undef _setRequiredVersion