diff --git a/spec/gen_spec.py b/spec/gen_spec.py
index 697801b..ea6e07d 100755
--- a/spec/gen_spec.py
+++ b/spec/gen_spec.py
@@ -109,6 +109,11 @@ def process_docs_gl_file(path):
                 variable['description'] = description
                 variable['versions'] = version_support[0]
                 variables.append(variable)
+            if 'gl_Position' in path:
+                variable = { 'name': 'gl_Position', 'type': 'vec4' }
+                variable['description'] = description
+                variable['versions'] = version_support[0]
+                variables.append(variable)
         else:
             for i, node in enumerate(soup.find_all(attrs={'class':'funcprototype-table'})):
                 prototype = parse_prototype(node.getText())
@@ -116,7 +121,6 @@ def process_docs_gl_file(path):
                 prototype['versions'] = version_support[min(i, len(version_support) - 1)]
                 functions.append(prototype)
 
-
 def paragraph_to_markdown(paragraph):
     if paragraph.math is not None and paragraph.math.mtable is not None:
         return '```\n' + expand_math(paragraph.math.mtable).replace('δ  ', 'δ') + '\n```\n'
diff --git a/spec/spec.json b/spec/spec.json
index ae0667e..1bc722d 100644
--- a/spec/spec.json
+++ b/spec/spec.json
@@ -3426,6 +3426,30 @@
         450
       ]
     },
