|
|
|
|
@ -34,10 +34,35 @@ namespace Magnum {
|
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
std::vector<std::string> 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<Extensions::GL::ARB::shading_language_420pack>()) |
|
|
|
|
if((detectedDriver() & DetectedDriver::IntelWindows) && !isExtensionSupported<Extensions::GL::ARB::shading_language_420pack>() && !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 |
|
|
|
|
|