WIP: Support SPIR-V 1.3, and Vulkan 1.1

Includes support for:
- New subgroup functionality SPIR-V!64
- fix for 16bit storage capabilities dependency SPIR-V#137
- OpenCL.std.h enum fixes SPIR-V!72
- OpenCL.std.h fix missing comma SPIR-V!75
- SPV_KHR_variable_pointers
- SPV_KHR_storage_buffer_storage_class spirv-extensions!73
- Vulkan 1.1 subgroups capability fixes for BuiltIns: SPIR-V#135
diff --git a/include/spirv-tools/libspirv.h b/include/spirv-tools/libspirv.h
index b7bcc0f..f497f36 100644
--- a/include/spirv-tools/libspirv.h
+++ b/include/spirv-tools/libspirv.h
@@ -383,6 +383,8 @@
   // There is no variant for OpenGL 4.4.
   SPV_ENV_OPENGL_4_5,     // OpenGL 4.5 plus GL_ARB_gl_spirv, latest revisions.
   SPV_ENV_UNIVERSAL_1_2,  // SPIR-V 1.2, latest revision, no other restrictions.
+  SPV_ENV_UNIVERSAL_1_3,  // SPIR-V 1.3, latest revision, no other restrictions.
+  SPV_ENV_VULKAN_1_1,     // Vulkan 1.1 latest revision.
 } spv_target_env;
 
 // SPIR-V Validator can be parameterized with the following Universal Limits.
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index dd5a5a8..f2265cf 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -51,7 +51,7 @@
   list(APPEND ENUM_STRING_MAPPING_CPP_DEPENDS ${GRAMMAR_ENUM_STRING_MAPPING_INC_FILE})
 endmacro(spvtools_enum_string_mapping)
 
