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"