+    {
+      "name": "gl_Position",
+      "type": "vec4",
+      "description": [
+        "In the vertex, tessellation evaluation and geometry languages, a single global instance of the `gl_PerVertex` named block is available and its `gl_Position` member is an output that receives the homogeneous vertex position. It may be written at any time during shader execution. The value written to `gl_Position` will be used by primitive assembly, clipping, culling and other fixed functionality operations, if present, that operate on primitives after vertex processing has occurred.",
+        "In the tessellation control language, the `gl_PerVertex` named block is used to construct an array, `gl_out[]`, whose `gl_Position` members hold the homogeneous control point position, which become available as inputs to the subsequent tessellation evaluation shader.",
+        "The value of `gl_Position` (or the `gl_Position` member of the `gl_out[]` array, in the case of the tessellation control shader) is undefined after the vertex, tessellation control, and tessellation evaluation shading stages if the corresponding shader executable does not write to gl_Position. It is also undefined after the geometry processing stage if the geometry shader executable calls EmitVertex without having written `gl_Position` since the last call to EmitVertex (or hasn't written it at all).",
+        "In the tessellation control, tessellation evaluation and geometry languages, the `gl_PerVertex` named block is used to construct an array, `gl_in[]` of per-vertex or per-control point inputs whose content represents the corresponding outputs written by the previous stage."
+      ],
+      "versions": [
+        110,
+        120,
+        130,
+        140,
+        150,
+        330,
+        400,
+        410,
+        420,
+        430,
+        440,
+        450
+      ]
+    },
     {
       "modifiers": "in",
       "type": "int",
@@ -3532,7 +3556,7 @@
       "name": "gl_RayFlagsCullBackFacingTrianglesEXT",
       "default_value": "16U",
       "extensions": [
-        "GL_EXT_ray_query"
+        "GL_EXT_ray_tracing"
       ]
     },
     {
@@ -3541,7 +3565,7 @@
       "name": "gl_RayFlagsCullBackFacingTrianglesEXT",
       "default_value": "16U",
       "extensions": [
-        "GL_EXT_ray_tracing"
+        "GL_EXT_ray_query"
       ]
     },
     {
@@ -3559,7 +3583,7 @@
       "name": "gl_RayFlagsCullFrontFacingTrianglesEXT",
       "default_value": "32U",
       "extensions": [
-        "GL_EXT_ray_query"
+        "GL_EXT_ray_tracing"
       ]
     },
     {
@@ -3568,7 +3592,7 @@
       "name": "gl_RayFlagsCullFrontFacingTrianglesEXT",
       "default_value": "32U",
       "extensions": [
-        "GL_EXT_ray_tracing"
+        "GL_EXT_ray_query"
       ]
     },
     {
@@ -3586,7 +3610,7 @@
       "name": "gl_RayFlagsCullNoOpaqueEXT",
       "default_value": "128U",
       "extensions": [
-        "GL_EXT_ray_query"
+        "GL_EXT_ray_tracing"
       ]
     },
     {
@@ -3595,7 +3619,7 @@
       "name": "gl_RayFlagsCullNoOpaqueEXT",
       "default_value": "128U",
       "extensions": [
-        "GL_EXT_ray_tracing"
+        "GL_EXT_ray_query"
       ]
     },
     {
@@ -3613,7 +3637,7 @@
       "name": "gl_RayFlagsCullOpaqueEXT",
       "default_value": "64U",
       "extensions": [
-        "GL_EXT_ray_query"
+        "GL_EXT_ray_tracing"
       ]
     },
     {
@@ -3622,7 +3646,7 @@
       "name": "gl_RayFlagsCullOpaqueEXT",
       "default_value": "64U",
       "extensions": [
-        "GL_EXT_ray_tracing"
+        "GL_EXT_ray_query"
       ]
     },
     {
@@ -3649,7 +3673,7 @@
       "name": "gl_RayFlagsNoOpaqueEXT",
       "default_value": "2U",
       "extensions": [
-        "GL_EXT_ray_query"
+        "GL_EXT_ray_tracing"
       ]
     },
     {
@@ -3658,7 +3682,7 @@
       "name": "gl_RayFlagsNoOpaqueEXT",
       "default_value": "2U",
       "extensions": [
-        "GL_EXT_ray_tracing"
+        "GL_EXT_ray_query"
       ]
     },
     {
@@ -3675,8 +3699,11 @@
       "type": "uint",
       "name": "gl_RayFlagsNoneEXT",
       "default_value": "0U",
+      "description": [
+        "const uint `gl_RayFlagsNoneEXT` = 0U;\nconst uint `gl_RayFlagsOpaqueEXT` = 1U;\nconst uint `gl_RayFlagsNoOpaqueEXT` = 2U;\nconst uint `gl_RayFlagsTerminateOnFirstHitEXT` = 4U;\nconst uint `gl_RayFlagsSkipClosestHitShaderEXT` = 8U;\nconst uint `gl_RayFlagsCullBackFacingTrianglesEXT` = 16U;\nconst uint `gl_RayFlagsCullFrontFacingTrianglesEXT` = 32U;\nconst uint `gl_RayFlagsCullOpaqueEXT` = 64U;\nconst uint `gl_RayFlagsCullNoOpaqueEXT` = 128U;"
+      ],
       "extensions": [
-        "GL_EXT_ray_query"
+        "GL_EXT_ray_tracing"
       ]
     },
     {
@@ -3684,11 +3711,8 @@
       "type": "uint",
       "name": "gl_RayFlagsNoneEXT",
       "default_value": "0U",
-      "description": [
-        "const uint `gl_RayFlagsNoneEXT` = 0U;\nconst uint `gl_RayFlagsOpaqueEXT` = 1U;\nconst uint `gl_RayFlagsNoOpaqueEXT` = 2U;\nconst uint `gl_RayFlagsTerminateOnFirstHitEXT` = 4U;\nconst uint `gl_RayFlagsSkipClosestHitShaderEXT` = 8U;\nconst uint `gl_RayFlagsCullBackFacingTrianglesEXT` = 16U;\nconst uint `gl_RayFlagsCullFrontFacingTrianglesEXT` = 32U;\nconst uint `gl_RayFlagsCullOpaqueEXT` = 64U;\nconst uint `gl_RayFlagsCullNoOpaqueEXT` = 128U;"
-      ],
       "extensions": [
-        "GL_EXT_ray_tracing"
+        "GL_EXT_ray_query"
       ]
     },
     {
@@ -3708,8 +3732,11 @@
       "type": "uint",
       "name": "gl_RayFlagsOpaqueEXT",
       "default_value": "1U",
+      "description": [
+        "`gl_RayFlagsNoneEXT` -> NoneKHR ray flag\n`gl_RayFlagsOpaqueEXT` -> OpaqueKHR ray flag\n`gl_RayFlagsNoOpaqueEXT` -> NoOpaqueKHR ray flag\n`gl_RayFlagsTerminateOnFirstHitEXT` -> TerminateOnFirstHitKHR ray flag\n`gl_RayFlagsSkipClosestHitShaderEXT` -> SkipClosestHitShaderKHR ray flag\n`gl_RayFlagsCullBackFacingTrianglesEXT` -> CullBackFacingTrianglesKHR ray flag\n`gl_RayFlagsCullFrontFacingTrianglesEXT` -> CullFrontFacingTrianglesKHR ray flag\n`gl_RayFlagsCullOpaqueEXT` -> CullOpaqueKHR ray flag\n`gl_RayFlagsCullNoOpaqueEXT` -> CullNoOpaqueKHR ray flag"
+      ],
       "extensions": [
-        "GL_EXT_ray_query"
+        "GL_EXT_ray_tracing"
       ]
     },
     {
@@ -3717,11 +3744,8 @@
       "type": "uint",
       "name": "gl_RayFlagsOpaqueEXT",
       "default_value": "1U",
-      "description": [
-        "`gl_RayFlagsNoneEXT` -> NoneKHR ray flag\n`gl_RayFlagsOpaqueEXT` -> OpaqueKHR ray flag\n`gl_RayFlagsNoOpaqueEXT` -> NoOpaqueKHR ray flag\n`gl_RayFlagsTerminateOnFirstHitEXT` -> TerminateOnFirstHitKHR ray flag\n`gl_RayFlagsSkipClosestHitShaderEXT` -> SkipClosestHitShaderKHR ray flag\n`gl_RayFlagsCullBackFacingTrianglesEXT` -> CullBackFacingTrianglesKHR ray flag\n`gl_RayFlagsCullFrontFacingTrianglesEXT` -> CullFrontFacingTrianglesKHR ray flag\n`gl_RayFlagsCullOpaqueEXT` -> CullOpaqueKHR ray flag\n`gl_RayFlagsCullNoOpaqueEXT` -> CullNoOpaqueKHR ray flag"
-      ],
       "extensions": [
-        "GL_EXT_ray_tracing"
+        "GL_EXT_ray_query"
       ]
     },
     {
@@ -3751,7 +3775,7 @@
       "name": "gl_RayFlagsSkipClosestHitShaderEXT",
       "default_value": "8U",
       "extensions": [
-        "GL_EXT_ray_query"
+        "GL_EXT_ray_tracing"
       ]
     },
     {
@@ -3760,7 +3784,7 @@
       "name": "gl_RayFlagsSkipClosestHitShaderEXT",
       "default_value": "8U",
       "extensions": [
-        "GL_EXT_ray_tracing"
+        "GL_EXT_ray_query"
       ]
     },
     {
@@ -3787,7 +3811,7 @@
       "name": "gl_RayFlagsTerminateOnFirstHitEXT",
       "default_value": "4U",
       "extensions": [
-        "GL_EXT_ray_query"
+        "GL_EXT_ray_tracing"
       ]
     },
     {
@@ -3796,7 +3820,7 @@
       "name": "gl_RayFlagsTerminateOnFirstHitEXT",
       "default_value": "4U",
       "extensions": [
-        "GL_EXT_ray_tracing"
+        "GL_EXT_ray_query"
       ]
     },
     {
@@ -5200,6 +5224,24 @@
         450
       ]
     },