-macro(spvtools_vimsyntax VERSION CLVERSION)
+macro(spvtools_vimsyntax VERSION)
   set(GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/spirv.core.grammar.json")
   set(GLSL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/extinst.glsl.std.450.grammar.json")
   set(OPENCL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/extinst.opencl.std.100.grammar.json")
@@ -112,7 +112,8 @@
 spvtools_core_tables("1.0")
 spvtools_core_tables("1.1")
 spvtools_core_tables("1.2")
-spvtools_enum_string_mapping("1.2")
+spvtools_core_tables("1.3")
+spvtools_enum_string_mapping("1.3")
 spvtools_opencl_tables("1.0")
 spvtools_glsl_tables("1.0")
 spvtools_vendor_tables("spv-amd-shader-explicit-vertex-parameter")
@@ -120,7 +121,7 @@
 spvtools_vendor_tables("spv-amd-gcn-shader")
 spvtools_vendor_tables("spv-amd-shader-ballot")
 
-spvtools_vimsyntax("1.2" "1.0")
+spvtools_vimsyntax("1.3")
 add_custom_target(spirv-tools-vimsyntax DEPENDS ${VIMSYNTAX_FILE})
 set_property(TARGET spirv-tools-vimsyntax PROPERTY FOLDER "SPIRV-Tools utilities")
 
diff --git a/source/assembly_grammar.h b/source/assembly_grammar.h
index cd89a1b..57712eb 100644
--- a/source/assembly_grammar.h
+++ b/source/assembly_grammar.h
@@ -17,7 +17,7 @@
 
 #include "operand.h"
 #include "spirv-tools/libspirv.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 #include "table.h"
 
 namespace libspirv {
diff --git a/source/binary.cpp b/source/binary.cpp
index 2ade254..91556e8 100644
--- a/source/binary.cpp
+++ b/source/binary.cpp
@@ -27,7 +27,7 @@
 #include "ext_inst.h"
 #include "opcode.h"
 #include "operand.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 #include "spirv_constant.h"
 #include "spirv_endian.h"
 
diff --git a/source/enum_set.h b/source/enum_set.h
index 6d3ec73..aa7bdac 100644
--- a/source/enum_set.h
+++ b/source/enum_set.h
@@ -21,7 +21,7 @@
 #include <set>
 #include <utility>
 
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 namespace libspirv {
 
diff --git a/source/enum_string_mapping.h b/source/enum_string_mapping.h
index 773d40c..05bb5dc 100644
--- a/source/enum_string_mapping.h
+++ b/source/enum_string_mapping.h
@@ -17,7 +17,7 @@
 
 #include <string>
 
-#include "spirv/1.1/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 namespace libspirv {
 
diff --git a/source/ext_inst.cpp b/source/ext_inst.cpp
index 71f72fc..a5fc474 100644
--- a/source/ext_inst.cpp
+++ b/source/ext_inst.cpp
@@ -86,6 +86,8 @@
     case SPV_ENV_OPENGL_4_2:
     case SPV_ENV_OPENGL_4_3:
     case SPV_ENV_OPENGL_4_5:
+    case SPV_ENV_UNIVERSAL_1_3:
+    case SPV_ENV_VULKAN_1_1:
       *pExtInstTable = &table_1_0;
       return SPV_SUCCESS;
     default:
diff --git a/source/instruction.h b/source/instruction.h
index 2afa6d4..f93d4b7 100644
--- a/source/instruction.h
+++ b/source/instruction.h
@@ -19,7 +19,7 @@
 #include <vector>
 
 #include "spirv-tools/libspirv.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 // Describes an instruction.
 struct spv_instruction_t {
diff --git a/source/name_mapper.cpp b/source/name_mapper.cpp
index 1accc94..8120da5 100644
--- a/source/name_mapper.cpp
+++ b/source/name_mapper.cpp
@@ -23,7 +23,7 @@
 #include <unordered_set>
 
 #include "spirv-tools/libspirv.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 #include "parsed_operand.h"
 
diff --git a/source/opcode.cpp b/source/opcode.cpp
index 9bb8cb7..7c3966e 100644
--- a/source/opcode.cpp
+++ b/source/opcode.cpp
@@ -32,12 +32,12 @@
   uint32_t len;
 };
 
-OpcodeDescPtrLen getOpcodeTableEntries_1_2() {
-  static const spv_opcode_desc_t opcodeTableEntries_1_2[] = {
-#include "core.insts-1.2.inc"
+OpcodeDescPtrLen getOpcodeTableEntries_1_3() {
+  static const spv_opcode_desc_t opcodeTableEntries_1_3[] = {
+#include "core.insts-1.3.inc"
   };
 
-  return {opcodeTableEntries_1_2, ARRAY_SIZE(opcodeTableEntries_1_2)};
+  return {opcodeTableEntries_1_3, ARRAY_SIZE(opcodeTableEntries_1_3)};
 }
 
 // Represents a vendor tool entry in the SPIR-V XML Regsitry.
@@ -90,14 +90,19 @@
   static const spv_opcode_desc_t opcodeTableEntries_1_1[] = {
 #include "core.insts-1.1.inc"
   };
+  static const spv_opcode_desc_t opcodeTableEntries_1_2[] = {
+#include "core.insts-1.2.inc"
+  };
 
-  const auto ptr_len = getOpcodeTableEntries_1_2();
+  const auto ptr_len = getOpcodeTableEntries_1_3();
 
   static const spv_opcode_table_t table_1_0 = {
       ARRAY_SIZE(opcodeTableEntries_1_0), opcodeTableEntries_1_0};
   static const spv_opcode_table_t table_1_1 = {
       ARRAY_SIZE(opcodeTableEntries_1_1), opcodeTableEntries_1_1};
-  static const spv_opcode_table_t table_1_2 = {ptr_len.len, ptr_len.ptr};
+  static const spv_opcode_table_t table_1_2 = {
+      ARRAY_SIZE(opcodeTableEntries_1_2), opcodeTableEntries_1_2};
+  static const spv_opcode_table_t table_1_3 = {ptr_len.len, ptr_len.ptr};
 
   switch (env) {
     case SPV_ENV_UNIVERSAL_1_0:
@@ -116,6 +121,9 @@
     case SPV_ENV_UNIVERSAL_1_2:
     case SPV_ENV_OPENCL_2_2:
       *pInstTable = &table_1_2;
+    case SPV_ENV_UNIVERSAL_1_3:
+    case SPV_ENV_VULKAN_1_1:
+      *pInstTable = &table_1_3;
       return SPV_SUCCESS;
   }
   assert(0 && "Unknown spv_target_env in spvOpcodeTableGet()");
@@ -183,7 +191,7 @@
 const char* spvOpcodeString(const SpvOp opcode) {
   // Use the latest SPIR-V version, which should be backward-compatible with all
   // previous ones.
-  const auto entries = getOpcodeTableEntries_1_2();
+  const auto entries = getOpcodeTableEntries_1_3();
 
   for (uint32_t i = 0; i < entries.len; ++i) {
     if (entries.ptr[i].opcode == opcode) return entries.ptr[i].name;
diff --git a/source/opcode.h b/source/opcode.h
index 4e06efd..7c59162 100644
--- a/source/opcode.h
+++ b/source/opcode.h
@@ -17,7 +17,7 @@
 
 #include "instruction.h"
 #include "spirv-tools/libspirv.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 #include "table.h"
 
 // Returns the name of a registered SPIR-V generator as a null-terminated
diff --git a/source/operand.cpp b/source/operand.cpp
index 3176eb7..ba17ba3 100644
--- a/source/operand.cpp
+++ b/source/operand.cpp
@@ -27,6 +27,7 @@
 #include "operand.kinds-1.0.inc"
 #include "operand.kinds-1.1.inc"
 #include "operand.kinds-1.2.inc"
+#include "operand.kinds-1.3.inc"
 
   static const spv_operand_table_t table_1_0 = {
       ARRAY_SIZE(pygen_variable_OperandInfoTable_1_0),
@@ -37,6 +38,9 @@
   static const spv_operand_table_t table_1_2 = {
       ARRAY_SIZE(pygen_variable_OperandInfoTable_1_2),
       pygen_variable_OperandInfoTable_1_2};
+  static const spv_operand_table_t table_1_3 = {
+      ARRAY_SIZE(pygen_variable_OperandInfoTable_1_3),
+      pygen_variable_OperandInfoTable_1_3};
 
   switch (env) {
     case SPV_ENV_UNIVERSAL_1_0:
@@ -55,6 +59,9 @@
     case SPV_ENV_UNIVERSAL_1_2:
     case SPV_ENV_OPENCL_2_2:
       *pOperandTable = &table_1_2;
+    case SPV_ENV_UNIVERSAL_1_3:
+    case SPV_ENV_VULKAN_1_1:
+      *pOperandTable = &table_1_3;
       return SPV_SUCCESS;
   }
   assert(0 && "Unknown spv_target_env in spvOperandTableGet()");
diff --git a/source/opt/instruction.h b/source/opt/instruction.h
index 89c9da0..225e1a6 100644
--- a/source/opt/instruction.h
+++ b/source/opt/instruction.h
@@ -23,7 +23,7 @@
 #include "operand.h"
 
 #include "spirv-tools/libspirv.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 namespace spvtools {
 namespace ir {
diff --git a/source/opt/reflect.h b/source/opt/reflect.h
index 16ea0bd..5909a2a 100644
--- a/source/opt/reflect.h
+++ b/source/opt/reflect.h
@@ -15,7 +15,7 @@
 #ifndef LIBSPIRV_OPT_REFLECT_H_
 #define LIBSPIRV_OPT_REFLECT_H_
 
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 namespace spvtools {
 namespace ir {
diff --git a/source/opt/types.h b/source/opt/types.h
index b6b62c5..6942a68 100644
--- a/source/opt/types.h
+++ b/source/opt/types.h
@@ -22,7 +22,7 @@
 #include <vector>
 
 #include "spirv-tools/libspirv.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 namespace spvtools {
 namespace opt {
diff --git a/source/spirv_constant.h b/source/spirv_constant.h
index c70ade1..2458110 100644
--- a/source/spirv_constant.h
+++ b/source/spirv_constant.h
@@ -16,7 +16,7 @@
 #define LIBSPIRV_SPIRV_CONSTANT_H_
 
 #include "spirv-tools/libspirv.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 // Version number macros.
 
diff --git a/source/spirv_definition.h b/source/spirv_definition.h
index b82bda1..46cd1cc 100644
--- a/source/spirv_definition.h
+++ b/source/spirv_definition.h
@@ -17,7 +17,7 @@
 
 #include <cstdint>
 
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 #define spvIsInBitfield(value, bitfield) ((value) == ((value)&bitfield))
 
diff --git a/source/spirv_target_env.cpp b/source/spirv_target_env.cpp
index ed47f52..99fdc3d 100644
--- a/source/spirv_target_env.cpp
+++ b/source/spirv_target_env.cpp
@@ -42,6 +42,10 @@
       return "SPIR-V 1.0 (under OpenCL 4.5 semantics)";
     case SPV_ENV_UNIVERSAL_1_2:
       return "SPIR-V 1.2";
+    case SPV_ENV_UNIVERSAL_1_3:
+      return "SPIR-V 1.3";
+    case SPV_ENV_VULKAN_1_1:
+      return "SPIR-V 1.3 (under Vulkan 1.1 semantics)";
   }
   assert(0 && "Unhandled SPIR-V target environment");
   return "";
@@ -63,6 +67,9 @@
     case SPV_ENV_UNIVERSAL_1_2:
     case SPV_ENV_OPENCL_2_2:
       return SPV_SPIRV_VERSION_WORD(1, 2);
+    case SPV_ENV_UNIVERSAL_1_3:
+    case SPV_ENV_VULKAN_1_1:
+      return SPV_SPIRV_VERSION_WORD(1, 3);
   }
   assert(0 && "Unhandled SPIR-V target environment");
   return SPV_SPIRV_VERSION_WORD(0, 0);
@@ -75,6 +82,9 @@
   if (match("vulkan1.0")) {
     if (env) *env = SPV_ENV_VULKAN_1_0;
     return true;
+  } else if (match("vulkan1.1")) {
+    if (env) *env = SPV_ENV_VULKAN_1_1;
+    return true;
   } else if (match("spv1.0")) {
     if (env) *env = SPV_ENV_UNIVERSAL_1_0;
     return true;
@@ -84,6 +94,9 @@
   } else if (match("spv1.2")) {
     if (env) *env = SPV_ENV_UNIVERSAL_1_2;
     return true;
+  } else if (match("spv1.3")) {
+    if (env) *env = SPV_ENV_UNIVERSAL_1_3;
+    return true;
   } else if (match("opencl2.1")) {
     if (env) *env = SPV_ENV_OPENCL_2_1;
     return true;
diff --git a/source/table.cpp b/source/table.cpp
index b8fb809..218d9d5 100644
--- a/source/table.cpp
+++ b/source/table.cpp
@@ -20,6 +20,7 @@
   switch (env) {
     case SPV_ENV_UNIVERSAL_1_0:
     case SPV_ENV_VULKAN_1_0:
+    case SPV_ENV_VULKAN_1_1:
     case SPV_ENV_UNIVERSAL_1_1:
     case SPV_ENV_OPENCL_2_1:
     case SPV_ENV_OPENCL_2_2:
@@ -29,6 +30,7 @@
     case SPV_ENV_OPENGL_4_3:
     case SPV_ENV_OPENGL_4_5:
     case SPV_ENV_UNIVERSAL_1_2:
+    case SPV_ENV_UNIVERSAL_1_3:
       break;
     default:
       return nullptr;
diff --git a/source/table.h b/source/table.h
index a7dffaa..7dc0b0b 100644
--- a/source/table.h
+++ b/source/table.h
@@ -15,7 +15,7 @@
 #ifndef LIBSPIRV_TABLE_H_
 #define LIBSPIRV_TABLE_H_
 
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 #include "extensions.h"
 #include "message.h"
diff --git a/source/val/basic_block.h b/source/val/basic_block.h
index 81f0f66..b0419c4 100644
--- a/source/val/basic_block.h
+++ b/source/val/basic_block.h
@@ -15,7 +15,7 @@
 #ifndef LIBSPIRV_VAL_BASICBLOCK_H_
 #define LIBSPIRV_VAL_BASICBLOCK_H_
 
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 
 #include <cstdint>
 
diff --git a/source/val/function.h b/source/val/function.h
index 7eb8dcd..57c4e65 100644
--- a/source/val/function.h
+++ b/source/val/function.h
@@ -22,7 +22,7 @@
 #include <vector>
 
 #include "spirv-tools/libspirv.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 #include "val/basic_block.h"
 #include "val/construct.h"
 
diff --git a/source/val/validation_state.h b/source/val/validation_state.h
index ad56703..45ab500 100644
--- a/source/val/validation_state.h
+++ b/source/val/validation_state.h
@@ -27,7 +27,7 @@
 #include "diagnostic.h"
 #include "enum_set.h"
 #include "spirv-tools/libspirv.h"
-#include "spirv/1.2/spirv.h"
+#include "spirv/1.3/spirv.h"
 #include "spirv_definition.h"
 #include "val/function.h"
 #include "val/instruction.h"
diff --git a/test/binary_header_get_test.cpp b/test/binary_header_get_test.cpp
index 9ccd0a9..d6efe5a 100644
--- a/test/binary_header_get_test.cpp
+++ b/test/binary_header_get_test.cpp
@@ -50,7 +50,7 @@
   ASSERT_EQ(SPV_SUCCESS, spvBinaryHeaderGet(&const_bin, endian, &header));
 
   ASSERT_EQ(static_cast<uint32_t>(SpvMagicNumber), header.magic);
-  ASSERT_EQ(0x00010200u, header.version);
+  ASSERT_EQ(0x00010300u, header.version);
   ASSERT_EQ(static_cast<uint32_t>(SPV_GENERATOR_CODEPLAY), header.generator);
   ASSERT_EQ(1u, header.bound);
   ASSERT_EQ(0u, header.schema);
diff --git a/test/binary_to_text_test.cpp b/test/binary_to_text_test.cpp
index fcbf883..de54799 100644
--- a/test/binary_to_text_test.cpp
+++ b/test/binary_to_text_test.cpp
@@ -240,7 +240,7 @@
     NumericLiterals, RoundTripInstructionsTest,
     // This test is independent of environment, so just test the one.
     Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                              SPV_ENV_UNIVERSAL_1_2),
+                              SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
             ::testing::ValuesIn(std::vector<std::string>{
                 "%1 = OpTypeInt 12 0\n%2 = OpConstant %1 1867\n",
                 "%1 = OpTypeInt 12 1\n%2 = OpConstant %1 1867\n",
@@ -274,7 +274,7 @@
 INSTANTIATE_TEST_CASE_P(
     MemoryAccessMasks, RoundTripInstructionsTest,
     Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                              SPV_ENV_UNIVERSAL_1_2),
+                              SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
             ::testing::ValuesIn(std::vector<std::string>{
                 "OpStore %1 %2\n",       // 3 words long.
                 "OpStore %1 %2 None\n",  // 4 words long, explicit final 0.
@@ -290,7 +290,7 @@
     FPFastMathModeMasks, RoundTripInstructionsTest,
     Combine(
         ::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                          SPV_ENV_UNIVERSAL_1_2),
+                          SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
         ::testing::ValuesIn(std::vector<std::string>{
             "OpDecorate %1 FPFastMathMode None\n",
             "OpDecorate %1 FPFastMathMode NotNaN\n",
@@ -307,7 +307,7 @@
 INSTANTIATE_TEST_CASE_P(
     LoopControlMasks, RoundTripInstructionsTest,
     Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                              SPV_ENV_UNIVERSAL_1_2),
+                              SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
             ::testing::ValuesIn(std::vector<std::string>{
                 "OpLoopMerge %1 %2 None\n", "OpLoopMerge %1 %2 Unroll\n",
                 "OpLoopMerge %1 %2 DontUnroll\n",
@@ -316,7 +316,8 @@
 
 INSTANTIATE_TEST_CASE_P(LoopControlMasksV11, RoundTripInstructionsTest,
                         Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_1,
-                                                  SPV_ENV_UNIVERSAL_1_2),
+                                                  SPV_ENV_UNIVERSAL_1_2,
+                                                  SPV_ENV_UNIVERSAL_1_3),
                                 ::testing::ValuesIn(std::vector<std::string>{
                                     "OpLoopMerge %1 %2 DependencyInfinite\n",
                                     "OpLoopMerge %1 %2 DependencyLength 8\n",
@@ -325,7 +326,7 @@
 INSTANTIATE_TEST_CASE_P(
     SelectionControlMasks, RoundTripInstructionsTest,
     Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                              SPV_ENV_UNIVERSAL_1_2),
+                              SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
             ::testing::ValuesIn(std::vector<std::string>{
                 "OpSelectionMerge %1 None\n", "OpSelectionMerge %1 Flatten\n",
                 "OpSelectionMerge %1 DontFlatten\n",
@@ -335,7 +336,7 @@
 INSTANTIATE_TEST_CASE_P(
     FunctionControlMasks, RoundTripInstructionsTest,
     Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                              SPV_ENV_UNIVERSAL_1_2),
+                              SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
             ::testing::ValuesIn(std::vector<std::string>{
                 "%2 = OpFunction %1 None %3\n",
                 "%2 = OpFunction %1 Inline %3\n",
@@ -348,7 +349,7 @@
 INSTANTIATE_TEST_CASE_P(
     ImageMasks, RoundTripInstructionsTest,
     Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                              SPV_ENV_UNIVERSAL_1_2),
+                              SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
             ::testing::ValuesIn(std::vector<std::string>{
                 "%2 = OpImageFetch %1 %3 %4\n",
                 "%2 = OpImageFetch %1 %3 %4 None\n",
@@ -370,7 +371,7 @@
 
 INSTANTIATE_TEST_CASE_P(
     NewInstructionsInSPIRV1_2, RoundTripInstructionsTest,
-    Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_2),
+    Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
             ::testing::ValuesIn(std::vector<std::string>{
                 "OpExecutionModeId %1 SubgroupsPerWorkgroupId %2\n",
                 "OpExecutionModeId %1 LocalSizeId %2 %3 %4\n",
@@ -379,6 +380,8 @@
                 "OpDecorateId %1 MaxByteOffsetId %2\n",
             })), );
 
+// TODO(dneto): New instructions and enums in SPIR-V 1.3
+
 using MaskSorting = TextToBinaryTest;
 
 TEST_F(MaskSorting, MasksAreSortedFromLSBToMSB) {
diff --git a/test/target_env_test.cpp b/test/target_env_test.cpp
index 0c8389d..76f0985 100644
--- a/test/target_env_test.cpp
+++ b/test/target_env_test.cpp
@@ -41,7 +41,7 @@
 
 TEST_P(TargetEnvTest, ValidSpirvVersion) {
   auto spirv_version = spvVersionForTargetEnv(GetParam());
-  ASSERT_THAT(spirv_version, AnyOf(0x10000, 0x10100, 0x10200));
+  ASSERT_THAT(spirv_version, AnyOf(0x10000, 0x10100, 0x10200, 0x10300));
 }
 
 INSTANTIATE_TEST_CASE_P(AllTargetEnvs, TargetEnvTest,
@@ -74,7 +74,9 @@
                             {"spv1.0", true, SPV_ENV_UNIVERSAL_1_0},
                             {"spv1.1", true, SPV_ENV_UNIVERSAL_1_1},
                             {"spv1.2", true, SPV_ENV_UNIVERSAL_1_2},
+                            {"spv1.3", true, SPV_ENV_UNIVERSAL_1_3},
                             {"vulkan1.0", true, SPV_ENV_VULKAN_1_0},
+                            {"vulkan1.1", true, SPV_ENV_VULKAN_1_1},
                             {"opencl2.1", true, SPV_ENV_OPENCL_2_1},
                             {"opencl2.2", true, SPV_ENV_OPENCL_2_2},
                             {"opengl4.0", true, SPV_ENV_OPENGL_4_0},
@@ -82,6 +84,10 @@
                             {"opengl4.2", true, SPV_ENV_OPENGL_4_2},
                             {"opengl4.3", true, SPV_ENV_OPENGL_4_3},
                             {"opengl4.5", true, SPV_ENV_OPENGL_4_5},
+                            {"opencl2.3", false, SPV_ENV_UNIVERSAL_1_0},
+                            {"opencl3.0", false, SPV_ENV_UNIVERSAL_1_0},
+                            {"vulkan1.2", false, SPV_ENV_UNIVERSAL_1_0},
+                            {"vulkan2.0", false, SPV_ENV_UNIVERSAL_1_0},
                             {nullptr, false, SPV_ENV_UNIVERSAL_1_0},
                             {"", false, SPV_ENV_UNIVERSAL_1_0},
                             {"abc", false, SPV_ENV_UNIVERSAL_1_0},
diff --git a/test/text_to_binary.extension_test.cpp b/test/text_to_binary.extension_test.cpp
index 4b7c25c..bcf9dda 100644
--- a/test/text_to_binary.extension_test.cpp
+++ b/test/text_to_binary.extension_test.cpp
@@ -156,6 +156,61 @@
                                                  SpvBuiltInSubgroupLtMaskKHR})},
             })), );
 
+INSTANTIATE_TEST_CASE_P(
+    SPV_KHR_shader_ballot_vulkan_1_1, ExtensionRoundTripTest,
+    // In SPIR-V 1.3 and Vulkan 1.1 we can drop the KHR suffix on the
+    // builtin enums.
+    Combine(Values(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_1),
+            ValuesIn(std::vector<AssemblyCase>{
+                {"OpCapability SubgroupBallotKHR\n",
+                 MakeInstruction(SpvOpCapability,
+                                 {SpvCapabilitySubgroupBallotKHR})},
+                {"%2 = OpSubgroupBallotKHR %1 %3\n",
+                 MakeInstruction(SpvOpSubgroupBallotKHR, {1, 2, 3})},
+                {"%2 = OpSubgroupFirstInvocationKHR %1 %3\n",
+                 MakeInstruction(SpvOpSubgroupFirstInvocationKHR, {1, 2, 3})},
+                {"OpDecorate %1 BuiltIn SubgroupEqMask\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupEqMask})},
+                {"OpDecorate %1 BuiltIn SubgroupGeMask\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupGeMask})},
+                {"OpDecorate %1 BuiltIn SubgroupGtMask\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupGtMask})},
+                {"OpDecorate %1 BuiltIn SubgroupLeMask\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupLeMask})},
+                {"OpDecorate %1 BuiltIn SubgroupLtMask\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupLtMask})},
+            })), );
+
+// The old builtin names (with KHR suffix) still work in the assmebler, and
+// map to the enums without the KHR.
+INSTANTIATE_TEST_CASE_P(
+    SPV_KHR_shader_ballot_vulkan_1_1_alias_check, ExtensionAssemblyTest,
+    // In SPIR-V 1.3 and Vulkan 1.1 we can drop the KHR suffix on the
+    // builtin enums.
+    Combine(Values(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_1),
+            ValuesIn(std::vector<AssemblyCase>{
+                {"OpDecorate %1 BuiltIn SubgroupEqMaskKHR\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupEqMask})},
+                {"OpDecorate %1 BuiltIn SubgroupGeMaskKHR\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupGeMask})},
+                {"OpDecorate %1 BuiltIn SubgroupGtMaskKHR\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupGtMask})},
+                {"OpDecorate %1 BuiltIn SubgroupLeMaskKHR\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupLeMask})},
+                {"OpDecorate %1 BuiltIn SubgroupLtMaskKHR\n",
+                 MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn,
+                                                 SpvBuiltInSubgroupLtMask})},
+            })), );
+
 // SPV_KHR_shader_draw_parameters
 
 INSTANTIATE_TEST_CASE_P(
@@ -164,7 +219,7 @@
     // environments, and at least one specific environment.
     Combine(
         Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-               SPV_ENV_VULKAN_1_0),
+               SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1),
         ValuesIn(std::vector<AssemblyCase>{
             {"OpCapability DrawParameters\n",
              MakeInstruction(SpvOpCapability, {SpvCapabilityDrawParameters})},
@@ -187,7 +242,7 @@
     // environments, and at least one specific environment.
     Combine(
         Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-               SPV_ENV_VULKAN_1_0),
+               SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1),
         ValuesIn(std::vector<AssemblyCase>{
             {"OpCapability SubgroupVoteKHR\n",
              MakeInstruction(SpvOpCapability, {SpvCapabilitySubgroupVoteKHR})},
@@ -206,7 +261,8 @@
     // We'll get coverage over operand tables by trying the universal
     // environments, and at least one specific environment.
     Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                   SPV_ENV_VULKAN_1_0),
+                   SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0,
+                   SPV_ENV_VULKAN_1_1),
             ValuesIn(std::vector<AssemblyCase>{
                 {"OpCapability StorageBuffer16BitAccess\n",
                  MakeInstruction(SpvOpCapability,
@@ -232,7 +288,8 @@
 INSTANTIATE_TEST_CASE_P(
     SPV_KHR_16bit_storage_alias_check, ExtensionAssemblyTest,
     Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                   SPV_ENV_VULKAN_1_0),
+                   SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0,
+                   SPV_ENV_VULKAN_1_1),
             ValuesIn(std::vector<AssemblyCase>{
                 // The old name maps to the new enum.
                 {"OpCapability StorageUniformBufferBlock16\n",
@@ -252,7 +309,8 @@
     // We'll get coverage over operand tables by trying the universal
     // environments, and at least one specific environment.
     Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                   SPV_ENV_VULKAN_1_0),
+                   SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0,
+                   SPV_ENV_VULKAN_1_1),
             ValuesIn(std::vector<AssemblyCase>{
                 {"OpCapability DeviceGroup\n",
                  MakeInstruction(SpvOpCapability, {SpvCapabilityDeviceGroup})},
@@ -268,7 +326,8 @@
     // We'll get coverage over operand tables by trying the universal
     // environments, and at least one specific environment.
     Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                   SPV_ENV_VULKAN_1_0),
+                   SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0,
+                   SPV_ENV_VULKAN_1_1),
             ValuesIn(std::vector<AssemblyCase>{
                 {"OpCapability MultiView\n",
                  MakeInstruction(SpvOpCapability, {SpvCapabilityMultiView})},
@@ -353,8 +412,8 @@
     SPV_AMD_gcn_shader, ExtensionRoundTripTest,
     // We'll get coverage over operand tables by trying the universal
     // environments, and at least one specific environment.
-    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                   SPV_ENV_VULKAN_1_0),
+    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, SPV_ENV_UNIVERSAL_1_3,
+                   SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1),
             ValuesIn(std::vector<AssemblyCase>{
                 {PREAMBLE "%3 = OpExtInst %2 %1 CubeFaceIndexAMD %4\n",
                  Concatenate({MakeInstruction(SpvOpExtInstImport, {1},
@@ -408,16 +467,15 @@
     SPV_KHR_variable_pointers, ExtensionRoundTripTest,
     // We'll get coverage over operand tables by trying the universal
     // environments, and at least one specific environment.
-    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
-                   SPV_ENV_VULKAN_1_0),
-            ValuesIn(std::vector<AssemblyCase>{
-                {"OpCapability VariablePointers\n",
-                 MakeInstruction(SpvOpCapability,
-                                 {SpvCapabilityVariablePointers})},
-                {"OpCapability VariablePointersStorageBuffer\n",
-                 MakeInstruction(
-                     SpvOpCapability,
-                     {SpvCapabilityVariablePointersStorageBuffer})},
-            })), );
+    Combine(
+        Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
+               SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1),
+        ValuesIn(std::vector<AssemblyCase>{
+            {"OpCapability VariablePointers\n",
+             MakeInstruction(SpvOpCapability, {SpvCapabilityVariablePointers})},
+            {"OpCapability VariablePointersStorageBuffer\n",
+             MakeInstruction(SpvOpCapability,
+                             {SpvCapabilityVariablePointersStorageBuffer})},
+        })), );
 
 }  // anonymous namespace
diff --git a/test/unit_spirv.h b/test/unit_spirv.h
index 4744815..ae4e4b8 100644
--- a/test/unit_spirv.h
+++ b/test/unit_spirv.h
@@ -211,7 +211,8 @@
   return {SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, SPV_ENV_OPENCL_2_1,
           SPV_ENV_OPENCL_2_2,    SPV_ENV_VULKAN_1_0,    SPV_ENV_OPENGL_4_0,
           SPV_ENV_OPENGL_4_1,    SPV_ENV_OPENGL_4_2,    SPV_ENV_OPENGL_4_3,
-          SPV_ENV_OPENGL_4_5,    SPV_ENV_UNIVERSAL_1_2};
+          SPV_ENV_OPENGL_4_5,    SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3,
+          SPV_ENV_VULKAN_1_1};
 }
 
 // Returns the capabilities in a CapabilitySet as an ordered vector.
diff --git a/tools/as/as.cpp b/tools/as/as.cpp
index 475d44d..0d9363f 100644
--- a/tools/as/as.cpp
+++ b/tools/as/as.cpp
@@ -41,13 +41,14 @@
                   Numeric IDs in the binary will have the same values as in the
                   source. Non-numeric IDs are allocated by filling in the gaps,
                   starting with 1 and going up.
-  --target-env {vulkan1.0|spv1.0|spv1.1|spv1.2}
-                  Use Vulkan1.0/SPIR-V1.0/SPIR-V1.1/SPIR-V1.2
+  --target-env {vulkan1.0|vulkan1.1|spv1.0|spv1.1|spv1.2|spv1.3}
+                  Use Vulkan 1.0, Vulkan 1.1, SPIR-V 1.0, SPIR-V 1.1,
+                  SPIR-V 1.2, or SPIR-V 1.3
 )",
       argv0, argv0);
 }
 
-static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_2;
+static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_3;
 
 int main(int argc, char** argv) {
   const char* inFile = nullptr;
diff --git a/tools/cfg/cfg.cpp b/tools/cfg/cfg.cpp
index f609dde..9f6afdc 100644
--- a/tools/cfg/cfg.cpp
+++ b/tools/cfg/cfg.cpp
@@ -45,7 +45,7 @@
       argv0, argv0);
 }
 
-static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_2;
+static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_3;
 
 int main(int argc, char** argv) {
   const char* inFile = nullptr;
diff --git a/tools/dis/dis.cpp b/tools/dis/dis.cpp
index 9c14b07..4e19ca1 100644
--- a/tools/dis/dis.cpp
+++ b/tools/dis/dis.cpp
@@ -58,7 +58,7 @@
       argv0, argv0);
 }
 
-static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_2;
+static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_3;
 
 int main(int argc, char** argv) {
   const char* inFile = nullptr;
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp
index ac037c5..932fa75 100644
--- a/tools/opt/opt.cpp
+++ b/tools/opt/opt.cpp
@@ -129,7 +129,7 @@
   const char* in_file = nullptr;
   const char* out_file = nullptr;
 
-  spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2;
+  spv_target_env target_env = SPV_ENV_UNIVERSAL_1_3;
 
   spvtools::Optimizer optimizer(target_env);
   optimizer.SetMessageConsumer([](spv_message_level_t level, const char* source,
diff --git a/tools/val/val.cpp b/tools/val/val.cpp
index 2c06519..414c70b 100644
--- a/tools/val/val.cpp
+++ b/tools/val/val.cpp
@@ -53,7 +53,7 @@
 
 int main(int argc, char** argv) {
   const char* inFile = nullptr;
-  spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2;
+  spv_target_env target_env = SPV_ENV_UNIVERSAL_1_3;
   spvtools::ValidatorOptions options;
   bool continue_processing = true;
   int return_code = 0;
@@ -86,10 +86,13 @@
       } else if (0 == strcmp(cur_arg, "--version")) {
         printf("%s\n", spvSoftwareVersionDetailsString());
         // TODO(dneto): Add OpenCL 2.2 at least.
-        printf("Targets:\n  %s\n  %s\n  %s\n",
-               spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_1),
+        printf("Targets:\n  %s\n  %s\n  %s\n  %s\n  %s\n  %s\n",
+               spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_0),
                spvTargetEnvDescription(SPV_ENV_VULKAN_1_0),
-               spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_2));
+               spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_1),
+               spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_2),
+               spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_3),
+               spvTargetEnvDescription(SPV_ENV_VULKAN_1_1));
         continue_processing = false;
         return_code = 0;
       } else if (0 == strcmp(cur_arg, "--help") || 0 == strcmp(cur_arg, "-h")) {