diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index b29a8ff8b..b2a5e936f 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -365,7 +365,7 @@ Extension | Status @es_extension{EXT,geometry_shader} | missing some ES-specific limit queries @es_extension{EXT,gpu_shader5} | done (shading language only) @es_extension{EXT,shader_io_blocks} | done (shading language only) -@es_extension{EXT,tessellation_shader} | | +@es_extension{EXT,tessellation_shader} | see above @es_extension{EXT,texture_border_clamp} | done @es_extension{EXT,texture_buffer} | done @es_extension{EXT,texture_cube_map_array} | done diff --git a/src/Magnum/Implementation/ShaderState.h b/src/Magnum/Implementation/ShaderState.h index bd29d2295..725f7e239 100644 --- a/src/Magnum/Implementation/ShaderState.h +++ b/src/Magnum/Implementation/ShaderState.h @@ -34,11 +34,8 @@ namespace Magnum { namespace Implementation { struct ShaderState { explicit ShaderState(): maxVertexOutputComponents{}, maxFragmentInputComponents{}, - #ifndef MAGNUM_TARGET_GLES - maxTessellationControlInputComponents{}, maxTessellationControlOutputComponents{}, maxTessellationControlTotalOutputComponents{}, maxTessellationEvaluationInputComponents{}, maxTessellationEvaluationOutputComponents{}, - #endif #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) - maxGeometryInputComponents{}, maxGeometryOutputComponents{}, maxGeometryTotalOutputComponents{}, maxAtomicCounterBuffers{}, maxCombinedAtomicCounterBuffers{}, maxAtomicCounters{}, maxCombinedAtomicCounters{}, maxImageUniforms{}, maxCombinedImageUniforms{}, maxShaderStorageBlocks{}, maxCombinedShaderStorageBlocks{}, + maxTessellationControlInputComponents{}, maxTessellationControlOutputComponents{}, maxTessellationControlTotalOutputComponents{}, maxTessellationEvaluationInputComponents{}, maxTessellationEvaluationOutputComponents{}, maxGeometryInputComponents{}, maxGeometryOutputComponents{}, maxGeometryTotalOutputComponents{}, maxAtomicCounterBuffers{}, maxCombinedAtomicCounterBuffers{}, maxAtomicCounters{}, maxCombinedAtomicCounters{}, maxImageUniforms{}, maxCombinedImageUniforms{}, maxShaderStorageBlocks{}, maxCombinedShaderStorageBlocks{}, #endif maxTextureImageUnits{}, maxTextureImageUnitsCombined{}, #ifndef MAGNUM_TARGET_GLES2 @@ -51,9 +48,7 @@ struct ShaderState { {} enum: std::size_t { - #ifndef MAGNUM_TARGET_GLES - StageCount = 6 - #elif !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) StageCount = 4 #else StageCount = 2 @@ -62,15 +57,13 @@ struct ShaderState { GLint maxVertexOutputComponents, maxFragmentInputComponents; - #ifndef MAGNUM_TARGET_GLES + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) GLint maxTessellationControlInputComponents, maxTessellationControlOutputComponents, maxTessellationControlTotalOutputComponents, maxTessellationEvaluationInputComponents, - maxTessellationEvaluationOutputComponents; - #endif - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) - GLint maxGeometryInputComponents, + maxTessellationEvaluationOutputComponents, + maxGeometryInputComponents, maxGeometryOutputComponents, maxGeometryTotalOutputComponents; GLint maxAtomicCounterBuffers[StageCount]; diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index 12da3e5bd..17e8b3d04 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -317,22 +317,18 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat _l(Shader::maxVertexOutputComponents()) _l(Shader::maxFragmentInputComponents()) _l(Shader::maxTextureImageUnits(Shader::Type::Vertex)) - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 _l(Shader::maxTextureImageUnits(Shader::Type::TessellationControl)) _l(Shader::maxTextureImageUnits(Shader::Type::TessellationEvaluation)) - #endif - #ifndef MAGNUM_TARGET_GLES2 _l(Shader::maxTextureImageUnits(Shader::Type::Geometry)) _l(Shader::maxTextureImageUnits(Shader::Type::Compute)) #endif _l(Shader::maxTextureImageUnits(Shader::Type::Fragment)) _l(Shader::maxCombinedTextureImageUnits()) _l(Shader::maxUniformComponents(Shader::Type::Vertex)) - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 _l(Shader::maxUniformComponents(Shader::Type::TessellationControl)) _l(Shader::maxUniformComponents(Shader::Type::TessellationEvaluation)) - #endif - #ifndef MAGNUM_TARGET_GLES2 _l(Shader::maxUniformComponents(Shader::Type::Geometry)) _l(Shader::maxUniformComponents(Shader::Type::Compute)) #endif @@ -413,19 +409,15 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat _l(Buffer::maxAtomicCounterBindings()) _l(Shader::maxAtomicCounterBuffers(Shader::Type::Vertex)) - #ifndef MAGNUM_TARGET_GLES _l(Shader::maxAtomicCounterBuffers(Shader::Type::TessellationControl)) _l(Shader::maxAtomicCounterBuffers(Shader::Type::TessellationEvaluation)) - #endif _l(Shader::maxAtomicCounterBuffers(Shader::Type::Geometry)) _l(Shader::maxAtomicCounterBuffers(Shader::Type::Compute)) _l(Shader::maxAtomicCounterBuffers(Shader::Type::Fragment)) _l(Shader::maxCombinedAtomicCounterBuffers()) _l(Shader::maxAtomicCounters(Shader::Type::Vertex)) - #ifndef MAGNUM_TARGET_GLES _l(Shader::maxAtomicCounters(Shader::Type::TessellationControl)) _l(Shader::maxAtomicCounters(Shader::Type::TessellationEvaluation)) - #endif _l(Shader::maxAtomicCounters(Shader::Type::Geometry)) _l(Shader::maxAtomicCounters(Shader::Type::Compute)) _l(Shader::maxAtomicCounters(Shader::Type::Fragment)) @@ -442,10 +434,8 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat #endif _l(Shader::maxImageUniforms(Shader::Type::Vertex)) - #ifndef MAGNUM_TARGET_GLES _l(Shader::maxImageUniforms(Shader::Type::TessellationControl)) _l(Shader::maxImageUniforms(Shader::Type::TessellationEvaluation)) - #endif _l(Shader::maxImageUniforms(Shader::Type::Geometry)) _l(Shader::maxImageUniforms(Shader::Type::Compute)) _l(Shader::maxImageUniforms(Shader::Type::Fragment)) @@ -466,10 +456,8 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat #endif _l(Shader::maxShaderStorageBlocks(Shader::Type::Vertex)) - #ifndef MAGNUM_TARGET_GLES _l(Shader::maxShaderStorageBlocks(Shader::Type::TessellationControl)) _l(Shader::maxShaderStorageBlocks(Shader::Type::TessellationEvaluation)) - #endif _l(Shader::maxShaderStorageBlocks(Shader::Type::Geometry)) _l(Shader::maxShaderStorageBlocks(Shader::Type::Compute)) _l(Shader::maxShaderStorageBlocks(Shader::Type::Fragment)) @@ -479,9 +467,18 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat } #endif + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) #ifndef MAGNUM_TARGET_GLES - if(c->isExtensionSupported()) { + if(c->isExtensionSupported()) + #else + if(c->isExtensionSupported()) + #endif + { + #ifndef MAGNUM_TARGET_GLES _h(ARB::tessellation_shader) + #else + _h(EXT::tessellation_shader) + #endif _l(Buffer::shaderStorageOffsetAlignment()) _l(Buffer::maxShaderStorageBindings()) @@ -576,19 +573,15 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat _l(Buffer::uniformOffsetAlignment()) _l(Shader::maxUniformBlocks(Shader::Type::Vertex)) - #ifndef MAGNUM_TARGET_GLES _l(Shader::maxUniformBlocks(Shader::Type::TessellationControl)) _l(Shader::maxUniformBlocks(Shader::Type::TessellationEvaluation)) - #endif _l(Shader::maxUniformBlocks(Shader::Type::Geometry)) _l(Shader::maxUniformBlocks(Shader::Type::Compute)) _l(Shader::maxUniformBlocks(Shader::Type::Fragment)) _l(Shader::maxCombinedUniformBlocks()) _l(Shader::maxCombinedUniformComponents(Shader::Type::Vertex)) - #ifndef MAGNUM_TARGET_GLES _l(Shader::maxCombinedUniformComponents(Shader::Type::TessellationControl)) _l(Shader::maxCombinedUniformComponents(Shader::Type::TessellationEvaluation)) - #endif _l(Shader::maxCombinedUniformComponents(Shader::Type::Geometry)) _l(Shader::maxCombinedUniformComponents(Shader::Type::Compute)) _l(Shader::maxCombinedUniformComponents(Shader::Type::Fragment)) diff --git a/src/Magnum/Shader.cpp b/src/Magnum/Shader.cpp index 5cf5f4580..67bd206bf 100644 --- a/src/Magnum/Shader.cpp +++ b/src/Magnum/Shader.cpp @@ -62,12 +62,8 @@ std::string shaderName(const Shader::Type type) { case Shader::Type::Vertex: return "vertex"; #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) case Shader::Type::Geometry: return "geometry"; - #endif - #ifndef MAGNUM_TARGET_GLES case Shader::Type::TessellationControl: return "tessellation control"; case Shader::Type::TessellationEvaluation: return "tessellation evaluation"; - #endif - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) case Shader::Type::Compute: return "compute"; #endif case Shader::Type::Fragment: return "fragment"; @@ -83,8 +79,6 @@ UnsignedInt typeToIndex(const Shader::Type type) { #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) case Shader::Type::Compute: return 2; case Shader::Type::Geometry: return 3; - #endif - #ifndef MAGNUM_TARGET_GLES case Shader::Type::TessellationControl: return 4; case Shader::Type::TessellationEvaluation: return 5; #endif @@ -111,6 +105,9 @@ bool isTypeSupported(const Shader::Type type) { if(type == Shader::Type::Geometry && !Context::current()->isExtensionSupported()) return false; + if((type == Shader::Type::TessellationControl || type == Shader::Type::TessellationEvaluation) && !Context::current()->isExtensionSupported()) + return false; + if(type == Shader::Type::Compute && !Context::current()->isVersionSupported(Version::GLES310)) return false; @@ -143,74 +140,122 @@ Int Shader::maxVertexOutputComponents() { return value; } -#ifndef MAGNUM_TARGET_GLES +#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) Int Shader::maxTessellationControlInputComponents() { + #ifndef MAGNUM_TARGET_GLES if(!Context::current()->isExtensionSupported()) return 0; + #else + if(!Context::current()->isExtensionSupported()) + return 0; + #endif GLint& value = Context::current()->state().shader->maxTessellationControlInputComponents; /* Get the value, if not already cached */ - if(value == 0) - glGetIntegerv(GL_MAX_TESS_CONTROL_INPUT_COMPONENTS, &value); + if(value == 0) glGetIntegerv( + #ifndef MAGNUM_TARGET_GLES + GL_MAX_TESS_CONTROL_INPUT_COMPONENTS, + #else + GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT, + #endif + &value); return value; } Int Shader::maxTessellationControlOutputComponents() { + #ifndef MAGNUM_TARGET_GLES if(!Context::current()->isExtensionSupported()) return 0; + #else + if(!Context::current()->isExtensionSupported()) + return 0; + #endif GLint& value = Context::current()->state().shader->maxTessellationControlOutputComponents; /* Get the value, if not already cached */ - if(value == 0) - glGetIntegerv(GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS, &value); + if(value == 0) glGetIntegerv( + #ifndef MAGNUM_TARGET_GLES + GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS, + #else + GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT, + #endif + &value); return value; } Int Shader::maxTessellationControlTotalOutputComponents() { + #ifndef MAGNUM_TARGET_GLES if(!Context::current()->isExtensionSupported()) return 0; + #else + if(!Context::current()->isExtensionSupported()) + return 0; + #endif GLint& value = Context::current()->state().shader->maxTessellationControlTotalOutputComponents; /* Get the value, if not already cached */ - if(value == 0) - glGetIntegerv(GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS, &value); + if(value == 0) glGetIntegerv( + #ifndef MAGNUM_TARGET_GLES + GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS, + #else + GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT, + #endif + &value); return value; } Int Shader::maxTessellationEvaluationInputComponents() { + #ifndef MAGNUM_TARGET_GLES if(!Context::current()->isExtensionSupported()) return 0; + #else + if(!Context::current()->isExtensionSupported()) + return 0; + #endif GLint& value = Context::current()->state().shader->maxTessellationEvaluationInputComponents; /* Get the value, if not already cached */ - if(value == 0) - glGetIntegerv(GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS, &value); + if(value == 0) glGetIntegerv( + #ifndef MAGNUM_TARGET_GLES + GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS, + #else + GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT, + #endif + &value); return value; } Int Shader::maxTessellationEvaluationOutputComponents() { + #ifndef MAGNUM_TARGET_GLES if(!Context::current()->isExtensionSupported()) return 0; + #else + if(!Context::current()->isExtensionSupported()) + return 0; + #endif GLint& value = Context::current()->state().shader->maxTessellationEvaluationOutputComponents; /* Get the value, if not already cached */ - if(value == 0) - glGetIntegerv(GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS, &value); + if(value == 0) glGetIntegerv( + #ifndef MAGNUM_TARGET_GLES + GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS, + #else + GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT, + #endif + &value); return value; } -#endif -#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) Int Shader::maxGeometryInputComponents() { #ifndef MAGNUM_TARGET_GLES if(!Context::current()->isExtensionSupported()) @@ -857,11 +902,9 @@ Debug operator<<(Debug debug, const Shader::Type value) { switch(value) { #define _c(value) case Shader::Type::value: return debug << "Shader::Type::" #value; _c(Vertex) - #ifndef MAGNUM_TARGET_GLES + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) _c(TessellationControl) _c(TessellationEvaluation) - #endif - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) _c(Geometry) _c(Compute) #endif diff --git a/src/Magnum/Shader.h b/src/Magnum/Shader.h index c51ceb2a0..0bfdaafd7 100644 --- a/src/Magnum/Shader.h +++ b/src/Magnum/Shader.h @@ -67,25 +67,35 @@ class MAGNUM_EXPORT Shader: public AbstractObject { enum class Type: GLenum { Vertex = GL_VERTEX_SHADER, /**< Vertex shader */ - #ifndef MAGNUM_TARGET_GLES + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) /** * Tessellation control shader * @requires_gl40 Extension @extension{ARB,tessellation_shader} - * @requires_gl Tessellation shaders are not available in OpenGL ES - * or WebGL. + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_es_extension Extension @es_extension{ANDROID,extension_pack_es31a}/ + * @es_extension{EXT,tessellation_shader} + * @requires_gles Tessellation shaders are not available in WebGL. */ + #ifndef MAGNUM_TARGET_GLES TessellationControl = GL_TESS_CONTROL_SHADER, + #else + TessellationControl = GL_TESS_CONTROL_SHADER_EXT, + #endif /** * Tessellation evaluation shader * @requires_gl40 Extension @extension{ARB,tessellation_shader} - * @requires_gl Tessellation shaders are not available in OpenGL ES - * or WebGL. + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_es_extension Extension @es_extension{ANDROID,extension_pack_es31a}/ + * @es_extension{EXT,tessellation_shader} + * @requires_gles Tessellation shaders are not available in WebGL. */ + #ifndef MAGNUM_TARGET_GLES TessellationEvaluation = GL_TESS_EVALUATION_SHADER, + #else + TessellationEvaluation = GL_TESS_EVALUATION_SHADER_EXT, #endif - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) /** * Geometry shader * @requires_gl32 Extension @extension{ARB,geometry_shader4} @@ -127,16 +137,18 @@ class MAGNUM_EXPORT Shader: public AbstractObject { /** @todo `GL_MAX_PATCH_VERTICES`, `GL_MAX_TESS_GEN_LEVEL`, `GL_MAX_TESS_PATCH_COMPONENTS` when @extension{ARB,tessellation_shader} is done */ - #ifndef MAGNUM_TARGET_GLES + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) /** * @brief Max supported component count of tessellation control shader input vertex * * The result is cached, repeated queries don't result in repeated - * OpenGL calls. If extension @extension{ARB,tessellation_shader} (part - * of OpenGL 4.0) is not available, returns `0`. + * OpenGL calls. If neither @extension{ARB,tessellation_shader} (part + * of OpenGL 4.0) nor @es_extension{ANDROID,extension_pack_es31a}/ + * @es_extension{EXT,tessellation_shader} ES extension is available, + * returns `0`. * @see @fn_gl{Get} with @def_gl{MAX_TESS_CONTROL_INPUT_COMPONENTS} - * @requires_gl Tessellation shaders are not available in OpenGL ES or - * WebGL. + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_gl Tessellation shaders are not available in WebGL. */ static Int maxTessellationControlInputComponents(); @@ -144,11 +156,13 @@ class MAGNUM_EXPORT Shader: public AbstractObject { * @brief Max supported component count of tessellation control shader output vertex * * The result is cached, repeated queries don't result in repeated - * OpenGL calls. If extension @extension{ARB,tessellation_shader} (part - * of OpenGL 4.0) is not available, returns `0`. + * OpenGL calls. If neither @extension{ARB,tessellation_shader} (part + * of OpenGL 4.0) nor @es_extension{ANDROID,extension_pack_es31a}/ + * @es_extension{EXT,tessellation_shader} ES extension is available, + * returns `0`. * @see @fn_gl{Get} with @def_gl{MAX_TESS_CONTROL_OUTPUT_COMPONENTS} - * @requires_gl Tessellation shaders are not available in OpenGL ES or - * WebGL. + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_gl Tessellation shaders are not available in WebGL. */ static Int maxTessellationControlOutputComponents(); @@ -156,11 +170,13 @@ class MAGNUM_EXPORT Shader: public AbstractObject { * @brief Max supported component count of all tessellation control shader output vertices combined * * The result is cached, repeated queries don't result in repeated - * OpenGL calls. If extension @extension{ARB,tessellation_shader} (part - * of OpenGL 4.0) is not available, returns `0`. + * OpenGL calls. If neither @extension{ARB,tessellation_shader} (part + * of OpenGL 4.0) nor @es_extension{ANDROID,extension_pack_es31a}/ + * @es_extension{EXT,tessellation_shader} ES extension is available, + * returns `0`. * @see @fn_gl{Get} with @def_gl{MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS} - * @requires_gl Tessellation shaders are not available in OpenGL ES or - * WebGL. + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_gl Tessellation shaders are not available in WebGL. */ static Int maxTessellationControlTotalOutputComponents(); @@ -168,11 +184,13 @@ class MAGNUM_EXPORT Shader: public AbstractObject { * @brief Max supported component count of tessellation evaluation shader input vertex * * The result is cached, repeated queries don't result in repeated - * OpenGL calls. If extension @extension{ARB,tessellation_shader} (part - * of OpenGL 4.0) is not available, returns `0`. + * OpenGL calls. If neither @extension{ARB,tessellation_shader} (part + * of OpenGL 4.0) nor @es_extension{ANDROID,extension_pack_es31a}/ + * @es_extension{EXT,tessellation_shader} ES extension is available, + * returns `0`. * @see @fn_gl{Get} with @def_gl{MAX_TESS_EVALUATION_INPUT_COMPONENTS} - * @requires_gl Tessellation shaders are not available in OpenGL ES or - * WebGL. + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_gl Tessellation shaders are not available in WebGL. */ static Int maxTessellationEvaluationInputComponents(); @@ -180,16 +198,16 @@ class MAGNUM_EXPORT Shader: public AbstractObject { * @brief Max supported component count of tessellation evaluation shader output vertex * * The result is cached, repeated queries don't result in repeated - * OpenGL calls. If extension @extension{ARB,tessellation_shader} (part - * of OpenGL 4.0) is not available, returns `0`. + * OpenGL calls. If neither @extension{ARB,tessellation_shader} (part + * of OpenGL 4.0) nor @es_extension{ANDROID,extension_pack_es31a}/ + * @es_extension{EXT,tessellation_shader} ES extension is available, + * returns `0`. * @see @fn_gl{Get} with @def_gl{MAX_TESS_EVALUATION_OUTPUT_COMPONENTS} - * @requires_gl Tessellation shaders are not available in OpenGL ES or - * WebGL. + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_gl Tessellation shaders are not available in WebGL. */ static Int maxTessellationEvaluationOutputComponents(); - #endif - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) /** * @brief Max supported component count of geometry shader input vertex *