+    {
+      "return_type": "uint64_t",
+      "name": "atomicAdd",
+      "parameters": [
+        {
+          "modifiers": "inout",
+          "type": "uint64_t",
+          "name": "mem"
+        },
+        {
+          "type": "uint64_t",
+          "name": "data"
+        }
+      ],
+      "extensions": [
+        "GL_EXT_shader_atomic_int64"
+      ]
+    },
     {
       "return_type": "float",
       "name": "atomicAdd",
@@ -5236,24 +5278,6 @@
         "GL_EXT_shader_atomic_float2"
       ]
     },
-    {
-      "return_type": "uint64_t",
-      "name": "atomicAdd",
-      "parameters": [
-        {
-          "modifiers": "inout",
-          "type": "uint64_t",
-          "name": "mem"
-        },
-        {
-          "type": "uint64_t",
-          "name": "data"
-        }
-      ],
-      "extensions": [
-        "GL_EXT_shader_atomic_int64"
-      ]
-    },
     {
       "return_type": "int",
       "name": "atomicAnd",
@@ -5503,6 +5527,24 @@
         450
       ]
     },
+    {
+      "return_type": "uint64_t",
+      "name": "atomicExchange",
+      "parameters": [
+        {
+          "modifiers": "inout",
+          "type": "uint64_t",
+          "name": "mem"
+        },
+        {
+          "type": "uint64_t",
+          "name": "data"
+        }
+      ],
+      "extensions": [
+        "GL_EXT_shader_atomic_int64"
+      ]
+    },
     {
       "return_type": "float",
       "name": "atomicExchange",
@@ -5539,24 +5581,6 @@
         "GL_EXT_shader_atomic_float2"
       ]
     },
