diff --git a/SPIRV/GLSL.ext.KHR.h b/SPIRV/GLSL.ext.KHR.h
index 7ce795f42f192ab9b6a0c0c149566c9d7691b2e6..344dd398c3bbb11595e44518ddeabc708c280ae5 100644
--- a/SPIRV/GLSL.ext.KHR.h
+++ b/SPIRV/GLSL.ext.KHR.h
@@ -27,25 +27,10 @@
 #ifndef GLSLextKHR_H
 #define GLSLextKHR_H
 
-enum BuiltIn;
-enum Op;
-enum Capability;
-
-static const int GLSLextKHRVersion = 100;
-static const int GLSLextKHRRevision = 1;
-
 // SPV_KHR_shader_ballot
-static const char* const E_SPV_KHR_shader_ballot        = "SPV_KHR_shader_ballot";
-
-static const BuiltIn BuiltInSubgroupEqMaskKHR           = static_cast<BuiltIn>(4416);
-static const BuiltIn BuiltInSubgroupGeMaskKHR           = static_cast<BuiltIn>(4417);
-static const BuiltIn BuiltInSubgroupGtMaskKHR           = static_cast<BuiltIn>(4418);
-static const BuiltIn BuiltInSubgroupLeMaskKHR           = static_cast<BuiltIn>(4419);
-static const BuiltIn BuiltInSubgroupLtMaskKHR           = static_cast<BuiltIn>(4420);
-
-static const Op OpSubgroupBallotKHR                     = static_cast<Op>(4421);
-static const Op OpSubgroupFirstInvocationKHR            = static_cast<Op>(4422);
+static const char* const E_SPV_KHR_shader_ballot                = "SPV_KHR_shader_ballot";
 
-static const Capability CapabilitySubgroupBallotKHR     = static_cast<Capability>(4423);
+// SPV_KHR_shader_draw_parameters
+static const char* const E_SPV_KHR_shader_draw_parameters       = "SPV_KHR_shader_draw_parameters";
 
 #endif  // #ifndef GLSLextKHR_H
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 5ecb6ab9684c98aaf2770db4d3952b01cb8137c0..9c8b8b932c93a7b786052f4b31b44cb94f809b7f 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -498,13 +498,21 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
     case glslang::EbvInstanceId:           return spv::BuiltInInstanceId;
     case glslang::EbvVertexIndex:          return spv::BuiltInVertexIndex;
     case glslang::EbvInstanceIndex:        return spv::BuiltInInstanceIndex;
+
     case glslang::EbvBaseVertex:
+        builder.addExtension(spv::E_SPV_KHR_shader_draw_parameters);
+        builder.addCapability(spv::CapabilityDrawParameters);
+        return spv::BuiltInBaseVertex;
+
     case glslang::EbvBaseInstance:
+        builder.addExtension(spv::E_SPV_KHR_shader_draw_parameters);
+        builder.addCapability(spv::CapabilityDrawParameters);
+        return spv::BuiltInBaseInstance;
 
     case glslang::EbvDrawId:
-        // TODO: Add SPIR-V builtin ID.
-        logger->missingFunctionality("shader draw parameters");
-        return spv::BuiltInMax;
+        builder.addExtension(spv::E_SPV_KHR_shader_draw_parameters);
+        builder.addCapability(spv::CapabilityDrawParameters);
+        return spv::BuiltInDrawIndex;
 
     case glslang::EbvPrimitiveId:
         if (glslangIntermediate->getStage() == EShLangFragment)
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index d2161dd86819870cbbc290154cafeb93da1d1d2a..0e68c7ef0bf2de96f4281fd3748f099971ecd678 100755
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -48,7 +48,6 @@
 namespace spv {
     extern "C" {
         // Include C-based headers that don't have a namespace
-        #include "GLSL.ext.KHR.h"
 #ifdef AMD_EXTENSIONS
         #include "GLSL.ext.AMD.h"
 #endif
@@ -319,6 +318,10 @@ const char* BuiltInString(int builtIn)
     case 4419: return "SubgroupLeMaskKHR";
     case 4420: return "SubgroupLtMaskKHR";
 
+    case 4424: return "BaseVertex";
+    case 4425: return "BaseInstance";
+    case 4426: return "DrawIndex";
+
 #ifdef AMD_EXTENSIONS
     case 4992: return "BaryCoordNoPerspAMD";
     case 4993: return "BaryCoordNoPerspCentroidAMD";
@@ -808,6 +811,7 @@ const char* CapabilityString(int info)
     default: return "Bad";
 
     case 4423: return "SubgroupBallotKHR";
+    case 4427: return "DrawParameters";
     }
 }
 
