| { | 
 |     "General":{ | 
 |         "comment":[ | 
 |             " Copyright 2018 The ANGLE Project Authors. All rights reserved.", | 
 |             " Use of this source code is governed by a BSD-style license that can be", | 
 |             " found in the LICENSE file.", | 
 |             "", | 
 |             " The schema of this JSON file is as follows:", | 
 |             "", | 
 |             " The top-level object contains variable groups. Each group can have the following", | 
 |             " properties:", | 
 |             "   variables: Object mapping variable names to variable properties.", | 
 |             "   subgroups: Object with more groups that fall under the top-level group.", | 
 |             "   shader_type: The type of shader this variable is supported in", | 
 |             " Each variable can have the following properties:", | 
 |             "   essl_level: ESSL symbol table level where the variable is contained.", | 
 |             "   glsl_level: GLSL symbol table level where the variable is contained.", | 
 |             "   type: Object with properties of the type. Can be substituted with initDynamicType.", | 
 |             "   initDynamicType: Template string with C++ code for initializing a TType * with the", | 
 |             "                    name {type_name}. The name will be replaced when generating code.", | 
 |             "                    May refer to names of previously listed structs or interface", | 
 |             "                    blocks.", | 
 |             "   essl_extension: Optional. Name of the ESSL extension where this variable is from.", | 
 |             "   glsl_extension: Optional. Name of the GLSL extension where this variable is from.", | 
 |             "   value: Optional. String that has one valid value: 'resources'. Denotes that the", | 
 |             "          value of the variable should be based on the field of ShBuiltInResources", | 
 |             "          with the same name as the variable.", | 
 |             "   class: Optional. To be used for interface block or struct definitions. Valid", | 
 |             "          values are 'TStructure' or 'TInterfaceBlock'.", | 
 |             "   fields: Optional. Object to be used for storing fields of interface block and", | 
 |             "           struct definitions. Maps field names to field types.", | 
 |             "   suffix: Optional. Suffix to give C++ variables storing the properties of this", | 
 |             "           variable a unique name that doesn't conflict with C++ keywords.", | 
 |             " Each type can have the following properties:", | 
 |             "   basic: Basic type as in the TBasicType enum without the Ebt prefix.", | 
 |             "   precision: Precision as in TPrecision enum without the Ebp prefix.", | 
 |             "   qualifier: Optional. Qualifier as in the TQualifier enum without the Evq prefix.", | 
 |             "   primarySize: Optional. Vector size or matrix column count.", | 
 |             "   secondarySize: Optional. Matrix row count.", | 
 |             " Any group, variable or type can have the property 'comment'." | 
 |         ], | 
 |         "variables":{ | 
 |             "gl_DepthRangeParameters":{ | 
 |                 "class":"TStructure", | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "fields":{ | 
 |                     "near":{ | 
 |                         "basic":"Float", | 
 |                         "precision":"High" | 
 |                     }, | 
 |                     "far":{ | 
 |                         "basic":"Float", | 
 |                         "precision":"High" | 
 |                     }, | 
 |                     "diff":{ | 
 |                         "basic":"Float", | 
 |                         "precision":"High" | 
 |                     } | 
 |                 } | 
 |             }, | 
 |             "gl_DepthRange":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "initDynamicType":"TType *{type_name} = new TType(gl_DepthRangeParameters, false); {type_name}->setQualifier(EvqUniform);" | 
 |             } | 
 |         } | 
 |     }, | 
 |     "Constants":{ | 
 |         "variables":{ | 
 |             "gl_MaxVertexAttribs":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxVertexUniformVectors":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxVertexTextureImageUnits":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxCombinedTextureImageUnits":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxTextureImageUnits":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxFragmentUniformVectors":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxVaryingVectors":{ | 
 |                 "essl_level":"ESSL1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxDrawBuffers":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxDualSourceDrawBuffersEXT":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "essl_extension":"EXT_blend_func_extended", | 
 |                 "value":"resources", | 
 |                 "valueKey":"MaxDualSourceDrawBuffers" | 
 |             }, | 
 |             "gl_MaxVertexOutputVectors":{ | 
 |                 "essl_level":"ESSL3_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxFragmentInputVectors":{ | 
 |                 "essl_level":"ESSL3_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MinProgramTexelOffset":{ | 
 |                 "essl_level":"ESSL3_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxProgramTexelOffset":{ | 
 |                 "essl_level":"ESSL3_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxImageUnits":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxVertexImageUniforms":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxFragmentImageUniforms":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxComputeImageUniforms":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxCombinedImageUniforms":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxCombinedShaderOutputResources":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxComputeWorkGroupCount":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"Const", | 
 |                     "primarySize":3 | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxComputeWorkGroupSize":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"Const", | 
 |                     "primarySize":3 | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxComputeUniformComponents":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxComputeTextureImageUnits":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxComputeAtomicCounters":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxComputeAtomicCounterBuffers":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxVertexAtomicCounters":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxFragmentAtomicCounters":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxCombinedAtomicCounters":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxAtomicCounterBindings":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxVertexAtomicCounterBuffers":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxFragmentAtomicCounterBuffers":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxCombinedAtomicCounterBuffers":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             }, | 
 |             "gl_MaxAtomicCounterBufferSize":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"Const" | 
 |                 }, | 
 |                 "value":"resources" | 
 |             } | 
 |         }, | 
 |         "subgroups":{ | 
 |             "EXTGeometryShader":{ | 
 |                 "variables":{ | 
 |                     "gl_MaxGeometryInputComponents":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"Const" | 
 |                         }, | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "value":"resources" | 
 |                     }, | 
 |                     "gl_MaxGeometryOutputComponents":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"Const" | 
 |                         }, | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "value":"resources" | 
 |                     }, | 
 |                     "gl_MaxGeometryImageUniforms":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"Const" | 
 |                         }, | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "value":"resources" | 
 |                     }, | 
 |                     "gl_MaxGeometryTextureImageUnits":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"Const" | 
 |                         }, | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "value":"resources" | 
 |                     }, | 
 |                     "gl_MaxGeometryOutputVertices":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"Const" | 
 |                         }, | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "value":"resources" | 
 |                     }, | 
 |                     "gl_MaxGeometryTotalOutputComponents":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"Const" | 
 |                         }, | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "value":"resources" | 
 |                     }, | 
 |                     "gl_MaxGeometryUniformComponents":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"Const" | 
 |                         }, | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "value":"resources" | 
 |                     }, | 
 |                     "gl_MaxGeometryAtomicCounters":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"Const" | 
 |                         }, | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "value":"resources" | 
 |                     }, | 
 |                     "gl_MaxGeometryAtomicCounterBuffers":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"Const" | 
 |                         }, | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "value":"resources" | 
 |                     } | 
 |                 } | 
 |             } | 
 |         } | 
 |     }, | 
 |     "FragShader":{ | 
 |         "shader_type": "FRAGMENT", | 
 |         "variables":{ | 
 |             "gl_FragCoord":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Float", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"FragCoord", | 
 |                     "primarySize":4 | 
 |                 } | 
 |             }, | 
 |             "gl_FrontFacing":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Bool", | 
 |                     "qualifier":"FrontFacing" | 
 |                 } | 
 |             }, | 
 |             "gl_PointCoord":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Float", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"PointCoord", | 
 |                     "primarySize":2 | 
 |                 } | 
 |             }, | 
 |             "gl_FragColor":{ | 
 |                 "essl_level":"ESSL1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Float", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"FragColor", | 
 |                     "primarySize":4 | 
 |                 } | 
 |             }, | 
 |             "gl_FragData":{ | 
 |                 "essl_level":"ESSL1_BUILTINS", | 
 |                 "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpMedium, EvqFragData, 4); if (spec != SH_WEBGL2_SPEC && spec != SH_WEBGL3_SPEC) {{ {type_name}->makeArray(resources.MaxDrawBuffers); }} else {{ {type_name}->makeArray(1u); }}" | 
 |             }, | 
 |             "gl_FragDepth":{ | 
 |                 "essl_level":"ESSL3_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Float", | 
 |                     "precision":"High", | 
 |                     "qualifier":"FragDepth" | 
 |                 } | 
 |             }, | 
 |             "gl_HelperInvocation":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Bool", | 
 |                     "qualifier":"HelperInvocation" | 
 |                 } | 
 |             } | 
 |         }, | 
 |         "subgroups":{ | 
 |             "EXTBlendFuncExtended":{ | 
 |                 "variables":{ | 
 |                     "gl_SecondaryFragColorEXT":{ | 
 |                         "essl_level":"ESSL1_BUILTINS", | 
 |                         "essl_extension":"EXT_blend_func_extended", | 
 |                         "type":{ | 
 |                             "basic":"Float", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"SecondaryFragColorEXT", | 
 |                             "primarySize":4 | 
 |                         } | 
 |                     }, | 
 |                     "gl_SecondaryFragDataEXT":{ | 
 |                         "essl_level":"ESSL1_BUILTINS", | 
 |                         "essl_extension":"EXT_blend_func_extended", | 
 |                         "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpMedium, EvqSecondaryFragDataEXT, 4, 1); {type_name}->makeArray(resources.MaxDualSourceDrawBuffers);" | 
 |                     } | 
 |                 } | 
 |             }, | 
 |             "EXTFragDepth":{ | 
 |                 "variables":{ | 
 |                     "gl_FragDepthEXT":{ | 
 |                         "essl_level":"ESSL1_BUILTINS", | 
 |                         "essl_extension":"EXT_frag_depth", | 
 |                         "initDynamicType":"TType *{type_name} = new TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepthEXT, 1);" | 
 |                     } | 
 |                 } | 
 |             }, | 
 |             "EXTShaderFramebufferFetch":{ | 
 |                 "variables":{ | 
 |                     "gl_LastFragData":{ | 
 |                         "essl_level":"ESSL1_BUILTINS", | 
 |                         "essl_extension":"EXT_shader_framebuffer_fetch", | 
 |                         "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpMedium, EvqLastFragData, 4, 1); {type_name}->makeArray(resources.MaxDrawBuffers);" | 
 |                     } | 
 |                 } | 
 |             }, | 
 |             "NVShaderFramebufferFetch":{ | 
 |                 "variables":{ | 
 |                     "gl_LastFragColor":{ | 
 |                         "essl_level":"ESSL1_BUILTINS", | 
 |                         "essl_extension":"NV_shader_framebuffer_fetch", | 
 |                         "type":{ | 
 |                             "basic":"Float", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"LastFragColor", | 
 |                             "primarySize":4 | 
 |                         } | 
 |                     }, | 
 |                     "gl_LastFragData":{ | 
 |                         "essl_level":"ESSL1_BUILTINS", | 
 |                         "suffix":"NV", | 
 |                         "essl_extension":"NV_shader_framebuffer_fetch", | 
 |                         "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpMedium, EvqLastFragData, 4, 1); {type_name}->makeArray(resources.MaxDrawBuffers);" | 
 |                     } | 
 |                 } | 
 |             }, | 
 |             "ARMShaderFramebufferFetch":{ | 
 |                 "variables":{ | 
 |                     "gl_LastFragColorARM":{ | 
 |                         "essl_level":"ESSL1_BUILTINS", | 
 |                         "essl_extension":"ARM_shader_framebuffer_fetch", | 
 |                         "type":{ | 
 |                             "basic":"Float", | 
 |                             "precision":"Medium", | 
 |                             "qualifier":"LastFragColor", | 
 |                             "primarySize":4 | 
 |                         } | 
 |                     } | 
 |                 } | 
 |             }, | 
 |             "GeometryShaderSupported":{ | 
 |                 "variables":{ | 
 |                     "gl_PrimitiveID":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"High", | 
 |                             "qualifier":"PrimitiveID" | 
 |                         } | 
 |                     }, | 
 |                     "gl_Layer":{ | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "type":{ | 
 |                             "basic":"Int", | 
 |                             "precision":"High", | 
 |                             "qualifier":"Layer" | 
 |                         } | 
 |                     } | 
 |                 } | 
 |             } | 
 |         } | 
 |     }, | 
 |     "VertexShader":{ | 
 |         "shader_type": "VERTEX", | 
 |         "variables":{ | 
 |             "gl_Position":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Float", | 
 |                     "precision":"High", | 
 |                     "qualifier":"Position", | 
 |                     "primarySize":4 | 
 |                 } | 
 |             }, | 
 |             "gl_PointSize":{ | 
 |                 "essl_level":"COMMON_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Float", | 
 |                     "precision":"Medium", | 
 |                     "qualifier":"PointSize" | 
 |                 } | 
 |             }, | 
 |             "gl_InstanceID":{ | 
 |                 "essl_level":"ESSL3_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"InstanceID" | 
 |                 } | 
 |             }, | 
 |             "gl_InstanceIndex":{ | 
 |                 "essl_level":"GLSL_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"InstanceID", | 
 |                     "comment": "In GLSL 450 used by Vulkan" | 
 |                 } | 
 |             }, | 
 |             "gl_VertexID":{ | 
 |                 "essl_level":"ESSL3_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"VertexID" | 
 |                 } | 
 |             }, | 
 |             "gl_VertexIndex":{ | 
 |                 "essl_level":"GLSL_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"VertexID", | 
 |                     "comment": "In GLSL 450 used by Vulkan" | 
 |                 } | 
 |             }, | 
 |             "gl_ViewportIndex":{ | 
 |                 "comment":"For internal use by ANGLE - not exposed to the parser.", | 
 |                 "essl_level":"GLSL_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"ViewportIndex" | 
 |                 } | 
 |             }, | 
 |             "gl_Layer":{ | 
 |                 "suffix":"VS", | 
 |                 "comment":"gl_Layer exists in other shader stages in ESSL, but not in vertex shader so far.", | 
 |                 "essl_level":"GLSL_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"Layer" | 
 |                 } | 
 |             } | 
 |         }, | 
 |         "subgroups":{ | 
 |             "ANGLEMultiDraw":{ | 
 |                 "subgroups":{ | 
 |                   "ESSL3":{ | 
 |                         "variables":{ | 
 |                             "gl_DrawID":{ | 
 |                                 "essl_level":"COMMON_BUILTINS", | 
 |                                 "essl_extension":"ANGLE_multi_draw", | 
 |                                 "type":{ | 
 |                                     "basic":"Int", | 
 |                                     "precision":"High", | 
 |                                     "qualifier":"DrawID" | 
 |                                 } | 
 |                             } | 
 |                         } | 
 |                     } | 
 |                 } | 
 |             }, | 
 |             "ANGLEBaseVertexBaseInstance":{ | 
 |                 "subgroups":{ | 
 |                   "ESSL3":{ | 
 |                         "variables":{ | 
 |                             "gl_BaseVertex":{ | 
 |                                 "essl_level":"ESSL3_BUILTINS", | 
 |                                 "essl_extension":"ANGLE_base_vertex_base_instance", | 
 |                                 "type":{ | 
 |                                     "basic":"Int", | 
 |                                     "precision":"High", | 
 |                                     "qualifier":"BaseVertex" | 
 |                                 } | 
 |                             }, | 
 |                             "gl_BaseInstance":{ | 
 |                                 "essl_level":"ESSL3_BUILTINS", | 
 |                                 "essl_extension":"ANGLE_base_vertex_base_instance", | 
 |                                 "type":{ | 
 |                                     "basic":"Int", | 
 |                                     "precision":"High", | 
 |                                     "qualifier":"BaseInstance" | 
 |                                 } | 
 |                             }, | 
 |                             "angle_BaseVertex":{ | 
 |                                 "essl_level":"COMMON_BUILTINS", | 
 |                                 "essl_extension":"ANGLE_base_vertex_base_instance", | 
 |                                 "type":{ | 
 |                                     "basic":"Int", | 
 |                                     "precision":"High", | 
 |                                     "qualifier":"BaseVertex" | 
 |                                 } | 
 |                             }, | 
 |                             "angle_BaseInstance":{ | 
 |                                 "essl_level":"COMMON_BUILTINS", | 
 |                                 "essl_extension":"ANGLE_base_vertex_base_instance", | 
 |                                 "type":{ | 
 |                                     "basic":"Int", | 
 |                                     "precision":"High", | 
 |                                     "qualifier":"BaseInstance" | 
 |                                 } | 
 |                             } | 
 |                         } | 
 |                     } | 
 |                 } | 
 |             } | 
 |         } | 
 |     }, | 
 |     "ComputeShader":{ | 
 |         "shader_type": "COMPUTE", | 
 |         "variables":{ | 
 |             "gl_NumWorkGroups":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"UInt", | 
 |                     "precision":"Undefined", | 
 |                     "qualifier":"NumWorkGroups", | 
 |                     "primarySize":3 | 
 |                 } | 
 |             }, | 
 |             "gl_WorkGroupSize":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"UInt", | 
 |                     "precision":"Undefined", | 
 |                     "qualifier":"WorkGroupSize", | 
 |                     "primarySize":3 | 
 |                 } | 
 |             }, | 
 |             "gl_WorkGroupID":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"UInt", | 
 |                     "precision":"Undefined", | 
 |                     "qualifier":"WorkGroupID", | 
 |                     "primarySize":3 | 
 |                 } | 
 |             }, | 
 |             "gl_LocalInvocationID":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"UInt", | 
 |                     "precision":"Undefined", | 
 |                     "qualifier":"LocalInvocationID", | 
 |                     "primarySize":3 | 
 |                 } | 
 |             }, | 
 |             "gl_GlobalInvocationID":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"UInt", | 
 |                     "precision":"Undefined", | 
 |                     "qualifier":"GlobalInvocationID", | 
 |                     "primarySize":3 | 
 |                 } | 
 |             }, | 
 |             "gl_LocalInvocationIndex":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "type":{ | 
 |                     "basic":"UInt", | 
 |                     "precision":"Undefined", | 
 |                     "qualifier":"LocalInvocationIndex" | 
 |                 } | 
 |             } | 
 |         } | 
 |     }, | 
 |     "GeometryShader":{ | 
 |         "shader_type": "GEOMETRY_EXT", | 
 |         "variables":{ | 
 |             "gl_PrimitiveIDIn":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "essl_extension":"EXT_geometry_shader", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"PrimitiveIDIn" | 
 |                 } | 
 |             }, | 
 |             "gl_InvocationID":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "essl_extension":"EXT_geometry_shader", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"InvocationID" | 
 |                 } | 
 |             }, | 
 |             "gl_PrimitiveID":{ | 
 |                 "suffix":"GS", | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "essl_extension":"EXT_geometry_shader", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"PrimitiveID" | 
 |                 } | 
 |             }, | 
 |             "gl_Layer":{ | 
 |                 "suffix":"GS", | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "essl_extension":"EXT_geometry_shader", | 
 |                 "type":{ | 
 |                     "basic":"Int", | 
 |                     "precision":"High", | 
 |                     "qualifier":"Layer" | 
 |                 } | 
 |             }, | 
 |             "gl_PerVertex":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "essl_extension":"EXT_geometry_shader", | 
 |                 "class":"TInterfaceBlock", | 
 |                 "fields":{ | 
 |                     "gl_Position":{ | 
 |                         "basic":"Float", | 
 |                         "precision":"High", | 
 |                         "qualifier":"Position", | 
 |                         "primarySize":4 | 
 |                     } | 
 |                 } | 
 |             }, | 
 |             "gl_in":{ | 
 |                 "essl_level":"ESSL3_1_BUILTINS", | 
 |                 "essl_extension":"EXT_geometry_shader", | 
 |                 "initDynamicType":"TType *{type_name} = new TType(gl_PerVertex, EvqPerVertexIn, TLayoutQualifier::Create()); {type_name}->makeArray(0u);", | 
 |                 "comment":"The array size of gl_in is undefined until we get a valid input primitive declaration." | 
 |             } | 
 |         }, | 
 |         "subgroups":{ | 
 |             "Out":{ | 
 |                 "variables":{ | 
 |                     "gl_PerVertex":{ | 
 |                         "suffix":"OutBlock", | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "private":true, | 
 |                         "class":"TInterfaceBlock", | 
 |                         "fields":{ | 
 |                             "gl_Position":{ | 
 |                                 "basic":"Float", | 
 |                                 "precision":"High", | 
 |                                 "qualifier":"Position", | 
 |                                 "primarySize":4 | 
 |                             } | 
 |                         } | 
 |                     }, | 
 |                     "gl_Position":{ | 
 |                         "suffix":"GS", | 
 |                         "essl_level":"ESSL3_1_BUILTINS", | 
 |                         "essl_extension":"EXT_geometry_shader", | 
 |                         "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqPosition, 4); {type_name}->setInterfaceBlock(gl_PerVertexOutBlock);" | 
 |                     } | 
 |                 } | 
 |             } | 
 |         } | 
 |     }, | 
 |     "Multiview":{ | 
 |         "shader_type": "NOT_COMPUTE", | 
 |         "subgroups":{ | 
 |             "ESSL3":{ | 
 |                 "variables":{ | 
 |                     "gl_ViewID_OVR":{ | 
 |                         "essl_level":"ESSL3_BUILTINS", | 
 |                         "essl_extension":"OVR_multiview", | 
 |                         "type":{ | 
 |                             "basic":"UInt", | 
 |                             "precision":"High", | 
 |                             "qualifier":"ViewIDOVR" | 
 |                         } | 
 |                     } | 
 |                 } | 
 |             } | 
 |         } | 
 |     } | 
 | } |