-    {
-      "return_type": "uint64_t",
-      "name": "atomicExchange",
-      "parameters": [
-        {
-          "modifiers": "inout",
-          "type": "uint64_t",
-          "name": "mem"
-        },
-        {
-          "type": "uint64_t",
-          "name": "data"
-        }
-      ],
-      "extensions": [
-        "GL_EXT_shader_atomic_int64"
-      ]
-    },
     {
       "return_type": "float",
       "name": "atomicLoad",
@@ -5657,24 +5681,6 @@
         450
       ]
     },
-    {
-      "return_type": "float",
-      "name": "atomicMax",
-      "parameters": [
-        {
-          "modifiers": "inout",
-          "type": "float",
-          "name": "mem"
-        },
-        {
-          "type": "float",
-          "name": "data"
-        }
-      ],
-      "extensions": [
-        "GL_EXT_shader_atomic_float2"
-      ]
-    },
     {
       "return_type": "uint64_t",
       "name": "atomicMax",
@@ -5693,6 +5699,24 @@
         "GL_EXT_shader_atomic_int64"
       ]
     },
+    {
+      "return_type": "float",
+      "name": "atomicMax",
+      "parameters": [
+        {
+          "modifiers": "inout",
+          "type": "float",
+          "name": "mem"
+        },
+        {
+          "type": "float",
+          "name": "data"
+        }
+      ],
+      "extensions": [
+        "GL_EXT_shader_atomic_float2"
+      ]
+    },
     {
       "return_type": "int",
       "name": "atomicMin",
@@ -5741,24 +5765,6 @@
         450
       ]
     },
-    {
-      "return_type": "float",
-      "name": "atomicMin",
-      "parameters": [
-        {
-          "modifiers": "inout",
-          "type": "float",
-          "name": "mem"
-        },
-        {
-          "type": "float",
-          "name": "data"
-        }
-      ],
-      "extensions": [
-        "GL_EXT_shader_atomic_float2"
-      ]
-    },
     {
       "return_type": "uint64_t",
       "name": "atomicMin",
@@ -5777,6 +5783,24 @@
         "GL_EXT_shader_atomic_int64"
       ]
     },
+    {
+      "return_type": "float",
+      "name": "atomicMin",
+      "parameters": [
+        {
+          "modifiers": "inout",
+          "type": "float",
+          "name": "mem"
+        },
+        {
+          "type": "float",
+          "name": "data"
+        }
+      ],
+      "extensions": [
+        "GL_EXT_shader_atomic_float2"
+      ]
+    },
     {
       "return_type": "int",
       "name": "atomicOr",
@@ -8143,6 +8167,14 @@
         450
       ]
     },
+    {
+      "return_type": "void",
+      "name": "groupMemoryBarrier",
+      "parameters": [],
+      "extensions": [
+        "GL_KHR_memory_scope_semantics"
+      ]
+    },
     {
       "return_type": "void",
       "name": "groupMemoryBarrier",
@@ -8157,14 +8189,6 @@
         "GL_EXT_mesh_shader"
       ]
     },
-    {
-      "return_type": "void",
-      "name": "groupMemoryBarrier",
-      "parameters": [],
-      "extensions": [
-        "GL_KHR_memory_scope_semantics"
-      ]
-    },
     {
       "return_type": "void",
       "name": "groupMemoryBarrier",
@@ -16337,7 +16361,7 @@
       "name": "memoryBarrierShared",
       "parameters": [],
       "extensions": [
-        "GL_EXT_mesh_shader"
+        "GL_KHR_memory_scope_semantics"
       ]
     },
     {
@@ -16345,7 +16369,7 @@
       "name": "memoryBarrierShared",
       "parameters": [],
       "extensions": [
-        "GL_KHR_memory_scope_semantics"
+        "GL_EXT_mesh_shader"
       ]
     },
     {