/* -*-c++-*- */ /* osgEarth - Geospatial SDK for OpenSceneGraph * Copyright 2020 Pelican Mapping * http://osgearth.org * * osgEarth is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see */ #ifndef OSGEARTH_CAPABILITIES_H #define OSGEARTH_CAPABILITIES_H 1 #include #include #include #include namespace osgEarth { /** * Stores information about the hardware and graphics system capbilities. * The osgEarth::Registry stores a singleton Capabilities object that you can * use to determine what your system supports. */ class OSGEARTH_EXPORT Capabilities : public osg::Referenced { public: static const Capabilities& get(); /** maximum # of texture image units exposed in a GPU fragment shader */ int getMaxGPUTextureUnits() const { return _maxGPUTextureUnits; } /** maximum supported size (in pixels) of a texture */ int getMaxTextureSize() const { return _maxTextureSize; } /** maximum texture size that doesn't cause a slowdown (vendor-specific) */ int getMaxFastTextureSize() const { return _maxFastTextureSize; } /** whether the GPU supports shaders. */ bool supportsGLSL() const { return _supportsGLSL; } /** whether the GPU supports a minimum GLSL version */ bool supportsGLSL(float minimumVersion) const { return _supportsGLSL && _GLSLversion >= minimumVersion; } /** whether the GPU supports a minimum GLSL version (as an int; e.g. 1.2 => "120") */ bool supportsGLSL(unsigned minVersionInt) const { return _supportsGLSL && ((unsigned)(_GLSLversion*100.0f)) >= minVersionInt; } /** the GLSL version */ float getGLSLVersion() const { return _GLSLversion; } /** GLSL version as an integer x 100. I.e.: GLSL 1.4 => 140. */ unsigned getGLSLVersionInt() const { return (unsigned)(_GLSLversion*100.0f + 0.5f); } /** Are we running OpenGLES? */ bool isGLES() const { return _isGLES; } //! Reported GL_VENDOR const std::string& getVendor() const { return _vendor;} //! Reported GL_RENDERER const std::string& getRenderer() const { return _renderer;} //! the GL_VERSION string, which include the GL version, driver vendor, and driver version const std::string& getVersion() const { return _version; } /** whether the GPU supports DEPTH_PACKED_STENCIL buffer */ bool supportsDepthPackedStencilBuffer() const { return _supportsDepthPackedStencilBuffer; } /** whether the GPU supports DrawInstanced rendering */ bool supportsDrawInstanced() const { return _supportsDrawInstanced; } /** whether the GPU can handle non-power-of-two textures. */ bool supportsNonPowerOfTwoTextures() const { return _supportsNonPowerOfTwoTextures; } /** number of logical CPUs available. */ int getNumProcessors() const { return _numProcessors; } /** whether the GPU supports writing to the depth fragment */ bool supportsFragDepthWrite() const { return _supportsFragDepthWrite; } /** whether the GPU supports a texture compression scheme */ bool supportsTextureCompression(const osg::Texture::InternalFormatMode& mode) const; /** Maximum size of a texture buffer, when supportsTextureBuffer() is true. */ int getMaxTextureBufferSize() const { return _maxTextureBufferSize; } /** whether OpenGL core profile is active */ bool isCoreProfile() const { return _isCoreProfile; } /** whether OpenGL supports vertex array objects */ bool supportsVertexArrayObjects() const { return _supportsVertexArrayObjects; } //! Whether the driver support 64-bit integers int GLSL bool supportsInt64() const { return _supportsInt64; } //! Whether the NVIDIA GL4 extensions for unified memory, including //! bindless buffers and draw commands, are available bool supportsNVGL() const { return _supportsNVGL; } protected: Capabilities(); /** dtor */ virtual ~Capabilities() { } private: int _maxGPUTextureUnits; int _maxTextureSize; int _maxFastTextureSize; bool _supportsGLSL; float _GLSLversion; bool _supportsDepthPackedStencilBuffer; bool _supportsDrawInstanced; bool _supportsNonPowerOfTwoTextures; int _numProcessors; bool _supportsFragDepthWrite; std::string _vendor; std::string _renderer; std::string _version; bool _supportsS3TC; bool _supportsPVRTC; bool _supportsARBTC; bool _supportsETC; bool _supportsRGTC; bool _isGLES; int _maxTextureBufferSize; bool _isCoreProfile; bool _supportsVertexArrayObjects; bool _supportsInt64; bool _supportsNVGL; public: friend class Registry; }; } #endif // OSGEARTH_CAPABILITIES_H