diff --git a/SPIRV/GLSL.ext.KHR.h b/SPIRV/GLSL.ext.KHR.h
index a8f20c3514c315fd7b5b0e0e21b6f588be431cd7..4c3a571760d3aea2df6e0729603405f89298928a 100644
--- a/SPIRV/GLSL.ext.KHR.h
+++ b/SPIRV/GLSL.ext.KHR.h
@@ -39,5 +39,6 @@ static const char* const E_SPV_KHR_subgroup_vote          = "SPV_KHR_subgroup_vo
 static const char* const E_SPV_KHR_device_group           = "SPV_KHR_device_group";
 static const char* const E_SPV_KHR_multiview              = "SPV_KHR_multiview";
 static const char* const E_SPV_KHR_shader_draw_parameters = "SPV_KHR_shader_draw_parameters";
+static const char* const E_SPV_KHR_16bit_storage          = "SPV_KHR_16bit_storage";
 
 #endif  // #ifndef GLSLextKHR_H
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index aae3f491a86625106875ce70ea19e683161cee40..9b9226ec436faeff8b80212c4fd0d7d76734bd2c 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -2075,6 +2075,24 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol*
     spv::StorageClass storageClass = TranslateStorageClass(node->getType());
     spv::Id spvType = convertGlslangToSpvType(node->getType());
 
+#ifdef AMD_EXTENSIONS
+    const bool contains16BitType = node->getType().containsBasicType(glslang::EbtFloat16);
+    if (contains16BitType) {
+        if (storageClass == spv::StorageClassInput || storageClass == spv::StorageClassOutput) {
+            builder.addExtension(spv::E_SPV_KHR_16bit_storage);
+            builder.addCapability(spv::CapabilityStorageInputOutput16);
+        } else if (storageClass == spv::StorageClassPushConstant) {
+            builder.addExtension(spv::E_SPV_KHR_16bit_storage);
+            builder.addCapability(spv::CapabilityStoragePushConstant16);
+        } else if (storageClass == spv::StorageClassUniform) {
+            builder.addExtension(spv::E_SPV_KHR_16bit_storage);
+            builder.addCapability(spv::CapabilityStorageUniform16);
+            if (node->getType().getQualifier().storage == glslang::EvqBuffer)
+                builder.addCapability(spv::CapabilityStorageUniformBufferBlock16);
+        }
+    }
+#endif
+
     const char* name = node->getName().c_str();
     if (glslang::IsAnonymous(name))
         name = "";
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index a99522b6fe5d3a6365b1893011b400fa06234823..b409df39456776309c4ac10244015ba2dc855014 100755
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -833,6 +833,11 @@ const char* CapabilityString(int info)
     case 4437: return "DeviceGroup";
     case 4439: return "MultiView";
 
+    case 4433: return "StorageUniformBufferBlock16";
+    case 4434: return "StorageUniform16";
+    case 4435: return "StoragePushConstant16";
+    case 4436: return "StorageInputOutput16";
+
 #ifdef NV_EXTENSIONS
     case 5251: return "GeometryShaderPassthroughNV";
     case 5254: return "ShaderViewportIndexLayerNV";
diff --git a/Test/baseResults/spv.float16.frag.out b/Test/baseResults/spv.float16.frag.out
index 78156e40b1d57aaeb1d061137e762aca5fdd71a1..7c2b3c05fed10880a1c4e93d5f0293b84037acc6 100644
--- a/Test/baseResults/spv.float16.frag.out
+++ b/Test/baseResults/spv.float16.frag.out
@@ -11,7 +11,11 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                               Capability Int64
                               Capability DerivativeControl
                               Capability InterpolationFunction
+                              Capability StorageUniformBufferBlock16
+                              Capability StorageUniform16
+                              Capability StorageInputOutput16
                               Extension  "SPV_AMD_gpu_shader_half_float"
+                              Extension  "SPV_KHR_16bit_storage"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 465
diff --git a/Test/baseResults/spv.shaderBallotAMD.comp.out b/Test/baseResults/spv.shaderBallotAMD.comp.out
index bb7f8c1627f59bc8944420a09817871e1034b023..8011fb664ebbf7d8b478f8ee9c6bc8adbbe8f03c 100644
--- a/Test/baseResults/spv.shaderBallotAMD.comp.out
+++ b/Test/baseResults/spv.shaderBallotAMD.comp.out
@@ -10,8 +10,11 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                               Capability Float64
                               Capability Int64
                               Capability Groups
+                              Capability StorageUniformBufferBlock16
+                              Capability StorageUniform16
                               Extension  "SPV_AMD_gpu_shader_half_float"
                               Extension  "SPV_AMD_shader_ballot"
+                              Extension  "SPV_KHR_16bit_storage"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint GLCompute 4  "main"