diff --git a/SPIRV/spirv.hpp b/SPIRV/spirv.hpp
index e3d134257f2de217b77953f59c11aa88b5f9ab9d..bb3c3f4c76bf0dd4671a97d0f144b76af3cf5e91 100755
--- a/SPIRV/spirv.hpp
+++ b/SPIRV/spirv.hpp
@@ -47,11 +47,11 @@ namespace spv {
 typedef unsigned int Id;
 
 #define SPV_VERSION 0x10000
-#define SPV_REVISION 6
+#define SPV_REVISION 8
 
 static const unsigned int MagicNumber = 0x07230203;
 static const unsigned int Version = 0x00010000;
-static const unsigned int Revision = 6;
+static const unsigned int Revision = 8;
 static const unsigned int OpCodeMask = 0xffff;
 static const unsigned int WordCountShift = 16;
 
@@ -420,6 +420,14 @@ enum BuiltIn {
     BuiltInSubgroupLocalInvocationId = 41,
     BuiltInVertexIndex = 42,
     BuiltInInstanceIndex = 43,
+    BuiltInSubgroupEqMaskKHR = 4416,
+    BuiltInSubgroupGeMaskKHR = 4417,
+    BuiltInSubgroupGtMaskKHR = 4418,
+    BuiltInSubgroupLeMaskKHR = 4419,
+    BuiltInSubgroupLtMaskKHR = 4420,
+    BuiltInBaseVertex = 4424,
+    BuiltInBaseInstance = 4425,
+    BuiltInDrawIndex = 4426,
     BuiltInMax = 0x7fffffff,
 };
 
@@ -595,6 +603,8 @@ enum Capability {
     CapabilityStorageImageReadWithoutFormat = 55,
     CapabilityStorageImageWriteWithoutFormat = 56,
     CapabilityMultiViewport = 57,
+    CapabilitySubgroupBallotKHR = 4423,
+    CapabilityDrawParameters = 4427,
     CapabilityMax = 0x7fffffff,
 };
 
@@ -893,6 +903,8 @@ enum Op {
     OpAtomicFlagTestAndSet = 318,
     OpAtomicFlagClear = 319,
     OpImageSparseRead = 320,
+    OpSubgroupBallotKHR = 4421,
+    OpSubgroupFirstInvocationKHR = 4422,
     OpMax = 0x7fffffff,
 };
 
diff --git a/Test/baseResults/spv.shaderDrawParams.vert.out b/Test/baseResults/spv.shaderDrawParams.vert.out
new file mode 100644
index 0000000000000000000000000000000000000000..ad538107fe00d66fd4fe9e0f0c9dc3680e20d9a2
--- /dev/null
+++ b/Test/baseResults/spv.shaderDrawParams.vert.out
@@ -0,0 +1,108 @@
+spv.shaderDrawParams.vert
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked vertex stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 53
+
+                              Capability Shader
+                              Capability DrawParameters
+                              Extension  "SPV_KHR_shader_draw_parameters"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 16 29 37
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_shader_draw_parameters"
+                              Name 4  "main"
+                              Name 9  "gl_BaseVertexARB"
+                              Name 16  "gl_BaseInstanceARB"
+                              Name 27  "gl_PerVertex"
+                              MemberName 27(gl_PerVertex) 0  "gl_Position"
+                              MemberName 27(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 27(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 27(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 29  ""
+                              Name 34  "Block"
+                              MemberName 34(Block) 0  "pos"
+                              Name 36  "block"
+                              Name 37  "gl_DrawIDARB"
+                              Decorate 9(gl_BaseVertexARB) BuiltIn BaseVertex
+                              Decorate 16(gl_BaseInstanceARB) BuiltIn BaseInstance
+                              MemberDecorate 27(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 27(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 27(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 27(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 27(gl_PerVertex) Block
+                              Decorate 31 ArrayStride 16
+                              Decorate 33 ArrayStride 64
+                              MemberDecorate 34(Block) 0 Offset 0
+                              Decorate 34(Block) Block
+                              Decorate 36(block) DescriptorSet 0
+                              Decorate 36(block) Binding 0
+                              Decorate 37(gl_DrawIDARB) BuiltIn DrawIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeBool
+               7:             TypeInt 32 1
+               8:             TypePointer Input 7(int)
+9(gl_BaseVertexARB):      8(ptr) Variable Input
+              11:      7(int) Constant 0
+16(gl_BaseInstanceARB):      8(ptr) Variable Input
+              22:             TypeFloat 32
+              23:             TypeVector 22(float) 4
+              24:             TypeInt 32 0
+              25:     24(int) Constant 1
+              26:             TypeArray 22(float) 25
+27(gl_PerVertex):             TypeStruct 23(fvec4) 22(float) 26 26
+              28:             TypePointer Output 27(gl_PerVertex)
+              29:     28(ptr) Variable Output
+              30:     24(int) Constant 4
+              31:             TypeArray 23(fvec4) 30
+              32:     24(int) Constant 2
+              33:             TypeArray 31 32
+       34(Block):             TypeStruct 33
+              35:             TypePointer Uniform 34(Block)
+       36(block):     35(ptr) Variable Uniform
+37(gl_DrawIDARB):      8(ptr) Variable Input
+              39:      7(int) Constant 4
+              41:             TypePointer Uniform 23(fvec4)
+              44:             TypePointer Output 23(fvec4)
+              47:      7(int) Constant 1
+         4(main):           2 Function None 3
+               5:             Label
+              10:      7(int) Load 9(gl_BaseVertexARB)
+              12:     6(bool) SGreaterThan 10 11
+              13:     6(bool) LogicalNot 12
+                              SelectionMerge 15 None
+                              BranchConditional 13 14 15
+              14:               Label
+              17:      7(int)   Load 16(gl_BaseInstanceARB)
+              18:     6(bool)   SGreaterThan 17 11
+                                Branch 15
+              15:             Label
+              19:     6(bool) Phi 12 5 18 14
+                              SelectionMerge 21 None
+                              BranchConditional 19 20 46
+              20:               Label
+              38:      7(int)   Load 37(gl_DrawIDARB)
+              40:      7(int)   SMod 38 39
+              42:     41(ptr)   AccessChain 36(block) 11 11 40
+              43:   23(fvec4)   Load 42
+              45:     44(ptr)   AccessChain 29 11
+                                Store 45 43
+                                Branch 21
+              46:               Label
+              48:      7(int)   Load 37(gl_DrawIDARB)
+              49:      7(int)   SMod 48 39
+              50:     41(ptr)   AccessChain 36(block) 11 47 49
+              51:   23(fvec4)   Load 50
+              52:     44(ptr)   AccessChain 29 11
+                                Store 52 51
+                                Branch 21
+              21:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/spv.shaderDrawParams.vert b/Test/spv.shaderDrawParams.vert
new file mode 100644
index 0000000000000000000000000000000000000000..15ae2953a1646f875fda0f4dd205d1d0d2d93d19
--- /dev/null
+++ b/Test/spv.shaderDrawParams.vert
@@ -0,0 +1,16 @@
+#version 450 core
+
+#extension GL_ARB_shader_draw_parameters: enable
+
+layout(binding = 0) uniform Block
+{
+    vec4 pos[2][4];
+} block;
+
+void main()
+{
+    if ((gl_BaseVertexARB > 0) || (gl_BaseInstanceARB > 0))
+        gl_Position = block.pos[0][gl_DrawIDARB % 4];
+    else
+        gl_Position = block.pos[1][gl_DrawIDARB % 4];
+}
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index f109911ec93983840a0c769207438e0a812e2e8f..64312a3ac222a6c1c57823654d3d5aaf128d255b 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -237,6 +237,7 @@ INSTANTIATE_TEST_CASE_P(
         "spv.prepost.frag",
         "spv.qualifiers.vert",
         "spv.shaderBallot.comp",
+        "spv.shaderDrawParams.vert",
         "spv.shaderGroupVote.comp",
         "spv.shiftOps.frag",
         "spv.simpleFunctionCall.frag",