diff options
Diffstat (limited to 'drape/glextensions_list.cpp')
-rw-r--r-- | drape/glextensions_list.cpp | 158 |
1 files changed, 62 insertions, 96 deletions
diff --git a/drape/glextensions_list.cpp b/drape/glextensions_list.cpp index b9647ebefd..69647f4fa5 100644 --- a/drape/glextensions_list.cpp +++ b/drape/glextensions_list.cpp @@ -3,121 +3,87 @@ #include "base/assert.hpp" -#include "std/string.hpp" +#include "std/target_os.hpp" namespace dp { - -#ifdef DEBUG - #include "std/map.hpp" - - class GLExtensionsList::Impl +GLExtensionsList::GLExtensionsList(dp::ApiVersion apiVersion) +{ +#if defined(OMIM_OS_MOBILE) + CheckExtension(TextureNPOT, "GL_OES_texture_npot"); + if (apiVersion == dp::ApiVersion::OpenGLES2) { - public: - void CheckExtension(GLExtensionsList::ExtensionName const & enumName, const string & extName) - { #ifdef OMIM_OS_ANDROID - if (enumName == GLExtensionsList::VertexArrayObject) - m_supportedMap[enumName] = false; - else -#endif - m_supportedMap[enumName] = GLFunctions::glHasExtension(extName); - } - - void SetExtension(GLExtensionsList::ExtensionName const & enumName, bool isSupported) - { - m_supportedMap[enumName] = isSupported; - } - - bool IsSupported(GLExtensionsList::ExtensionName const & enumName) const - { - map<GLExtensionsList::ExtensionName, bool>::const_iterator it = m_supportedMap.find(enumName); - if (it != m_supportedMap.end()) - return it->second; - - ASSERT(false, ("Not all used extensions is checked")); - return false; - } - - private: - map<GLExtensionsList::ExtensionName, bool> m_supportedMap; - }; + SetExtension(VertexArrayObject, false); #else - #include "std/set.hpp" - - class GLExtensionsList::Impl - { - public: - void CheckExtension(GLExtensionsList::ExtensionName const & enumName, const string & extName) - { -#ifdef OMIM_OS_ANDROID - if (enumName == GLExtensionsList::VertexArrayObject) - return; -#endif - if (GLFunctions::glHasExtension(extName)) - m_supported.insert(enumName); - } - - void SetExtension(GLExtensionsList::ExtensionName const & enumName, bool isSupported) - { - if (isSupported) - m_supported.insert(enumName); - } - - bool IsSupported(GLExtensionsList::ExtensionName const & enumName) const - { - if (m_supported.find(enumName) != m_supported.end()) - return true; - - return false; - } - - private: - set<GLExtensionsList::ExtensionName> m_supported; - }; + CheckExtension(VertexArrayObject, "GL_OES_vertex_array_object"); #endif - -GLExtensionsList::GLExtensionsList() - : m_impl(new Impl()) -{ -#if defined(OMIM_OS_MOBILE) - m_impl->CheckExtension(VertexArrayObject, "GL_OES_vertex_array_object"); - m_impl->CheckExtension(RequiredInternalFormat, "GL_OES_required_internalformat"); - m_impl->CheckExtension(TextureNPOT, "GL_OES_texture_npot"); - m_impl->CheckExtension(MapBuffer, "GL_OES_mapbuffer"); - m_impl->CheckExtension(UintIndices, "GL_OES_element_index_uint"); - m_impl->CheckExtension(MapBufferRange, "GL_EXT_map_buffer_range"); + CheckExtension(MapBuffer, "GL_OES_mapbuffer"); + CheckExtension(UintIndices, "GL_OES_element_index_uint"); + CheckExtension(MapBufferRange, "GL_EXT_map_buffer_range"); + } + else + { + SetExtension(VertexArrayObject, true); + SetExtension(MapBuffer, true); + SetExtension(MapBufferRange, true); + SetExtension(UintIndices, true); + } #elif defined(OMIM_OS_WINDOWS) m_impl->CheckExtension(TextureNPOT, "GL_ARB_texture_non_power_of_two"); - m_impl->SetExtension(VertexArrayObject, false); - m_impl->SetExtension(RequiredInternalFormat, false); - m_impl->SetExtension(MapBuffer, true); - m_impl->SetExtension(MapBufferRange, false); - m_impl->SetExtension(UintIndices, true); + SetExtension(MapBuffer, true); + SetExtension(UintIndices, true); + if (apiVersion == dp::ApiVersion::OpenGLES2) + { + SetExtension(VertexArrayObject, false); + SetExtension(MapBufferRange, false); + } + else + { + SetExtension(VertexArrayObject, true); + SetExtension(MapBufferRange, true); + } #else - m_impl->CheckExtension(VertexArrayObject, "GL_APPLE_vertex_array_object"); - m_impl->CheckExtension(TextureNPOT, "GL_ARB_texture_non_power_of_two"); - m_impl->SetExtension(RequiredInternalFormat, false); - m_impl->SetExtension(MapBuffer, true); - m_impl->SetExtension(MapBufferRange, false); - m_impl->SetExtension(UintIndices, true); + CheckExtension(TextureNPOT, "GL_ARB_texture_non_power_of_two"); + SetExtension(MapBuffer, true); + SetExtension(UintIndices, true); + if (apiVersion == dp::ApiVersion::OpenGLES2) + { + CheckExtension(VertexArrayObject, "GL_APPLE_vertex_array_object"); + SetExtension(MapBufferRange, false); + } + else + { + SetExtension(VertexArrayObject, true); + SetExtension(MapBufferRange, true); + } #endif } -GLExtensionsList::~GLExtensionsList() +// static +GLExtensionsList & GLExtensionsList::Instance() { - delete m_impl; + static GLExtensionsList extList(GLFunctions::CurrentApiVersion); + return extList; } -GLExtensionsList & GLExtensionsList::Instance() +bool GLExtensionsList::IsSupported(ExtensionName extName) const { - static GLExtensionsList extList; - return extList; + auto const it = m_supportedMap.find(extName); + if (it != m_supportedMap.end()) + return it->second; + + ASSERT(false, ("Not all used extensions are checked")); + return false; } -bool GLExtensionsList::IsSupported(ExtensionName const & extName) const +void GLExtensionsList::CheckExtension(ExtensionName enumName, std::string const & extName) { - return m_impl->IsSupported(extName); + m_supportedMap[enumName] = GLFunctions::glHasExtension(extName); } -} // namespace dp +void GLExtensionsList::SetExtension(ExtensionName enumName, bool isSupported) +{ + m_supportedMap[enumName] = isSupported; +} +} // namespace dp |