Implement the extension SPV_KHR_16bit_storage
diff --git a/SPIRV/GLSL.ext.KHR.h b/SPIRV/GLSL.ext.KHR.h
index a8f20c3..4c3a571 100644
--- a/SPIRV/GLSL.ext.KHR.h
+++ b/SPIRV/GLSL.ext.KHR.h
@@ -39,5 +39,6 @@
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 aae3f49..9b9226e 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -2075,6 +2075,24 @@
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 a99522b..b409df3 100755
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -833,6 +833,11 @@
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 78156e4..7c2b3c0 100644
--- a/Test/baseResults/spv.float16.frag.out
+++ b/Test/baseResults/spv.float16.frag.out
@@ -11,7 +11,11 @@
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 bb7f8c1..8011fb6 100644
--- a/Test/baseResults/spv.shaderBallotAMD.comp.out
+++ b/Test/baseResults/spv.shaderBallotAMD.comp.out
@@ -10,8 +10,11 @@
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"