{
    "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.",
            "   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.",
            "   essl_extension_becomes_core_in: Optional. ESSL level where symbols from this",
            "                                   extension have become core.",
            "   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);"
            }
        },
        "subgroups":{
            "OESSampleVariables":{
                "variables":{
                    "gl_NumSamples":{
                        "essl_level":"ESSL3_BUILTINS",
                        "essl_extension":"OES_sample_variables",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Low",
                            "qualifier":"Uniform"
                        }
                    }
                }
            }
        }
    },
    "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, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxGeometryOutputComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxGeometryImageUniforms":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxGeometryTextureImageUnits":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxGeometryOutputVertices":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxGeometryTotalOutputComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxGeometryUniformComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxGeometryAtomicCounters":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxGeometryAtomicCounterBuffers":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    }
                }
            },
            "EXTTessellationShader":{
                "variables":{
                    "gl_MaxTessControlInputComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessControlOutputComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessControlTextureImageUnits":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessControlUniformComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessControlTotalOutputComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessControlImageUniforms":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessControlAtomicCounters":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessControlAtomicCounterBuffers":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessPatchComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxPatchVertices":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessGenLevel":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessEvaluationInputComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessEvaluationOutputComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessEvaluationTextureImageUnits":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessEvaluationUniformComponents":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessEvaluationImageUniforms":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessEvaluationAtomicCounters":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    },
                    "gl_MaxTessEvaluationAtomicCounterBuffers":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    }
                }
            },
            "OESSampleVariables":{
                "variables":{
                    "gl_MaxSamples":{
                        "essl_level":"ESSL3_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"OES_sample_variables",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "value":"resources"
                    }
                }
            },
            "APPLEClipDistance":{
                "variables":{
                    "gl_MaxClipDistances":{
                        "essl_level":"COMMON_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"APPLE_clip_distance",
                        "value":"resources",
                        "suffix": "APPLE"
                    }
                }
            },
            "EXTClipCullDistance":{
                "variables":{
                    "gl_MaxClipDistances":{
                        "essl_level":"ESSL3_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_clip_cull_distance, ANGLE_clip_cull_distance",
                        "value":"resources"
                    },
                    "gl_MaxCullDistances":{
                        "essl_level":"ESSL3_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_clip_cull_distance, ANGLE_clip_cull_distance",
                        "value":"resources"
                    },
                    "gl_MaxCombinedClipAndCullDistances":{
                        "essl_level":"ESSL3_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Medium",
                            "qualifier":"Const"
                        },
                        "essl_extension":"EXT_clip_cull_distance, ANGLE_clip_cull_distance",
                        "value":"resources"
                    }
                }
            }
        }
    },
    "FragShader":{
        "shader_type": "FRAGMENT",
        "variables":{
            "gl_FragCoord":{
                "essl_level":"ESSL1_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":{
            "ES300":{
                "variables":{
                    "gl_FragCoord":{
                        "essl_level":"ESSL3_BUILTINS",
                        "suffix":"300",
                        "type":{
                            "basic":"Float",
                            "precision":"High",
                            "qualifier":"FragCoord",
                            "primarySize":4
                        }
                    }
                }
            },
            "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, EvqFragDepth, 1);"
                    }
                }
            },
            "EXTShaderFramebufferFetch":{
                "variables":{
                    "gl_LastFragData":{
                        "essl_level":"ESSL1_BUILTINS",
                        "essl_extension":"EXT_shader_framebuffer_fetch, EXT_shader_framebuffer_fetch_non_coherent",
                        "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":"COMMON_BUILTINS",
                        "essl_extension":"ARM_shader_framebuffer_fetch",
                        "type":{
                            "basic":"Float",
                            "precision":"Medium",
                            "qualifier":"LastFragColor",
                            "primarySize":4
                        }
                    }
                }
            },
            "ARMShaderFramebufferFetchDepthStencil":{
                "variables":{
                    "gl_LastFragDepthARM":{
                        "essl_level":"COMMON_BUILTINS",
                        "essl_extension":"ARM_shader_framebuffer_fetch_depth_stencil",
                        "type":{
                            "comment": "Precision can be Medium on ESSL1 without GL_FRAGMENT_PRECISION_HIGH, but ANGLE always supports that where this extension is exposed",
                            "basic":"Float",
                            "precision":"High",
                            "qualifier":"LastFragDepth"
                        }
                    },
                    "gl_LastFragStencilARM":{
                        "essl_level":"COMMON_BUILTINS",
                        "essl_extension":"ARM_shader_framebuffer_fetch_depth_stencil",
                        "type":{
                            "basic":"Int",
                            "precision":"Low",
                            "qualifier":"LastFragStencil"
                        }
                    }
                }
            },
            "GeometryShaderSupported":{
                "variables":{
                    "gl_PrimitiveID":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"High",
                            "qualifier":"PrimitiveID"
                        }
                    },
                    "gl_Layer":{
                        "essl_level":"ESSL3_1_BUILTINS",
                        "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"High",
                            "qualifier":"LayerIn"
                        }
                    }
                }
            },
            "OESSampleVariables":{
                "variables":{
                    "gl_SampleID":{
                        "essl_level":"ESSL3_BUILTINS",
                        "essl_extension":"OES_sample_variables",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "type":{
                            "basic":"Int",
                            "precision":"Low",
                            "qualifier":"SampleID"
                        }
                    },
                    "gl_SamplePosition":{
                        "essl_level":"ESSL3_BUILTINS",
                        "essl_extension":"OES_sample_variables",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "type":{
                            "basic":"Float",
                            "precision":"Medium",
                            "primarySize":2,
                            "qualifier":"SamplePosition"
                        }
                    },
                    "gl_SampleMaskIn":{
                        "essl_level":"ESSL3_BUILTINS",
                        "essl_extension":"OES_sample_variables",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "initDynamicType":"TType *{type_name} = new TType(EbtInt, EbpHigh, EvqSampleMaskIn, 1); {type_name}->makeArray((resources.MaxSamples+31)/32);"
                    },
                    "gl_SampleMask":{
                        "essl_level":"ESSL3_BUILTINS",
                        "essl_extension":"OES_sample_variables",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "initDynamicType":"TType *{type_name} = new TType(EbtInt, EbpHigh, EvqSampleMask, 1); {type_name}->makeArray((resources.MaxSamples+31)/32);"
                    }
                }
            }
        }
    },
    "VertexShader":{
        "shader_type": "VERTEX",
        "variables":{
            "gl_Position":{
                "essl_level":"COMMON_BUILTINS",
                "type":{
                    "basic":"Float",
                    "precision":"High",
                    "qualifier":"Position",
                    "primarySize":4
                }
            },
            "gl_PointSize":{
                "essl_level":"ESSL1_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":"ESSL_INTERNAL_BACKEND_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"InstanceID",
                    "comment": "Used internally for SPIR-V generation, not exposed to application"
                }
            },
            "gl_VertexID":{
                "essl_level":"ESSL3_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"VertexID"
                }
            },
            "gl_VertexIndex":{
                "essl_level":"ESSL_INTERNAL_BACKEND_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"VertexID",
                    "comment": "Used internally for SPIR-V generation, not exposed to application"
                }
            },
            "gl_Layer":{
                "suffix":"VS",
                "comment":"gl_Layer exists in other shader stages in ESSL, but not in vertex shader so far. Used internally for mulitview emulation",
                "essl_level":"ESSL_INTERNAL_BACKEND_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"LayerOut"
                }
             }
        },
        "subgroups":{
            "ES300":{
                "variables":{
                    "gl_PointSize":{
                        "essl_level":"ESSL3_BUILTINS",
                        "suffix":"300",
                        "type":{
                            "basic":"Float",
                            "precision":"High",
                            "qualifier":"PointSize"
                        }
                    }
                }
            },
            "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_shader_builtin",
                                "type":{
                                    "basic":"Int",
                                    "precision":"High",
                                    "qualifier":"Uniform"
                                }
                            },
                            "gl_BaseInstance":{
                                "essl_level":"ESSL3_BUILTINS",
                                "essl_extension":"ANGLE_base_vertex_base_instance_shader_builtin",
                                "type":{
                                    "basic":"Int",
                                    "precision":"High",
                                    "qualifier":"Uniform"
                                }
                            },
                            "angle_BaseVertex":{
                                "essl_level":"COMMON_BUILTINS",
                                "essl_extension":"ANGLE_base_vertex_base_instance_shader_builtin",
                                "type":{
                                    "basic":"Int",
                                    "precision":"High",
                                    "qualifier":"Uniform"
                                }
                            },
                            "angle_BaseInstance":{
                                "essl_level":"COMMON_BUILTINS",
                                "essl_extension":"ANGLE_base_vertex_base_instance_shader_builtin",
                                "type":{
                                    "basic":"Int",
                                    "precision":"High",
                                    "qualifier":"Uniform"
                                }
                            }
                        }
                    }
                }
            },
            "APPLEClipDistance":{
                "variables":{
                    "gl_ClipDistance":{
                        "essl_level":"COMMON_BUILTINS",
                        "essl_extension":"APPLE_clip_distance",
                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqClipDistance, 1); {type_name}->makeArray(resources.MaxClipDistances);",
                        "suffix": "APPLE"
                    }
                }
            }
        }
    },
    "ComputeShader":{
        "shader_type": "COMPUTE",
        "variables":{
            "gl_NumWorkGroups":{
                "essl_level":"ESSL3_1_BUILTINS",
                "type":{
                    "basic":"UInt",
                    "precision":"High",
                    "qualifier":"NumWorkGroups",
                    "primarySize":3
                }
            },
            "gl_WorkGroupSize":{
                "essl_level":"ESSL3_1_BUILTINS",
                "type":{
                    "basic":"UInt",
                    "precision":"High",
                    "qualifier":"WorkGroupSize",
                    "primarySize":3
                }
            },
            "gl_WorkGroupID":{
                "essl_level":"ESSL3_1_BUILTINS",
                "type":{
                    "basic":"UInt",
                    "precision":"High",
                    "qualifier":"WorkGroupID",
                    "primarySize":3
                }
            },
            "gl_LocalInvocationID":{
                "essl_level":"ESSL3_1_BUILTINS",
                "type":{
                    "basic":"UInt",
                    "precision":"High",
                    "qualifier":"LocalInvocationID",
                    "primarySize":3
                }
            },
            "gl_GlobalInvocationID":{
                "essl_level":"ESSL3_1_BUILTINS",
                "type":{
                    "basic":"UInt",
                    "precision":"High",
                    "qualifier":"GlobalInvocationID",
                    "primarySize":3
                }
            },
            "gl_LocalInvocationIndex":{
                "essl_level":"ESSL3_1_BUILTINS",
                "type":{
                    "basic":"UInt",
                    "precision":"High",
                    "qualifier":"LocalInvocationIndex"
                }
            }
        }
    },
    "GeometryShader":{
        "shader_type": "GEOMETRY_EXT",
        "variables":{
            "gl_PrimitiveIDIn":{
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"PrimitiveIDIn"
                }
            },
            "gl_InvocationID":{
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"InvocationID"
                }
            },
            "gl_PrimitiveID":{
                "suffix":"GS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"PrimitiveID"
                }
            },
            "gl_Layer":{
                "suffix":"GS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"LayerOut"
                }
            },
            "gl_PerVertex":{
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_geometry_shader, OES_geometry_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "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, OES_geometry_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "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, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "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, OES_geometry_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqPosition, 4); {type_name}->setInterfaceBlock(gl_PerVertexOutBlock{ext_or_core_suffix});"
                    }
                }
            }
        }
    },
    "TessellationControlShader":{
        "shader_type": "TESS_CONTROL_EXT",
        "variables":{
            "gl_PatchVerticesIn":{
                "suffix":"TCS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"PatchVerticesIn"
                }
            },
            "gl_InvocationID":{
                "suffix":"TCS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"InvocationID"
                }
            },
            "gl_PrimitiveID":{
                "suffix":"TCS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"PrimitiveID"
                }
            },
            "gl_TessLevelOuter":{
                "suffix":"TCS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqTessLevelOuter, 1); {type_name}->makeArray(4u);"
            },
            "gl_TessLevelInner":{
                "suffix":"TCS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqTessLevelInner, 1); {type_name}->makeArray(2u);"
            },
            "gl_PerVertex":{
                "suffix":"TCS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "class":"TInterfaceBlock",
                "fields":{
                    "gl_Position":{
                        "basic":"Float",
                        "precision":"High",
                        "qualifier":"Position",
                        "primarySize":4
                    }
                }
            },
            "gl_in":{
                "suffix":"TCS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "initDynamicType":"TType *{type_name} = new TType(gl_PerVertex, EvqPerVertexIn, TLayoutQualifier::Create()); {type_name}->makeArray(resources.MaxPatchVertices);"
            },
            "gl_out":{
                "suffix":"TCS",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "initDynamicType":"TType *{type_name} = new TType(gl_PerVertex, EvqPerVertexOut, TLayoutQualifier::Create()); {type_name}->makeArray(resources.MaxPatchVertices);"
            },
            "gl_BoundingBox":{
                "suffix":"TCS",
                "essl_level":"ESSL3_2_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqBoundingBox, 4); {type_name}->makeArray(2u);"
            }
        },
        "subgroups":{
            "Out":{
                "variables":{
                    "gl_PerVertex":{
                        "suffix":"OutTcsBlock",
                        "essl_level":"ESSL3_1_BUILTINS",
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "private":true,
                        "class":"TInterfaceBlock",
                        "fields":{
                            "gl_Position":{
                                "basic":"Float",
                                "precision":"High",
                                "qualifier":"Position",
                                "primarySize":4
                            }
                        }
                    },
                    "gl_Position":{
                        "suffix":"TCS",
                        "essl_level":"ESSL3_1_BUILTINS",
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqPosition, 4); {type_name}->setInterfaceBlock(gl_PerVertexOutTcsBlock{ext_or_core_suffix});"
                    }
                }
            },
            "EXTPrimitiveBoundingBox":{
                "variables":{
                    "gl_BoundingBoxEXT":{
                        "suffix":"TCS",
                        "essl_level":"ESSL3_1_BUILTINS",
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqBoundingBox, 4); {type_name}->makeArray(2u);"
                    }
                }
            },
            "OESPrimitiveBoundingBox":{
                "variables":{
                    "gl_BoundingBoxOES":{
                        "suffix":"TCS",
                        "essl_level":"ESSL3_1_BUILTINS",
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqBoundingBox, 4); {type_name}->makeArray(2u);"
                    }
                }
            }
        }
    },
    "TessellationEvaluationShader":{
        "shader_type": "TESS_EVALUATION_EXT",
        "variables":{
            "gl_PatchVerticesIn":{
                "suffix":"TES",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"PatchVerticesIn"
                }
            },
            "gl_PrimitiveID":{
                "suffix":"TES",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "type":{
                    "basic":"Int",
                    "precision":"High",
                    "qualifier":"PrimitiveID"
                }
            },
            "gl_TessCoord":{
                "essl_level":"ESSL3_1_BUILTINS",
                "type":{
                    "basic":"Float",
                    "precision":"High",
                    "primarySize":3,
                    "qualifier":"TessCoord"
                }
            },
            "gl_TessLevelOuter":{
                "suffix":"TES",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqTessLevelOuter, 1); {type_name}->makeArray(4u);"
            },
            "gl_TessLevelInner":{
                "suffix":"TES",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqTessLevelInner, 1); {type_name}->makeArray(2u);"
            },
            "gl_PerVertex":{
                "suffix":"TES",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "class":"TInterfaceBlock",
                "fields":{
                    "gl_Position":{
                        "basic":"Float",
                        "precision":"High",
                        "qualifier":"Position",
                        "primarySize":4
                    }
                }
            },
            "gl_in":{
                "suffix":"TES",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "initDynamicType":"TType *{type_name} = new TType(gl_PerVertex, EvqPerVertexIn, TLayoutQualifier::Create()); {type_name}->makeArray(resources.MaxPatchVertices);"
            },
            "gl_out":{
                "suffix":"TES",
                "essl_level":"ESSL3_1_BUILTINS",
                "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                "initDynamicType":"TType *{type_name} = new TType(gl_PerVertex, EvqPerVertexOut, TLayoutQualifier::Create()); {type_name}->makeArray(resources.MaxPatchVertices);"
            }
        },
        "subgroups":{
            "Out":{
                "variables":{
                    "gl_PerVertex":{
                        "suffix":"OutTesBlock",
                        "essl_level":"ESSL3_1_BUILTINS",
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "private":true,
                        "class":"TInterfaceBlock",
                        "fields":{
                            "gl_Position":{
                                "basic":"Float",
                                "precision":"High",
                                "qualifier":"Position",
                                "primarySize":4
                            }
                        }
                    },
                    "gl_Position":{
                        "suffix":"TES",
                        "essl_level":"ESSL3_1_BUILTINS",
                        "essl_extension":"EXT_tessellation_shader, OES_tessellation_shader",
                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqPosition, 4); {type_name}->setInterfaceBlock(gl_PerVertexOutTesBlock{ext_or_core_suffix});"
                    }
                }
            }
        }
    },
    "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"
                        }
                    }
                }
            }
        }
    },
    "ClipCullDistance":{
        "shader_type": "NOT_COMPUTE",
        "subgroups":{
            "ESSL3":{
                "variables":{
                    "gl_ClipDistance":{
                        "essl_level":"ESSL3_BUILTINS",
                        "essl_extension":"EXT_clip_cull_distance, ANGLE_clip_cull_distance",
                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqClipDistance, 1); {type_name}->makeArray(resources.MaxClipDistances);"
                    },
                    "gl_CullDistance":{
                        "essl_level":"ESSL3_BUILTINS",
                        "essl_extension":"EXT_clip_cull_distance, ANGLE_clip_cull_distance",
                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqCullDistance, 1); {type_name}->makeArray(resources.MaxCullDistances);"
                    }
                }
            }
        }
    }
}
