1e5c31af7Sopenharmony_ci// Copyright 2015-2021 The Khronos Group, Inc. 2e5c31af7Sopenharmony_ci// 3e5c31af7Sopenharmony_ci// SPDX-License-Identifier: CC-BY-4.0 4e5c31af7Sopenharmony_ci 5e5c31af7Sopenharmony_ci[appendix] 6e5c31af7Sopenharmony_ci[[spirvenv]] 7e5c31af7Sopenharmony_ci= Vulkan Environment for SPIR-V 8e5c31af7Sopenharmony_ci 9e5c31af7Sopenharmony_ciShaders for Vulkan are defined by the <<spirv-spec,Khronos SPIR-V 10e5c31af7Sopenharmony_ciSpecification>> as well as the <<spirv-extended,Khronos SPIR-V Extended 11e5c31af7Sopenharmony_ciInstructions for GLSL>> Specification. 12e5c31af7Sopenharmony_ciThis appendix defines additional SPIR-V requirements applying to Vulkan 13e5c31af7Sopenharmony_cishaders. 14e5c31af7Sopenharmony_ci 15e5c31af7Sopenharmony_ci== Versions and Formats 16e5c31af7Sopenharmony_ci 17e5c31af7Sopenharmony_ciA Vulkan 18e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2[] 19e5c31af7Sopenharmony_ci1.2 implementation must: support the 1.0, 1.1, 1.2, 1.3, 1.4, and 1.5 20e5c31af7Sopenharmony_civersions 21e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2[] 22e5c31af7Sopenharmony_ciifndef::VK_VERSION_1_2[] 23e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_1[] 24e5c31af7Sopenharmony_ci1.1 implementation must: support the 1.0, 1.1, 1.2, and 1.3 versions 25e5c31af7Sopenharmony_ciendif::VK_VERSION_1_1[] 26e5c31af7Sopenharmony_ciifndef::VK_VERSION_1_1[] 27e5c31af7Sopenharmony_ci1.0 implementation must: support the 1.0 version 28e5c31af7Sopenharmony_ciendif::VK_VERSION_1_1[] 29e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2[] 30e5c31af7Sopenharmony_ciof SPIR-V and the 1.0 version of the SPIR-V Extended Instructions for GLSL. 31e5c31af7Sopenharmony_ciifndef::VK_VERSION_1_2[] 32e5c31af7Sopenharmony_ciifdef::VK_KHR_spirv_1_4[] 33e5c31af7Sopenharmony_ciIf the `apiext:VK_KHR_spirv_1_4` extension is enabled, the implementation 34e5c31af7Sopenharmony_cimust: additionally support the 1.4 version of SPIR-V. 35e5c31af7Sopenharmony_ciendif::VK_KHR_spirv_1_4[] 36e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2[] 37e5c31af7Sopenharmony_ci 38e5c31af7Sopenharmony_ciA SPIR-V module passed into flink:vkCreateShaderModule is interpreted as a 39e5c31af7Sopenharmony_ciseries of 32-bit words in host endianness, with literal strings packed as 40e5c31af7Sopenharmony_cidescribed in section 2.2 of the SPIR-V Specification. 41e5c31af7Sopenharmony_ciThe first few words of the SPIR-V module must: be a magic number and a 42e5c31af7Sopenharmony_ciSPIR-V version number, as described in section 2.3 of the SPIR-V 43e5c31af7Sopenharmony_ciSpecification. 44e5c31af7Sopenharmony_ci 45e5c31af7Sopenharmony_ci 46e5c31af7Sopenharmony_ci[[spirvenv-capabilities]] 47e5c31af7Sopenharmony_ci== Capabilities 48e5c31af7Sopenharmony_ci 49e5c31af7Sopenharmony_ciThe <<spirvenv-capabilities-table,table below>> lists the set of SPIR-V 50e5c31af7Sopenharmony_cicapabilities that may: be supported in Vulkan implementations. 51e5c31af7Sopenharmony_ciThe application must: not use any of these capabilities in SPIR-V passed to 52e5c31af7Sopenharmony_ciflink:vkCreateShaderModule unless one of the following conditions is met for 53e5c31af7Sopenharmony_cithe slink:VkDevice specified in the pname:device parameter of 54e5c31af7Sopenharmony_ciflink:vkCreateShaderModule: 55e5c31af7Sopenharmony_ci 56e5c31af7Sopenharmony_ci* The corresponding field in the table is blank. 57e5c31af7Sopenharmony_ci* Any corresponding Vulkan feature is enabled. 58e5c31af7Sopenharmony_ci* Any corresponding Vulkan extension is enabled. 59e5c31af7Sopenharmony_ci* Any corresponding Vulkan property is supported. 60e5c31af7Sopenharmony_ci* The corresponding core version is supported (as returned by 61e5c31af7Sopenharmony_ci slink:VkPhysicalDeviceProperties::pname:apiVersion). 62e5c31af7Sopenharmony_ci 63e5c31af7Sopenharmony_ci:captableindent: {nbsp} {nbsp} {nbsp} {nbsp} {nbsp} {nbsp} {nbsp} {nbsp} 64e5c31af7Sopenharmony_ci[[spirvenv-capabilities-table]] 65e5c31af7Sopenharmony_ci.List of SPIR-V Capabilities and corresponding Vulkan features, extensions, or core version 66e5c31af7Sopenharmony_ci[options="header"] 67e5c31af7Sopenharmony_ci|==== 68e5c31af7Sopenharmony_ci| SPIR-V code:OpCapability + 69e5c31af7Sopenharmony_ci {captableindent} Vulkan feature, extension, or core version 70e5c31af7Sopenharmony_ciinclude::{generated}/spirvcap/captable.txt[] 71e5c31af7Sopenharmony_ci|==== 72e5c31af7Sopenharmony_ci 73e5c31af7Sopenharmony_ciThe application must: not pass a SPIR-V module containing any of the 74e5c31af7Sopenharmony_cifollowing to flink:vkCreateShaderModule: 75e5c31af7Sopenharmony_ci 76e5c31af7Sopenharmony_ci * any code:OpCapability not listed above, 77e5c31af7Sopenharmony_ci * an unsupported capability, or 78e5c31af7Sopenharmony_ci * a capability which corresponds to a Vulkan feature or extension which 79e5c31af7Sopenharmony_ci has not been enabled. 80e5c31af7Sopenharmony_ci 81e5c31af7Sopenharmony_ci 82e5c31af7Sopenharmony_ci[[spirvenv-extensions]] 83e5c31af7Sopenharmony_ci=== SPIR-V Extensions 84e5c31af7Sopenharmony_ci 85e5c31af7Sopenharmony_ciThe <<spirvenv-extensions-table,following table>> lists SPIR-V extensions 86e5c31af7Sopenharmony_cithat implementations may: support. 87e5c31af7Sopenharmony_ciThe application must: not pass a SPIR-V module to flink:vkCreateShaderModule 88e5c31af7Sopenharmony_cithat uses the following SPIR-V extensions unless one of the following 89e5c31af7Sopenharmony_ciconditions is met for the slink:VkDevice specified in the pname:device 90e5c31af7Sopenharmony_ciparameter of flink:vkCreateShaderModule: 91e5c31af7Sopenharmony_ci 92e5c31af7Sopenharmony_ci* Any corresponding Vulkan extension is enabled. 93e5c31af7Sopenharmony_ci* The corresponding core version is supported (as returned by 94e5c31af7Sopenharmony_ci slink:VkPhysicalDeviceProperties::pname:apiVersion). 95e5c31af7Sopenharmony_ci 96e5c31af7Sopenharmony_ci[[spirvenv-extensions-table]] 97e5c31af7Sopenharmony_ci.List of SPIR-V Extensions and corresponding Vulkan extensions or core version 98e5c31af7Sopenharmony_ci[options="header"] 99e5c31af7Sopenharmony_ci|==== 100e5c31af7Sopenharmony_ci| SPIR-V code:OpExtension + 101e5c31af7Sopenharmony_ci {captableindent} Vulkan extension or core version 102e5c31af7Sopenharmony_ciinclude::{generated}/spirvcap/exttable.txt[] 103e5c31af7Sopenharmony_ci|==== 104e5c31af7Sopenharmony_ci 105e5c31af7Sopenharmony_ci 106e5c31af7Sopenharmony_ci[[spirvenv-module-validation]] 107e5c31af7Sopenharmony_ci== Validation Rules within a Module 108e5c31af7Sopenharmony_ci 109e5c31af7Sopenharmony_ciA SPIR-V module passed to flink:vkCreateShaderModule must: conform to the 110e5c31af7Sopenharmony_cifollowing rules: 111e5c31af7Sopenharmony_ci 112e5c31af7Sopenharmony_ci 113e5c31af7Sopenharmony_ci[[spirvenv-module-validation-standalone]] 114e5c31af7Sopenharmony_ci=== Standalone SPIR-V Validation 115e5c31af7Sopenharmony_ci 116e5c31af7Sopenharmony_ci[open,refpage='StandaloneSpirv',desc='Standalone SPIR-V Validation',type='spirv'] 117e5c31af7Sopenharmony_ci-- 118e5c31af7Sopenharmony_ci:refpage: StandaloneSpirv 119e5c31af7Sopenharmony_ci 120e5c31af7Sopenharmony_ciThe following rules can: be validated with only the SPIR-V module itself. 121e5c31af7Sopenharmony_ciThey do not depend on knowledge of the implementation and its capabilities 122e5c31af7Sopenharmony_cior knowledge of runtime information, such as enabled features. 123e5c31af7Sopenharmony_ci 124e5c31af7Sopenharmony_ci.Valid Usage 125e5c31af7Sopenharmony_ci**** 126e5c31af7Sopenharmony_ci// NOTE: Do not conditionalize the "standalone" VUs. 127e5c31af7Sopenharmony_ci// Write as though all extensions were enabled. 128e5c31af7Sopenharmony_ci// Add any needed conditional logic to the runtime section if needed. 129e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04633]] 130e5c31af7Sopenharmony_ci Every entry point must: have no return value and accept no arguments 131e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04634]] 132e5c31af7Sopenharmony_ci The static function-call graph for an entry point must: not contain 133e5c31af7Sopenharmony_ci cycles; that is, static recursion is not allowed 134e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04635]] 135e5c31af7Sopenharmony_ci The *Logical* or *PhysicalStorageBuffer64* addressing model must: be 136e5c31af7Sopenharmony_ci selected 137e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04636]] 138e5c31af7Sopenharmony_ci *Scope* for execution must: be limited to *Workgroup* or *Subgroup* 139e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04637]] 140e5c31af7Sopenharmony_ci If the *Scope* for execution is *Workgroup*, then it must: only be used 141e5c31af7Sopenharmony_ci in the task, mesh, tessellation control, or compute execution models 142e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04638]] 143e5c31af7Sopenharmony_ci *Scope* for memory must: be limited to *Device*, *QueueFamily*, 144e5c31af7Sopenharmony_ci *Workgroup*, *ShaderCallKHR*, *Subgroup*, or *Invocation* 145e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04639]] 146e5c31af7Sopenharmony_ci If the *Scope* for memory is *Workgroup*, then it must: only be used in 147e5c31af7Sopenharmony_ci the task, mesh, or compute execution models 148e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04640]] 149e5c31af7Sopenharmony_ci If the *Scope* for memory is *ShaderCallKHR*, then it must: only be used 150e5c31af7Sopenharmony_ci in ray generation, intersection, closest hit, any-hit, miss, and 151e5c31af7Sopenharmony_ci callable execution models 152e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04641]] 153e5c31af7Sopenharmony_ci If the *Scope* for memory is *Invocation*, then memory semantics must: 154e5c31af7Sopenharmony_ci be *None* 155e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_1[] 156e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04642]] 157e5c31af7Sopenharmony_ci *Scope* for <<shaders-group-operations,group operations>> must: be 158e5c31af7Sopenharmony_ci limited to *Subgroup* 159e5c31af7Sopenharmony_ciendif::VK_VERSION_1_1[] 160e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04643]] 161e5c31af7Sopenharmony_ci *Storage Class* must: be limited to *UniformConstant*, *Input*, 162e5c31af7Sopenharmony_ci *Uniform*, *Output*, *Workgroup*, *Private*, *Function*, *PushConstant*, 163e5c31af7Sopenharmony_ci *Image*, *StorageBuffer*, *RayPayloadKHR*, *IncomingRayPayloadKHR*, 164e5c31af7Sopenharmony_ci *HitAttributeKHR*, *CallableDataKHR*, *IncomingCallableDataKHR*, 165e5c31af7Sopenharmony_ci *ShaderRecordBufferKHR*, or *PhysicalStorageBuffer* 166e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04644]] 167e5c31af7Sopenharmony_ci If the *Storage Class* is *Output*, then it must: not be used in the 168e5c31af7Sopenharmony_ci *GlCompute*, *RayGenerationKHR*, *IntersectionKHR*, *AnyHitKHR*, 169e5c31af7Sopenharmony_ci *ClosestHitKHR*, *MissKHR*, or *CallableKHR* execution models 170e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04645]] 171e5c31af7Sopenharmony_ci If the *Storage Class* is *Workgroup*, then it must: only be used in the 172e5c31af7Sopenharmony_ci task, mesh, or compute execution models 173e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpAtomicStore-04730]] 174e5c31af7Sopenharmony_ci code:OpAtomicStore must: not use *Acquire*, *AcquireRelease*, or 175e5c31af7Sopenharmony_ci *SequentiallyConsistent* memory semantics 176e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpAtomicLoad-04731]] 177e5c31af7Sopenharmony_ci code:OpAtomicLoad must: not use *Release*, *AcquireRelease*, or 178e5c31af7Sopenharmony_ci *SequentiallyConsistent* memory semantics 179e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpMemoryBarrier-04732]] 180e5c31af7Sopenharmony_ci code:OpMemoryBarrier must: use one of *Acquire*, *Release*, 181e5c31af7Sopenharmony_ci *AcquireRelease*, or *SequentiallyConsistent* memory semantics 182e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpMemoryBarrier-04733]] 183e5c31af7Sopenharmony_ci code:OpMemoryBarrier must: include at least one storage class 184e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpControlBarrier-04650]] 185e5c31af7Sopenharmony_ci If the semantics for code:OpControlBarrier includes one of *Acquire*, 186e5c31af7Sopenharmony_ci *Release*, *AcquireRelease*, or *SequentiallyConsistent* memory 187e5c31af7Sopenharmony_ci semantics, then it must: include at least one storage class 188e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpVariable-04651]] 189e5c31af7Sopenharmony_ci Any code:OpVariable with an code:Initializer operand must: have 190e5c31af7Sopenharmony_ci *Output*, *Private*, *Function*, or *Workgroup* as its *Storage Class* 191e5c31af7Sopenharmony_ci operand 192e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpVariable-04734]] 193e5c31af7Sopenharmony_ci Any code:OpVariable with an code:Initializer operand and *Workgroup* as 194e5c31af7Sopenharmony_ci its *Storage Class* operand must: use code:OpConstantNull as the 195e5c31af7Sopenharmony_ci initializer 196e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpReadClockKHR-04652]] 197e5c31af7Sopenharmony_ci *Scope* for code:OpReadClockKHR must: be limited to *Subgroup* or 198e5c31af7Sopenharmony_ci *Device* 199e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OriginLowerLeft-04653]] 200e5c31af7Sopenharmony_ci The code:OriginLowerLeft execution mode must: not be used; fragment 201e5c31af7Sopenharmony_ci entry points must: declare code:OriginUpperLeft 202e5c31af7Sopenharmony_ci * [[VUID-{refpage}-PixelCenterInteger-04654]] 203e5c31af7Sopenharmony_ci The code:PixelCenterInteger execution mode must: not be used (pixels are 204e5c31af7Sopenharmony_ci always centered at half-integer coordinates) 205e5c31af7Sopenharmony_ci * [[VUID-{refpage}-UniformConstant-04655]] 206e5c31af7Sopenharmony_ci Any variable in the code:UniformConstant storage class must: be typed as 207e5c31af7Sopenharmony_ci either code:OpTypeImage, code:OpTypeSampler, code:OpTypeSampledImage, 208e5c31af7Sopenharmony_ci code:OpTypeAccelerationStructureKHR, or an array of one of these types 209e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeImage-04656]] 210e5c31af7Sopenharmony_ci code:OpTypeImage must: declare a scalar 32-bit float, 64-bit integer, or 211e5c31af7Sopenharmony_ci 32-bit integer type for the "`Sampled Type`" (code:RelaxedPrecision can: 212e5c31af7Sopenharmony_ci be applied to a sampling instruction and to the variable holding the 213e5c31af7Sopenharmony_ci result of a sampling instruction) 214e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeImage-04657]] 215e5c31af7Sopenharmony_ci code:OpTypeImage must: have a "`Sampled`" operand of 1 (sampled image) 216e5c31af7Sopenharmony_ci or 2 (storage image) 217e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Image-04965]] 218e5c31af7Sopenharmony_ci The converted bit width, signedness, and numeric type of the code:Image 219e5c31af7Sopenharmony_ci code:Format operand of an code:OpTypeImage must: match the code:Sampled 220e5c31af7Sopenharmony_ci code:Type, as defined in <<spirvenv-format-type-matching>> 221e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpImageTexelPointer-04658]] 222e5c31af7Sopenharmony_ci If an code:OpImageTexelPointer is used in an atomic operation, the image 223e5c31af7Sopenharmony_ci type of the code:image parameter to code:OpImageTexelPointer must: have 224e5c31af7Sopenharmony_ci an image format of code:R64i, code:R64ui, code:R32f, code:R32i, or 225e5c31af7Sopenharmony_ci code:R32ui 226e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpImageQuerySizeLod-04659]] 227e5c31af7Sopenharmony_ci code:OpImageQuerySizeLod, code:OpImageQueryLod, and 228e5c31af7Sopenharmony_ci code:OpImageQueryLevels must: only consume an "`Image`" operand whose 229e5c31af7Sopenharmony_ci type has its "`Sampled`" operand set to 1 230e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeImage-06214]] 231e5c31af7Sopenharmony_ci An code:OpTypeImage with a "`Dim`" operand of code:SubpassData must: 232e5c31af7Sopenharmony_ci have an "`Arrayed`" operand of 0 (non-arrayed) and a "`Sampled`" operand 233e5c31af7Sopenharmony_ci of 2 (storage image) 234e5c31af7Sopenharmony_ci * [[VUID-{refpage}-SubpassData-04660]] 235e5c31af7Sopenharmony_ci The [eq]#(u,v)# coordinates used for a code:SubpassData must: be the 236e5c31af7Sopenharmony_ci <id> of a constant vector [eq]#(0,0)#, or if a layer coordinate is used, 237e5c31af7Sopenharmony_ci must: be a vector that was formed with constant 0 for the [eq]#u# and 238e5c31af7Sopenharmony_ci [eq]#v# components 239e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeImage-04661]] 240e5c31af7Sopenharmony_ci Objects of types code:OpTypeImage, code:OpTypeSampler, 241e5c31af7Sopenharmony_ci code:OpTypeSampledImage, and arrays of these types must: not be stored 242e5c31af7Sopenharmony_ci to or modified 243e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-04662]] 244e5c31af7Sopenharmony_ci Any image operation must: use at most one of the code:Offset, 245e5c31af7Sopenharmony_ci code:ConstOffset, and code:ConstOffsets image operands 246e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-04663]] 247e5c31af7Sopenharmony_ci Image operand code:Offset must: only be used with code:OpImage*Gather 248e5c31af7Sopenharmony_ci instructions 249e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-04865]] 250e5c31af7Sopenharmony_ci Any image instruction which uses an code:Offset, code:ConstOffset, or 251e5c31af7Sopenharmony_ci code:ConstOffsets image operand, must only consume a "`Sampled Image`" 252e5c31af7Sopenharmony_ci operand whose type has its "`Sampled`" operand set to 1 253e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpImageGather-04664]] 254e5c31af7Sopenharmony_ci The "`Component`" operand of code:OpImageGather, and 255e5c31af7Sopenharmony_ci code:OpImageSparseGather must: be the <id> of a constant instruction 256e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpImage-04777]] 257e5c31af7Sopenharmony_ci code:OpImage*Dref must: not consume an image whose `Dim` is 3D 258e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeAccelerationStructureKHR-04665]] 259e5c31af7Sopenharmony_ci Objects of types code:OpTypeAccelerationStructureKHR and arrays of this 260e5c31af7Sopenharmony_ci type must: not be stored to or modified 261e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpReportIntersectionKHR-04666]] 262e5c31af7Sopenharmony_ci The value of the "`Hit Kind`" operand of code:OpReportIntersectionKHR 263e5c31af7Sopenharmony_ci must: be in the range [eq]#[0,127]# 264e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04667]] 265e5c31af7Sopenharmony_ci Structure types must: not contain opaque types 266e5c31af7Sopenharmony_ci * [[VUID-{refpage}-BuiltIn-04668]] 267e5c31af7Sopenharmony_ci Any code:BuiltIn decoration not listed in 268e5c31af7Sopenharmony_ci <<interfaces-builtin-variables>> must: not be used 269e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Location-04915]] 270e5c31af7Sopenharmony_ci The code:Location or code:Component decorations must: not be used with 271e5c31af7Sopenharmony_ci code:BuiltIn 272e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Location-04916]] 273e5c31af7Sopenharmony_ci The code:Location decorations must: be used on 274e5c31af7Sopenharmony_ci <<interfaces-iointerfaces-user,user-defined variables>> 275e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Location-04917]] 276e5c31af7Sopenharmony_ci The code:Location decorations must: be used on an code:OpVariable with a 277e5c31af7Sopenharmony_ci structure type that is not a block 278e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Location-04918]] 279e5c31af7Sopenharmony_ci The code:Location decorations must: not be used on the members of 280e5c31af7Sopenharmony_ci code:OpVariable with a structure type that is decorated with 281e5c31af7Sopenharmony_ci code:Location 282e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Location-04919]] 283e5c31af7Sopenharmony_ci The code:Location decorations must: be used on each member of 284e5c31af7Sopenharmony_ci code:OpVariable with a structure type that is a block not decorated with 285e5c31af7Sopenharmony_ci code:Location 286e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Component-04920]] 287e5c31af7Sopenharmony_ci The code:Component decoration value must: not be greater than 3 288e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Component-04921]] 289e5c31af7Sopenharmony_ci If the code:Component decoration is used on an code:OpVariable that has 290e5c31af7Sopenharmony_ci a code:OpTypeVector type with a code:Component code:Type with a 291e5c31af7Sopenharmony_ci code:Width that is less than or equal to 32, the sum of its 292e5c31af7Sopenharmony_ci code:Component code:Count and the code:Component decoration value must: 293e5c31af7Sopenharmony_ci be less than 4 294e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Component-04922]] 295e5c31af7Sopenharmony_ci If the code:Component decoration is used on an code:OpVariable that has 296e5c31af7Sopenharmony_ci a code:OpTypeVector type with a code:Component code:Type with a 297e5c31af7Sopenharmony_ci code:Width that is equal to 64, the sum of two times its code:Component 298e5c31af7Sopenharmony_ci code:Count and the code:Component decoration value must: be less than 4 299e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Component-04923]] 300e5c31af7Sopenharmony_ci The code:Component decorations value must: not be 1 or 3 for scalar or 301e5c31af7Sopenharmony_ci two-component 64-bit data types 302e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Component-04924]] 303e5c31af7Sopenharmony_ci The code:Component decorations must: not used with any type that is not 304e5c31af7Sopenharmony_ci a scalar or vector 305e5c31af7Sopenharmony_ci * [[VUID-{refpage}-GLSLShared-04669]] 306e5c31af7Sopenharmony_ci The code:GLSLShared and code:GLSLPacked decorations must: not be used 307e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Flat-04670]] 308e5c31af7Sopenharmony_ci The code:Flat, code:NoPerspective, code:Sample, and code:Centroid 309e5c31af7Sopenharmony_ci decorations must: only be used on variables with the code:Output or 310e5c31af7Sopenharmony_ci code:Input storage class 311e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Flat-06201]] 312e5c31af7Sopenharmony_ci The code:Flat, code:NoPerspective, code:Sample, and code:Centroid 313e5c31af7Sopenharmony_ci decorations must: not be used on variables with the code:Output storage 314e5c31af7Sopenharmony_ci class in a fragment shader 315e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Flat-06202]] 316e5c31af7Sopenharmony_ci The code:Flat, code:NoPerspective, code:Sample, and code:Centroid 317e5c31af7Sopenharmony_ci decorations must: not be used on variables with the code:Input storage 318e5c31af7Sopenharmony_ci class in a vertex shader 319e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Flat-04744]] 320e5c31af7Sopenharmony_ci Any variable with integer or double-precision floating-point type and 321e5c31af7Sopenharmony_ci with code:Input storage class in a fragment shader, must: be decorated 322e5c31af7Sopenharmony_ci code:Flat 323e5c31af7Sopenharmony_ci * [[VUID-{refpage}-ViewportRelativeNV-04672]] 324e5c31af7Sopenharmony_ci The code:ViewportRelativeNV decoration must: only be used on a variable 325e5c31af7Sopenharmony_ci decorated with code:Layer in the vertex, tessellation evaluation, or 326e5c31af7Sopenharmony_ci geometry shader stages 327e5c31af7Sopenharmony_ci * [[VUID-{refpage}-ViewportRelativeNV-04673]] 328e5c31af7Sopenharmony_ci The code:ViewportRelativeNV decoration must: not be used unless a 329e5c31af7Sopenharmony_ci variable decorated with one of code:ViewportIndex or code:ViewportMaskNV 330e5c31af7Sopenharmony_ci is also statically used by the same code:OpEntryPoint 331e5c31af7Sopenharmony_ci * [[VUID-{refpage}-ViewportMaskNV-04674]] 332e5c31af7Sopenharmony_ci The code:ViewportMaskNV and code:ViewportIndex decorations must: not 333e5c31af7Sopenharmony_ci both be statically used by one or more code:OpEntryPoint's that form the 334e5c31af7Sopenharmony_ci <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader 335e5c31af7Sopenharmony_ci stages>> of a graphics pipeline 336e5c31af7Sopenharmony_ci * [[VUID-{refpage}-FPRoundingMode-04675]] 337e5c31af7Sopenharmony_ci Rounding modes other than round-to-nearest-even and round-towards-zero 338e5c31af7Sopenharmony_ci must: not be used for the code:FPRoundingMode decoration 339e5c31af7Sopenharmony_ci * [[VUID-{refpage}-FPRoundingMode-04676]] 340e5c31af7Sopenharmony_ci The code:FPRoundingMode decoration must: only be used for a width-only 341e5c31af7Sopenharmony_ci conversion instruction whose only uses are code:Object operands of 342e5c31af7Sopenharmony_ci code:OpStore instructions storing through a pointer to a 16-bit 343e5c31af7Sopenharmony_ci floating-point object in the code:StorageBuffer, 344e5c31af7Sopenharmony_ci code:PhysicalStorageBuffer, code:Uniform, or code:Output storage class 345e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Invariant-04677]] 346e5c31af7Sopenharmony_ci Variables decorated with code:Invariant and variables with structure 347e5c31af7Sopenharmony_ci types that have any members decorated with code:Invariant must: be in 348e5c31af7Sopenharmony_ci the code:Output or code:Input storage class, code:Invariant used on an 349e5c31af7Sopenharmony_ci code:Input storage class variable or structure member has no effect 350e5c31af7Sopenharmony_ci * [[VUID-{refpage}-VulkanMemoryModel-04678]] 351e5c31af7Sopenharmony_ci [[builtin-volatile-semantics]] If the code:VulkanMemoryModel capability 352e5c31af7Sopenharmony_ci is not declared, the code:Volatile decoration must: be used on any 353e5c31af7Sopenharmony_ci variable declaration that includes one of the code:SMIDNV, 354e5c31af7Sopenharmony_ci code:WarpIDNV, code:SubgroupSize, code:SubgroupLocalInvocationId, 355e5c31af7Sopenharmony_ci code:SubgroupEqMask, code:SubgroupGeMask, code:SubgroupGtMask, 356e5c31af7Sopenharmony_ci code:SubgroupLeMask, or code:SubgroupLtMask code:BuiltIn decorations 357e5c31af7Sopenharmony_ci when used in the ray generation, closest hit, miss, intersection, or 358e5c31af7Sopenharmony_ci callable shaders, or with the code:RayTmaxKHR code:Builtin decoration 359e5c31af7Sopenharmony_ci when used in an intersection shader 360e5c31af7Sopenharmony_ci * [[VUID-{refpage}-VulkanMemoryModel-04679]] 361e5c31af7Sopenharmony_ci If the code:VulkanMemoryModel capability is declared, the code:OpLoad 362e5c31af7Sopenharmony_ci instruction must: use the code:Volatile memory semantics when it 363e5c31af7Sopenharmony_ci accesses into any variable that includes one of the code:SMIDNV, 364e5c31af7Sopenharmony_ci code:WarpIDNV, code:SubgroupSize, code:SubgroupLocalInvocationId, 365e5c31af7Sopenharmony_ci code:SubgroupEqMask, code:SubgroupGeMask, code:SubgroupGtMask, 366e5c31af7Sopenharmony_ci code:SubgroupLeMask, or code:SubgroupLtMask code:BuiltIn decorations 367e5c31af7Sopenharmony_ci when used in the ray generation, closest hit, miss, intersection, or 368e5c31af7Sopenharmony_ci callable shaders, or with the code:RayTmaxKHR code:Builtin decoration 369e5c31af7Sopenharmony_ci when used in an intersection shader 370e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeRuntimeArray-04680]] 371e5c31af7Sopenharmony_ci code:OpTypeRuntimeArray must: only be used for the last member of an 372e5c31af7Sopenharmony_ci code:OpTypeStruct that is in the code:StorageBuffer or 373e5c31af7Sopenharmony_ci code:PhysicalStorageBuffer storage class decorated as code:Block, or 374e5c31af7Sopenharmony_ci that is in the code:Uniform storage class decorated as code:BufferBlock 375e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Function-04681]] 376e5c31af7Sopenharmony_ci A type _T_ that is an array sized with a specialization constant must: 377e5c31af7Sopenharmony_ci neither be, nor be contained in, the type _T2_ of a variable _V_, unless 378e5c31af7Sopenharmony_ci either: a) _T_ is equal to _T2_, b) _V_ is declared in the 379e5c31af7Sopenharmony_ci code:Function, or code:Private storage classes, c) _V_ is a non-Block 380e5c31af7Sopenharmony_ci variable in the code:Workgroup storage class, or d) _V_ is an interface 381e5c31af7Sopenharmony_ci variable with an additional level of arrayness, 382e5c31af7Sopenharmony_ci <<interfaces-iointerfaces-matching, as described in interface 383e5c31af7Sopenharmony_ci matching>>, and _T_ is the member type of the array type _T2_ 384e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpControlBarrier-04682]] 385e5c31af7Sopenharmony_ci If code:OpControlBarrier is used in ray generation, intersection, 386e5c31af7Sopenharmony_ci any-hit, closest hit, miss, fragment, vertex, tessellation evaluation, 387e5c31af7Sopenharmony_ci or geometry shaders, the execution Scope must: be code:Subgroup 388e5c31af7Sopenharmony_ci * [[VUID-{refpage}-LocalSize-06426]] 389e5c31af7Sopenharmony_ci For each compute shader entry point, either a code:LocalSize or 390e5c31af7Sopenharmony_ci code:LocalSizeId execution mode, or an object decorated with the 391e5c31af7Sopenharmony_ci code:WorkgroupSize decoration must: be specified 392e5c31af7Sopenharmony_ci * [[VUID-{refpage}-DerivativeGroupQuadsNV-04684]] 393e5c31af7Sopenharmony_ci For compute shaders using the code:DerivativeGroupQuadsNV execution 394e5c31af7Sopenharmony_ci mode, the first two dimensions of the local workgroup size must: be a 395e5c31af7Sopenharmony_ci multiple of two 396e5c31af7Sopenharmony_ci * [[VUID-{refpage}-DerivativeGroupLinearNV-04778]] 397e5c31af7Sopenharmony_ci For compute shaders using the code:DerivativeGroupLinearNV execution 398e5c31af7Sopenharmony_ci mode, the product of the dimensions of the local workgroup size must: be 399e5c31af7Sopenharmony_ci a multiple of four 400e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpGroupNonUniformBallotBitCount-04685]] 401e5c31af7Sopenharmony_ci If code:OpGroupNonUniformBallotBitCount is used, the group operation 402e5c31af7Sopenharmony_ci must: be limited to *Reduce*, *InclusiveScan*, or *ExclusiveScan* 403e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04686]] 404e5c31af7Sopenharmony_ci The _Pointer_ operand of all atomic instructions must: have a *Storage 405e5c31af7Sopenharmony_ci Class* limited to *Uniform*, *Workgroup*, *Image*, *StorageBuffer*, or 406e5c31af7Sopenharmony_ci *PhysicalStorageBuffer* 407e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-04687]] 408e5c31af7Sopenharmony_ci Output variables or block members decorated with code:Offset that have a 409e5c31af7Sopenharmony_ci 64-bit type, or a composite type containing a 64-bit type, must: specify 410e5c31af7Sopenharmony_ci an code:Offset value aligned to a 8 byte boundary 411e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-04689]] 412e5c31af7Sopenharmony_ci The size of any output block containing any member decorated with 413e5c31af7Sopenharmony_ci code:Offset that is a 64-bit type must: be a multiple of 8 414e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-04690]] 415e5c31af7Sopenharmony_ci The first member of an output block specifying a code:Offset decoration 416e5c31af7Sopenharmony_ci must: specify a code:Offset value that is aligned to an 8 byte boundary 417e5c31af7Sopenharmony_ci if that block contains any member decorated with code:Offset and is a 418e5c31af7Sopenharmony_ci 64-bit type 419e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-04691]] 420e5c31af7Sopenharmony_ci Output variables or block members decorated with code:Offset that have a 421e5c31af7Sopenharmony_ci 32-bit type, or a composite type contains a 32-bit type, must: specify 422e5c31af7Sopenharmony_ci an code:Offset value aligned to a 4 byte boundary 423e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-04692]] 424e5c31af7Sopenharmony_ci Output variables, blocks or block members decorated with code:Offset 425e5c31af7Sopenharmony_ci must: only contain base types that have components that are either 426e5c31af7Sopenharmony_ci 32-bit or 64-bit in size 427e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-04716]] 428e5c31af7Sopenharmony_ci Only variables or block members in the output interface decorated with 429e5c31af7Sopenharmony_ci code:Offset can: be captured for transform feedback, and those variables 430e5c31af7Sopenharmony_ci or block members must: also be decorated with code:XfbBuffer and 431e5c31af7Sopenharmony_ci code:XfbStride, or inherit code:XfbBuffer and code:XfbStride decorations 432e5c31af7Sopenharmony_ci from a block containing them 433e5c31af7Sopenharmony_ci * [[VUID-{refpage}-XfbBuffer-04693]] 434e5c31af7Sopenharmony_ci All variables or block members in the output interface of the entry 435e5c31af7Sopenharmony_ci point being compiled decorated with a specific code:XfbBuffer value 436e5c31af7Sopenharmony_ci must: all be decorated with identical code:XfbStride values 437e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Stream-04694]] 438e5c31af7Sopenharmony_ci If any variables or block members in the output interface of the entry 439e5c31af7Sopenharmony_ci point being compiled are decorated with code:Stream, then all variables 440e5c31af7Sopenharmony_ci belonging to the same code:XfbBuffer must: specify the same code:Stream 441e5c31af7Sopenharmony_ci value 442e5c31af7Sopenharmony_ci * [[VUID-{refpage}-XfbBuffer-04696]] 443e5c31af7Sopenharmony_ci For any two variables or block members in the output interface of the 444e5c31af7Sopenharmony_ci entry point being compiled with the same code:XfbBuffer value, the 445e5c31af7Sopenharmony_ci ranges determined by the code:Offset decoration and the size of the type 446e5c31af7Sopenharmony_ci must: not overlap 447e5c31af7Sopenharmony_ci * [[VUID-{refpage}-XfbBuffer-04697]] 448e5c31af7Sopenharmony_ci All block members in the output interface of the entry point being 449e5c31af7Sopenharmony_ci compiled that are in the same block and have a declared or inherited 450e5c31af7Sopenharmony_ci code:XfbBuffer decoration must: specify the same code:XfbBuffer value 451e5c31af7Sopenharmony_ci * [[VUID-{refpage}-RayPayloadKHR-04698]] 452e5c31af7Sopenharmony_ci code:RayPayloadKHR storage class must: only be used in ray generation, 453e5c31af7Sopenharmony_ci closest hit or miss shaders 454e5c31af7Sopenharmony_ci * [[VUID-{refpage}-IncomingRayPayloadKHR-04699]] 455e5c31af7Sopenharmony_ci code:IncomingRayPayloadKHR storage class must: only be used in closest 456e5c31af7Sopenharmony_ci hit, any-hit, or miss shaders 457e5c31af7Sopenharmony_ci * [[VUID-{refpage}-IncomingRayPayloadKHR-04700]] 458e5c31af7Sopenharmony_ci There must: be at most one variable with the code:IncomingRayPayloadKHR 459e5c31af7Sopenharmony_ci storage class in the input interface of an entry point 460e5c31af7Sopenharmony_ci * [[VUID-{refpage}-HitAttributeKHR-04701]] 461e5c31af7Sopenharmony_ci code:HitAttributeKHR storage class must: only be used in intersection, 462e5c31af7Sopenharmony_ci any-hit, or closest hit shaders 463e5c31af7Sopenharmony_ci * [[VUID-{refpage}-HitAttributeKHR-04702]] 464e5c31af7Sopenharmony_ci There must: be at most one variable with the code:HitAttributeKHR 465e5c31af7Sopenharmony_ci storage class in the input interface of an entry point 466e5c31af7Sopenharmony_ci * [[VUID-{refpage}-HitAttributeKHR-04703]] 467e5c31af7Sopenharmony_ci A variable with code:HitAttributeKHR storage class must: only be written 468e5c31af7Sopenharmony_ci to in an intersection shader 469e5c31af7Sopenharmony_ci * [[VUID-{refpage}-CallableDataKHR-04704]] 470e5c31af7Sopenharmony_ci code:CallableDataKHR storage class must: only be used in ray generation, 471e5c31af7Sopenharmony_ci closest hit, miss, and callable shaders 472e5c31af7Sopenharmony_ci * [[VUID-{refpage}-IncomingCallableDataKHR-04705]] 473e5c31af7Sopenharmony_ci code:IncomingCallableDataKHR storage class must: only be used in 474e5c31af7Sopenharmony_ci callable shaders 475e5c31af7Sopenharmony_ci * [[VUID-{refpage}-IncomingCallableDataKHR-04706]] 476e5c31af7Sopenharmony_ci There must: be at most one variable with the 477e5c31af7Sopenharmony_ci code:IncomingCallableDataKHR storage class in the input interface of an 478e5c31af7Sopenharmony_ci entry point 479e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Base-04707]] 480e5c31af7Sopenharmony_ci The code:Base operand of code:OpPtrAccessChain must: point to one of the 481e5c31af7Sopenharmony_ci following: *Workgroup*, if code:VariablePointers is enabled; 482e5c31af7Sopenharmony_ci *StorageBuffer*, if code:VariablePointers or 483e5c31af7Sopenharmony_ci code:VariablePointersStorageBuffer is enabled; *PhysicalStorageBuffer*, 484e5c31af7Sopenharmony_ci if the code:PhysicalStorageBuffer64 addressing model is enabled 485e5c31af7Sopenharmony_ci * [[VUID-{refpage}-PhysicalStorageBuffer64-04708]] 486e5c31af7Sopenharmony_ci If the code:PhysicalStorageBuffer64 addressing model is enabled, all 487e5c31af7Sopenharmony_ci instructions that support memory access operands and that use a physical 488e5c31af7Sopenharmony_ci pointer must: include the code:Aligned operand 489e5c31af7Sopenharmony_ci * [[VUID-{refpage}-PhysicalStorageBuffer64-04709]] 490e5c31af7Sopenharmony_ci If the code:PhysicalStorageBuffer64 addressing model is enabled, any 491e5c31af7Sopenharmony_ci access chain instruction that accesses into a code:RowMajor matrix must: 492e5c31af7Sopenharmony_ci only be used as the code:Pointer operand to code:OpLoad or code:OpStore 493e5c31af7Sopenharmony_ci * [[VUID-{refpage}-PhysicalStorageBuffer64-04710]] 494e5c31af7Sopenharmony_ci If the code:PhysicalStorageBuffer64 addressing model is enabled, 495e5c31af7Sopenharmony_ci code:OpConvertUToPtr and code:OpConvertPtrToU must: use an integer type 496e5c31af7Sopenharmony_ci whose code:Width is 64 497e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeForwardPointer-04711]] 498e5c31af7Sopenharmony_ci code:OpTypeForwardPointer must: have a storage class of 499e5c31af7Sopenharmony_ci code:PhysicalStorageBuffer 500e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-04745]] 501e5c31af7Sopenharmony_ci All variables with a storage class of *PushConstant* declared as an 502e5c31af7Sopenharmony_ci array must: only be accessed by dynamically uniform indices 503e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Result-04780]] 504e5c31af7Sopenharmony_ci The code:Result code:Type operand of any code:OpImageRead or 505e5c31af7Sopenharmony_ci code:OpImageSparseRead instruction must: be a vector of four components 506e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Base-04781]] 507e5c31af7Sopenharmony_ci The code:Base operand of any code:OpBitCount, code:OpBitReverse, 508e5c31af7Sopenharmony_ci code:OpBitFieldInsert, code:OpBitFieldSExtract, or 509e5c31af7Sopenharmony_ci code:OpBitFieldUExtract instruction must: be a 32-bit integer scalar or 510e5c31af7Sopenharmony_ci a vector of 32-bit integers 511e5c31af7Sopenharmony_ci**** 512e5c31af7Sopenharmony_ci-- 513e5c31af7Sopenharmony_ci 514e5c31af7Sopenharmony_ci[[spirvenv-module-validation-runtime]] 515e5c31af7Sopenharmony_ci=== Runtime SPIR-V Validation 516e5c31af7Sopenharmony_ci 517e5c31af7Sopenharmony_ci[open,refpage='RuntimeSpirv',desc='Runtime SPIR-V Validation',type='spirv'] 518e5c31af7Sopenharmony_ci-- 519e5c31af7Sopenharmony_ci:refpage: RuntimeSpirv 520e5c31af7Sopenharmony_ci 521e5c31af7Sopenharmony_ciThe following rules must: be validated at runtime. 522e5c31af7Sopenharmony_ciThese rules depend on knowledge of the implementation and its capabilities 523e5c31af7Sopenharmony_ciand knowledge of runtime information, such as enabled features. 524e5c31af7Sopenharmony_ci 525e5c31af7Sopenharmony_ci.Valid Usage 526e5c31af7Sopenharmony_ci**** 527e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[] 528e5c31af7Sopenharmony_ci * [[VUID-{refpage}-vulkanMemoryModel-06265]] 529e5c31af7Sopenharmony_ci If <<features-vulkanMemoryModel,pname:vulkanMemoryModel>> is enabled and 530e5c31af7Sopenharmony_ci <<features-vulkanMemoryModelDeviceScope,pname:vulkanMemoryModelDeviceScope>> 531e5c31af7Sopenharmony_ci is not enabled, *Device* memory scope must: not be used. 532e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[] 533e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[] 534e5c31af7Sopenharmony_ci * [[VUID-{refpage}-vulkanMemoryModel-06266]] 535e5c31af7Sopenharmony_ci If <<features-vulkanMemoryModel,pname:vulkanMemoryModel>> is not 536e5c31af7Sopenharmony_ci enabled, *QueueFamily* memory scope must: not be used. 537e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[] 538e5c31af7Sopenharmony_ciifdef::VK_KHR_shader_clock[] 539e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderSubgroupClock-06267]] 540e5c31af7Sopenharmony_ci If <<features-shaderSubgroupClock,pname:shaderSubgroupClock>> is not 541e5c31af7Sopenharmony_ci enabled, the code:Subgroup scope must: not be used for 542e5c31af7Sopenharmony_ci code:OpReadClockKHR. 543e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderDeviceClock-06268]] 544e5c31af7Sopenharmony_ci If <<features-shaderDeviceClock,pname:shaderDeviceClock>> is not 545e5c31af7Sopenharmony_ci enabled, the code:Device scope must: not be used for 546e5c31af7Sopenharmony_ci code:OpReadClockKHR. 547e5c31af7Sopenharmony_ciendif::VK_KHR_shader_clock[] 548e5c31af7Sopenharmony_ciifndef::VK_KHR_format_feature_flags2[] 549e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeImage-06269]] 550e5c31af7Sopenharmony_ci If 551e5c31af7Sopenharmony_ci <<features-shaderStorageImageWriteWithoutFormat,shaderStorageImageWriteWithoutFormat>> 552e5c31af7Sopenharmony_ci is not enabled, any variable created with a "`Type`" of code:OpTypeImage 553e5c31af7Sopenharmony_ci that has a "`Sampled`" operand of 2 and an "`Image Format`" operand of 554e5c31af7Sopenharmony_ci code:Unknown must: be decorated with code:NonWritable. 555e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeImage-06270]] 556e5c31af7Sopenharmony_ci If 557e5c31af7Sopenharmony_ci <<features-shaderStorageImageReadWithoutFormat,shaderStorageImageReadWithoutFormat>> 558e5c31af7Sopenharmony_ci is not enabled, any variable created with a "`Type`" of code:OpTypeImage 559e5c31af7Sopenharmony_ci that has a "`Sampled`" operand of 2 and an "`Image Format`" operand of 560e5c31af7Sopenharmony_ci code:Unknown must: be decorated with code:NonReadable. 561e5c31af7Sopenharmony_ciendif::VK_KHR_format_feature_flags2[] 562e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Location-06272]] 563e5c31af7Sopenharmony_ci The sum of code:Location and the number of locations the variable it 564e5c31af7Sopenharmony_ci decorates consumes must: be less than or equal to the value for the 565e5c31af7Sopenharmony_ci matching {ExecutionModel} defined in <<interfaces-iointerfaces-limits>> 566e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Fragment-06427]] 567e5c31af7Sopenharmony_ci When blending is enabled and one of the dual source blend modes is in 568e5c31af7Sopenharmony_ci use, the maximum number of output attachments written to in the 569e5c31af7Sopenharmony_ci code:Fragment {ExecutionModel} must: be less than or equal to 570e5c31af7Sopenharmony_ci <<limits-maxFragmentDualSrcAttachments,pname:maxFragmentDualSrcAttachments>> 571e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Location-06428]] 572e5c31af7Sopenharmony_ci The maximum number of storage buffers, storage images, and output 573e5c31af7Sopenharmony_ci code:Location decorated color attachments written to in the 574e5c31af7Sopenharmony_ci code:Fragment {ExecutionModel} must: be less than or equal to 575e5c31af7Sopenharmony_ci <<limits-maxFragmentCombinedOutputResources,pname:maxFragmentCombinedOutputResources>> 576e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] 577e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeRuntimeArray-06273]] 578e5c31af7Sopenharmony_ci code:OpTypeRuntimeArray must: only be used for an array of variables 579e5c31af7Sopenharmony_ci with storage class code:Uniform, code:StorageBuffer, or 580e5c31af7Sopenharmony_ci code:UniformConstant, or for the outermost dimension of an array of 581e5c31af7Sopenharmony_ci arrays of such variables if the 582e5c31af7Sopenharmony_ci <<features-runtimeDescriptorArray,runtimeDescriptorArray>> feature is 583e5c31af7Sopenharmony_ci enabled, 584e5c31af7Sopenharmony_ci * [[VUID-{refpage}-NonUniform-06274]] 585e5c31af7Sopenharmony_ci If an instruction loads from or stores to a resource (including atomics 586e5c31af7Sopenharmony_ci and image instructions) and the resource descriptor being accessed is 587e5c31af7Sopenharmony_ci not dynamically uniform, then the operand corresponding to that resource 588e5c31af7Sopenharmony_ci (e.g. the pointer or sampled image operand) must: be decorated with 589e5c31af7Sopenharmony_ci code:NonUniform. 590e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] 591e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_1[] 592e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_KHR_shader_subgroup_extended_types[] 593e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06275]] 594e5c31af7Sopenharmony_ci <<features-subgroup-extended-types,shaderSubgroupExtendedTypes>> must: 595e5c31af7Sopenharmony_ci be enabled for <<shaders-group-operations,group operations>> to use 596e5c31af7Sopenharmony_ci 8-bit integer, 16-bit integer, 64-bit integer, 16-bit floating-point, 597e5c31af7Sopenharmony_ci and vectors of these types 598e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_subgroup_extended_types[] 599e5c31af7Sopenharmony_ciendif::VK_VERSION_1_1[] 600e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2[] 601e5c31af7Sopenharmony_ci * [[VUID-{refpage}-subgroupBroadcastDynamicId-06276]] 602e5c31af7Sopenharmony_ci If 603e5c31af7Sopenharmony_ci <<features-subgroupBroadcastDynamicId,code:subgroupBroadcastDynamicId>> 604e5c31af7Sopenharmony_ci is ename:VK_TRUE, and the shader module version is 1.5 or higher, the 605e5c31af7Sopenharmony_ci "`Index`" for code:OpGroupNonUniformQuadBroadcast must: be dynamically 606e5c31af7Sopenharmony_ci uniform within the derivative group. 607e5c31af7Sopenharmony_ci Otherwise, "`Index`" must: be a constant. 608e5c31af7Sopenharmony_ci * [[VUID-{refpage}-subgroupBroadcastDynamicId-06277]] 609e5c31af7Sopenharmony_ci If 610e5c31af7Sopenharmony_ci <<features-subgroupBroadcastDynamicId,code:subgroupBroadcastDynamicId>> 611e5c31af7Sopenharmony_ci is ename:VK_TRUE, and the shader module version is 1.5 or higher, the 612e5c31af7Sopenharmony_ci "`Id`" for code:OpGroupNonUniformBroadcast must: be dynamically uniform 613e5c31af7Sopenharmony_ci within the subgroup. 614e5c31af7Sopenharmony_ci Otherwise, "`Id`" must: be a constant. 615e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2[] 616e5c31af7Sopenharmony_ciifdef::VK_KHR_shader_atomic_int64[] 617e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06278]] 618e5c31af7Sopenharmony_ci <<features-shaderBufferInt64Atomics,shaderBufferInt64Atomics>> must: be 619e5c31af7Sopenharmony_ci enabled for 64-bit integer atomic operations to be supported on a 620e5c31af7Sopenharmony_ci _Pointer_ with a *Storage Class* of *StorageBuffer* or *Uniform*. 621e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06279]] 622e5c31af7Sopenharmony_ci <<features-shaderSharedInt64Atomics,shaderSharedInt64Atomics>> must: be 623e5c31af7Sopenharmony_ci enabled for 64-bit integer atomic operations to be supported on a 624e5c31af7Sopenharmony_ci _Pointer_ with a *Storage Class* of *Workgroup*. 625e5c31af7Sopenharmony_ciendif::VK_KHR_shader_atomic_int64[] 626e5c31af7Sopenharmony_ciifdef::VK_EXT_shader_atomic_float[] 627e5c31af7Sopenharmony_ciifndef::VK_EXT_shader_atomic_float2[] 628e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06280]] 629e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32Atomics,shaderBufferFloat32Atomics>>, or 630e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32AtomicAdd,shaderBufferFloat32AtomicAdd>>, 631e5c31af7Sopenharmony_ci or <<features-shaderBufferFloat64Atomics,shaderBufferFloat64Atomics>>, 632e5c31af7Sopenharmony_ci or 633e5c31af7Sopenharmony_ci <<features-shaderBufferFloat64AtomicAdd,shaderBufferFloat64AtomicAdd>> 634e5c31af7Sopenharmony_ci must: be enabled for floating-point atomic operations to be supported on 635e5c31af7Sopenharmony_ci a _Pointer_ with a *Storage Class* of *StorageBuffer*. 636e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06281]] 637e5c31af7Sopenharmony_ci <<features-shaderSharedFloat32Atomics,shaderSharedFloat32Atomics>>, or 638e5c31af7Sopenharmony_ci <<features-shaderSharedFloat32AtomicAdd,shaderSharedFloat32AtomicAdd>>, 639e5c31af7Sopenharmony_ci or <<features-shaderSharedFloat64Atomics,shaderSharedFloat64Atomics>>, 640e5c31af7Sopenharmony_ci or 641e5c31af7Sopenharmony_ci <<features-shaderSharedFloat64AtomicAdd,shaderSharedFloat64AtomicAdd>> 642e5c31af7Sopenharmony_ci must: be enabled for floating-point atomic operations to be supported on 643e5c31af7Sopenharmony_ci a _Pointer_ with a *Storage Class* of *Workgroup*. 644e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06282]] 645e5c31af7Sopenharmony_ci <<features-shaderImageFloat32Atomics,shaderImageFloat32Atomics>> or 646e5c31af7Sopenharmony_ci <<features-shaderImageFloat32AtomicAdd,shaderImageFloat32AtomicAdd>> 647e5c31af7Sopenharmony_ci must: be enabled for 32-bit floating-point atomic operations to be 648e5c31af7Sopenharmony_ci supported on a _Pointer_ with a *Storage Class* of *Image*. 649e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06283]] 650e5c31af7Sopenharmony_ci <<features-sparseImageFloat32Atomics,sparseImageFloat32Atomics>> or 651e5c31af7Sopenharmony_ci <<features-sparseImageFloat32AtomicAdd,sparseImageFloat32AtomicAdd>> 652e5c31af7Sopenharmony_ci must: be enabled for 32-bit floating-point atomics to be supported on 653e5c31af7Sopenharmony_ci sparse images. 654e5c31af7Sopenharmony_ciendif::VK_EXT_shader_atomic_float2[] 655e5c31af7Sopenharmony_ciendif::VK_EXT_shader_atomic_float[] 656e5c31af7Sopenharmony_ciifdef::VK_EXT_shader_atomic_float2[] 657e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06284]] 658e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32Atomics,shaderBufferFloat32Atomics>>, or 659e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32AtomicAdd,shaderBufferFloat32AtomicAdd>>, 660e5c31af7Sopenharmony_ci or <<features-shaderBufferFloat64Atomics,shaderBufferFloat64Atomics>>, 661e5c31af7Sopenharmony_ci or 662e5c31af7Sopenharmony_ci <<features-shaderBufferFloat64AtomicAdd,shaderBufferFloat64AtomicAdd>>, 663e5c31af7Sopenharmony_ci or 664e5c31af7Sopenharmony_ci <<features-shaderBufferFloat16AtomicMinMax,shaderBufferFloat16Atomics>>, 665e5c31af7Sopenharmony_ci or 666e5c31af7Sopenharmony_ci <<features-shaderBufferFloat16AtomicMinMax,shaderBufferFloat16AtomicAdd>>, 667e5c31af7Sopenharmony_ci or 668e5c31af7Sopenharmony_ci <<features-shaderBufferFloat16AtomicMinMax,shaderBufferFloat16AtomicMinMax>>, 669e5c31af7Sopenharmony_ci or 670e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32AtomicMinMax,shaderBufferFloat32AtomicMinMax>>, 671e5c31af7Sopenharmony_ci or 672e5c31af7Sopenharmony_ci <<features-shaderBufferFloat64AtomicMinMax,shaderBufferFloat64AtomicMinMax>> 673e5c31af7Sopenharmony_ci must: be enabled for floating-point atomic operations to be supported on 674e5c31af7Sopenharmony_ci a _Pointer_ with a *Storage Class* of *StorageBuffer*. 675e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06285]] 676e5c31af7Sopenharmony_ci <<features-shaderSharedFloat32Atomics,shaderSharedFloat32Atomics>>, or 677e5c31af7Sopenharmony_ci <<features-shaderSharedFloat32AtomicAdd,shaderSharedFloat32AtomicAdd>>, 678e5c31af7Sopenharmony_ci or <<features-shaderSharedFloat64Atomics,shaderSharedFloat64Atomics>>, 679e5c31af7Sopenharmony_ci or 680e5c31af7Sopenharmony_ci <<features-shaderSharedFloat64AtomicAdd,shaderSharedFloat64AtomicAdd>>, 681e5c31af7Sopenharmony_ci or 682e5c31af7Sopenharmony_ci <<features-shaderBufferFloat16AtomicMinMax,shaderSharedFloat16Atomics>>, 683e5c31af7Sopenharmony_ci or 684e5c31af7Sopenharmony_ci <<features-shaderBufferFloat16AtomicMinMax,shaderSharedFloat16AtomicAdd>>, 685e5c31af7Sopenharmony_ci or 686e5c31af7Sopenharmony_ci <<features-shaderBufferFloat16AtomicMinMax,shaderSharedFloat16AtomicMinMax>>, 687e5c31af7Sopenharmony_ci or 688e5c31af7Sopenharmony_ci <<features-shaderSharedFloat32AtomicMinMax,shaderSharedFloat32AtomicMinMax>>, 689e5c31af7Sopenharmony_ci or 690e5c31af7Sopenharmony_ci <<features-shaderSharedFloat64AtomicMinMax,shaderSharedFloat64AtomicMinMax>> 691e5c31af7Sopenharmony_ci must: be enabled for floating-point atomic operations to be supported on 692e5c31af7Sopenharmony_ci a _Pointer_ with a *Storage Class* of *Workgroup*. 693e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06286]] 694e5c31af7Sopenharmony_ci <<features-shaderImageFloat32Atomics,shaderImageFloat32Atomics>>, or 695e5c31af7Sopenharmony_ci <<features-shaderImageFloat32AtomicAdd,shaderImageFloat32AtomicAdd>>, or 696e5c31af7Sopenharmony_ci <<features-shaderImageFloat32AtomicMinMax,shaderImageFloat32AtomicMinMax>> 697e5c31af7Sopenharmony_ci must: be enabled for 32-bit floating-point atomic operations to be 698e5c31af7Sopenharmony_ci supported on a _Pointer_ with a *Storage Class* of *Image*. 699e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06287]] 700e5c31af7Sopenharmony_ci <<features-sparseImageFloat32Atomics,sparseImageFloat32Atomics>>, or 701e5c31af7Sopenharmony_ci <<features-sparseImageFloat32AtomicAdd,sparseImageFloat32AtomicAdd>>, or 702e5c31af7Sopenharmony_ci <<features-sparseImageFloat32AtomicMinMax,sparseImageFloat32AtomicMinMax>> 703e5c31af7Sopenharmony_ci must: be enabled for 32-bit floating-point atomics to be supported on 704e5c31af7Sopenharmony_ci sparse images. 705e5c31af7Sopenharmony_ciendif::VK_EXT_shader_atomic_float2[] 706e5c31af7Sopenharmony_ciifdef::VK_EXT_shader_image_atomic_int64[] 707e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06288]] 708e5c31af7Sopenharmony_ci <<features-shaderImageInt64Atomics,shaderImageInt64Atomics>> must: be 709e5c31af7Sopenharmony_ci enabled for 64-bit integer atomic operations to be supported on a 710e5c31af7Sopenharmony_ci _Pointer_ with a *Storage Class* of *Image*. 711e5c31af7Sopenharmony_ciendif::VK_EXT_shader_image_atomic_int64[] 712e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 713e5c31af7Sopenharmony_ci * [[VUID-{refpage}-denormBehaviorIndependence-06289]] 714e5c31af7Sopenharmony_ci If 715e5c31af7Sopenharmony_ci <<features-denormBehaviorIndependence,pname:denormBehaviorIndependence>> 716e5c31af7Sopenharmony_ci is ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY, then the 717e5c31af7Sopenharmony_ci entry point must: use the same denormals execution mode for both 16-bit 718e5c31af7Sopenharmony_ci and 64-bit floating-point types. 719e5c31af7Sopenharmony_ci * [[VUID-{refpage}-denormBehaviorIndependence-06290]] 720e5c31af7Sopenharmony_ci If 721e5c31af7Sopenharmony_ci <<features-denormBehaviorIndependence,pname:denormBehaviorIndependence>> 722e5c31af7Sopenharmony_ci is ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE, then the entry 723e5c31af7Sopenharmony_ci point must: use the same denormals execution mode for all floating-point 724e5c31af7Sopenharmony_ci types. 725e5c31af7Sopenharmony_ci * [[VUID-{refpage}-roundingModeIndependence-06291]] 726e5c31af7Sopenharmony_ci If <<features-roundingModeIndependence,pname:roundingModeIndependence>> 727e5c31af7Sopenharmony_ci is ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY, then the 728e5c31af7Sopenharmony_ci entry point must: use the same rounding execution mode for both 16-bit 729e5c31af7Sopenharmony_ci and 64-bit floating-point types. 730e5c31af7Sopenharmony_ci * [[VUID-{refpage}-roundingModeIndependence-06292]] 731e5c31af7Sopenharmony_ci If <<features-roundingModeIndependence,pname:roundingModeIndependence>> 732e5c31af7Sopenharmony_ci is ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE, then the entry 733e5c31af7Sopenharmony_ci point must: use the same rounding execution mode for all floating-point 734e5c31af7Sopenharmony_ci types. 735e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderSignedZeroInfNanPreserveFloat16-06293]] 736e5c31af7Sopenharmony_ci If 737e5c31af7Sopenharmony_ci <<limits-shaderSignedZeroInfNanPreserveFloat16,pname:shaderSignedZeroInfNanPreserveFloat16>> 738e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:SignedZeroInfNanPreserve for 16-bit 739e5c31af7Sopenharmony_ci floating-point type must: not be used. 740e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderSignedZeroInfNanPreserveFloat32-06294]] 741e5c31af7Sopenharmony_ci If 742e5c31af7Sopenharmony_ci <<limits-shaderSignedZeroInfNanPreserveFloat32,pname:shaderSignedZeroInfNanPreserveFloat32>> 743e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:SignedZeroInfNanPreserve for 32-bit 744e5c31af7Sopenharmony_ci floating-point type must: not be used. 745e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderSignedZeroInfNanPreserveFloat64-06295]] 746e5c31af7Sopenharmony_ci If 747e5c31af7Sopenharmony_ci <<limits-shaderSignedZeroInfNanPreserveFloat64,pname:shaderSignedZeroInfNanPreserveFloat64>> 748e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:SignedZeroInfNanPreserve for 64-bit 749e5c31af7Sopenharmony_ci floating-point type must: not be used. 750e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderDenormPreserveFloat16-06296]] 751e5c31af7Sopenharmony_ci If 752e5c31af7Sopenharmony_ci <<limits-shaderDenormPreserveFloat16,pname:shaderDenormPreserveFloat16>> 753e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:DenormPreserve for 16-bit floating-point 754e5c31af7Sopenharmony_ci type must: not be used. 755e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderDenormPreserveFloat32-06297]] 756e5c31af7Sopenharmony_ci If 757e5c31af7Sopenharmony_ci <<limits-shaderDenormPreserveFloat32,pname:shaderDenormPreserveFloat32>> 758e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:DenormPreserve for 32-bit floating-point 759e5c31af7Sopenharmony_ci type must: not be used. 760e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderDenormPreserveFloat64-06298]] 761e5c31af7Sopenharmony_ci If 762e5c31af7Sopenharmony_ci <<limits-shaderDenormPreserveFloat64,pname:shaderDenormPreserveFloat64>> 763e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:DenormPreserve for 64-bit floating-point 764e5c31af7Sopenharmony_ci type must: not be used. 765e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderDenormFlushToZeroFloat16-06299]] 766e5c31af7Sopenharmony_ci If 767e5c31af7Sopenharmony_ci <<limits-shaderDenormFlushToZeroFloat16,pname:shaderDenormFlushToZeroFloat16>> 768e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:DenormFlushToZero for 16-bit floating-point 769e5c31af7Sopenharmony_ci type must: not be used. 770e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderDenormFlushToZeroFloat32-06300]] 771e5c31af7Sopenharmony_ci If 772e5c31af7Sopenharmony_ci <<limits-shaderDenormFlushToZeroFloat32,pname:shaderDenormFlushToZeroFloat32>> 773e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:DenormFlushToZero for 32-bit floating-point 774e5c31af7Sopenharmony_ci type must: not be used. 775e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderDenormFlushToZeroFloat64-06301]] 776e5c31af7Sopenharmony_ci If 777e5c31af7Sopenharmony_ci <<limits-shaderDenormFlushToZeroFloat64,pname:shaderDenormFlushToZeroFloat64>> 778e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:DenormFlushToZero for 64-bit floating-point 779e5c31af7Sopenharmony_ci type must: not be used. 780e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderRoundingModeRTEFloat16-06302]] 781e5c31af7Sopenharmony_ci If 782e5c31af7Sopenharmony_ci <<limits-shaderRoundingModeRTEFloat16,pname:shaderRoundingModeRTEFloat16>> 783e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:RoundingModeRTE for 16-bit floating-point 784e5c31af7Sopenharmony_ci type must: not be used. 785e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderRoundingModeRTEFloat32-06303]] 786e5c31af7Sopenharmony_ci If 787e5c31af7Sopenharmony_ci <<limits-shaderRoundingModeRTEFloat32,pname:shaderRoundingModeRTEFloat32>> 788e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:RoundingModeRTE for 32-bit floating-point 789e5c31af7Sopenharmony_ci type must: not be used. 790e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderRoundingModeRTEFloat64-06304]] 791e5c31af7Sopenharmony_ci If 792e5c31af7Sopenharmony_ci <<limits-shaderRoundingModeRTEFloat64,pname:shaderRoundingModeRTEFloat64>> 793e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:RoundingModeRTE for 64-bit floating-point 794e5c31af7Sopenharmony_ci type must: not be used. 795e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderRoundingModeRTZFloat16-06305]] 796e5c31af7Sopenharmony_ci If 797e5c31af7Sopenharmony_ci <<limits-shaderRoundingModeRTZFloat16,pname:shaderRoundingModeRTZFloat16>> 798e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:RoundingModeRTZ for 16-bit floating-point 799e5c31af7Sopenharmony_ci type must: not be used. 800e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderRoundingModeRTZFloat32-06306]] 801e5c31af7Sopenharmony_ci If 802e5c31af7Sopenharmony_ci <<limits-shaderRoundingModeRTZFloat32,pname:shaderRoundingModeRTZFloat32>> 803e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:RoundingModeRTZ for 32-bit floating-point 804e5c31af7Sopenharmony_ci type must: not be used. 805e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderRoundingModeRTZFloat64-06307]] 806e5c31af7Sopenharmony_ci If 807e5c31af7Sopenharmony_ci <<limits-shaderRoundingModeRTZFloat64,pname:shaderRoundingModeRTZFloat64>> 808e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:RoundingModeRTZ for 64-bit floating-point 809e5c31af7Sopenharmony_ci type must: not be used. 810e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 811e5c31af7Sopenharmony_ciifdef::VK_EXT_transform_feedback[] 812e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-06308]] 813e5c31af7Sopenharmony_ci The code:Offset plus size of the type of each variable, in the output 814e5c31af7Sopenharmony_ci interface of the entry point being compiled, decorated with 815e5c31af7Sopenharmony_ci code:XfbBuffer must: not be greater than 816e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBufferDataSize 817e5c31af7Sopenharmony_ci * [[VUID-{refpage}-XfbBuffer-06309]] 818e5c31af7Sopenharmony_ci For any given code:XfbBuffer value, define the buffer data size to be 819e5c31af7Sopenharmony_ci smallest number of bytes such that, for all outputs decorated with the 820e5c31af7Sopenharmony_ci same code:XfbBuffer value, the size of the output interface variable 821e5c31af7Sopenharmony_ci plus the code:Offset is less than or equal to the buffer data size. 822e5c31af7Sopenharmony_ci For a given code:Stream, the sum of all the buffer data sizes for all 823e5c31af7Sopenharmony_ci buffers writing to that stream the must: not exceed 824e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreamDataSize 825e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpEmitStreamVertex-06310]] 826e5c31af7Sopenharmony_ci The Stream value to code:OpEmitStreamVertex and 827e5c31af7Sopenharmony_ci code:OpEndStreamPrimitive must: be less than 828e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreams 829e5c31af7Sopenharmony_ci * [[VUID-{refpage}-transformFeedbackStreamsLinesTriangles-06311]] 830e5c31af7Sopenharmony_ci If the geometry shader emits to more than one vertex stream and 831e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:transformFeedbackStreamsLinesTriangles 832e5c31af7Sopenharmony_ci is ename:VK_FALSE, then execution mode must: be code:OutputPoints 833e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Stream-06312]] 834e5c31af7Sopenharmony_ci The stream number value to code:Stream must: be less than 835e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreams 836e5c31af7Sopenharmony_ci * [[VUID-{refpage}-XfbStride-06313]] 837e5c31af7Sopenharmony_ci The XFB Stride value to code:XfbStride must: be less than or equal to 838e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBufferDataStride 839e5c31af7Sopenharmony_ciendif::VK_EXT_transform_feedback[] 840e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[] 841e5c31af7Sopenharmony_ci * [[VUID-{refpage}-PhysicalStorageBuffer64-06314]] 842e5c31af7Sopenharmony_ci If the code:PhysicalStorageBuffer64 addressing model is enabled any load 843e5c31af7Sopenharmony_ci or store through a physical pointer type must: be aligned to a multiple 844e5c31af7Sopenharmony_ci of the size of the largest scalar type in the pointed-to type. 845e5c31af7Sopenharmony_ci * [[VUID-{refpage}-PhysicalStorageBuffer64-06315]] 846e5c31af7Sopenharmony_ci If the code:PhysicalStorageBuffer64 addressing model is enabled the 847e5c31af7Sopenharmony_ci pointer value of a memory access instruction must: be at least as 848e5c31af7Sopenharmony_ci aligned as specified by the code:Aligned memory access operand. 849e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[] 850e5c31af7Sopenharmony_ciifdef::VK_NV_cooperative_matrix[] 851e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeCooperativeMatrixNV-06316]] 852e5c31af7Sopenharmony_ci For code:OpTypeCooperativeMatrixNV, the component type, scope, number of 853e5c31af7Sopenharmony_ci rows, and number of columns must: match one of the matrices in any of 854e5c31af7Sopenharmony_ci the supported slink:VkCooperativeMatrixPropertiesNV. 855e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06317]] 856e5c31af7Sopenharmony_ci For code:OpCooperativeMatrixMulAddNV, the type of code:A must: have 857e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:MSize rows and 858e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:KSize columns and have a 859e5c31af7Sopenharmony_ci component type that matches 860e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:AType. 861e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06318]] 862e5c31af7Sopenharmony_ci For code:OpCooperativeMatrixMulAddNV, the type of code:B must: have 863e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:KSize rows and 864e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:NSize columns and have a 865e5c31af7Sopenharmony_ci component type that matches 866e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:BType. 867e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06319]] 868e5c31af7Sopenharmony_ci For code:OpCooperativeMatrixMulAddNV, the type of code:C must: have 869e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:MSize rows and 870e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:NSize columns and have a 871e5c31af7Sopenharmony_ci component type that matches 872e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:CType. 873e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06320]] 874e5c31af7Sopenharmony_ci For code:OpCooperativeMatrixMulAddNV, the type of code:Result must: have 875e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:MSize rows and 876e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:NSize columns and have a 877e5c31af7Sopenharmony_ci component type that matches 878e5c31af7Sopenharmony_ci slink:VkCooperativeMatrixPropertiesNV::pname:DType. 879e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06321]] 880e5c31af7Sopenharmony_ci For code:OpCooperativeMatrixMulAddNV, the type of code:A, code:B, 881e5c31af7Sopenharmony_ci code:C, and code:Result must: all have a scope of pname:scope. 882e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTypeCooperativeMatrixNV-06322]] 883e5c31af7Sopenharmony_ci code:OpTypeCooperativeMatrixNV and code:OpCooperativeMatrix* 884e5c31af7Sopenharmony_ci instructions must: not be used in shader stages not included in 885e5c31af7Sopenharmony_ci slink:VkPhysicalDeviceCooperativeMatrixPropertiesNV::pname:cooperativeMatrixSupportedStages. 886e5c31af7Sopenharmony_ciendif::VK_NV_cooperative_matrix[] 887e5c31af7Sopenharmony_ci * [[VUID-{refpage}-DescriptorSet-06323]] 888e5c31af7Sopenharmony_ci code:DescriptorSet and code:Binding decorations must: obey the 889e5c31af7Sopenharmony_ci constraints on storage class, type, and descriptor type described in 890e5c31af7Sopenharmony_ci <<interfaces-resources-setandbinding,DescriptorSet and Binding 891e5c31af7Sopenharmony_ci Assignment>> 892e5c31af7Sopenharmony_ciifdef::VK_NV_cooperative_matrix[] 893e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpCooperativeMatrixLoadNV-06324]] 894e5c31af7Sopenharmony_ci For code:OpCooperativeMatrixLoadNV and code:OpCooperativeMatrixStoreNV 895e5c31af7Sopenharmony_ci instructions, the code:Pointer and code:Stride operands must: be aligned 896e5c31af7Sopenharmony_ci to at least the lesser of 16 bytes or the natural alignment of a row or 897e5c31af7Sopenharmony_ci column (depending on code:ColumnMajor) of the matrix (where the natural 898e5c31af7Sopenharmony_ci alignment is the number of columns/rows multiplied by the component 899e5c31af7Sopenharmony_ci size). 900e5c31af7Sopenharmony_ciendif::VK_NV_cooperative_matrix[] 901e5c31af7Sopenharmony_ciifdef::VK_KHR_portability_subset[] 902e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderSampleRateInterpolationFunctions-06325]] 903e5c31af7Sopenharmony_ci If the `apiext:VK_KHR_portability_subset` extension is enabled, and 904e5c31af7Sopenharmony_ci slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:shaderSampleRateInterpolationFunctions 905e5c31af7Sopenharmony_ci is ename:VK_FALSE, then `GLSL.std.450` fragment interpolation functions 906e5c31af7Sopenharmony_ci are not supported by the implementation and code:OpCapability must: not 907e5c31af7Sopenharmony_ci be set to code:InterpolationFunction. 908e5c31af7Sopenharmony_ci * [[VUID-{refpage}-tessellationShader-06326]] 909e5c31af7Sopenharmony_ci If <<features-tessellationShader,pname:tessellationShader>> is enabled, 910e5c31af7Sopenharmony_ci and the `apiext:VK_KHR_portability_subset` extension is enabled, and 911e5c31af7Sopenharmony_ci slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:tessellationIsolines 912e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:OpExecutionMode must: not be set to 913e5c31af7Sopenharmony_ci code:IsoLines. 914e5c31af7Sopenharmony_ci * [[VUID-{refpage}-tessellationShader-06327]] 915e5c31af7Sopenharmony_ci If <<features-tessellationShader,pname:tessellationShader>> is enabled, 916e5c31af7Sopenharmony_ci and the `apiext:VK_KHR_portability_subset` extension is enabled, and 917e5c31af7Sopenharmony_ci slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:tessellationPointMode 918e5c31af7Sopenharmony_ci is ename:VK_FALSE, then code:OpExecutionMode must: not be set to 919e5c31af7Sopenharmony_ci code:PointMode. 920e5c31af7Sopenharmony_ciendif::VK_KHR_portability_subset[] 921e5c31af7Sopenharmony_ciifdef::VK_KHR_8bit_storage[] 922e5c31af7Sopenharmony_ci * [[VUID-{refpage}-storageBuffer8BitAccess-06328]] 923e5c31af7Sopenharmony_ci If <<features-storageBuffer8BitAccess,pname:storageBuffer8BitAccess>> is 924e5c31af7Sopenharmony_ci ename:VK_FALSE, then objects containing an 8-bit integer element must: 925e5c31af7Sopenharmony_ci not have storage class of *StorageBuffer*, *ShaderRecordBufferKHR*, or 926e5c31af7Sopenharmony_ci *PhysicalStorageBuffer*. 927e5c31af7Sopenharmony_ci * [[VUID-{refpage}-uniformAndStorageBuffer8BitAccess-06329]] 928e5c31af7Sopenharmony_ci If 929e5c31af7Sopenharmony_ci <<features-uniformAndStorageBuffer8BitAccess,pname:uniformAndStorageBuffer8BitAccess>> 930e5c31af7Sopenharmony_ci is ename:VK_FALSE, then objects in the *Uniform* storage class with the 931e5c31af7Sopenharmony_ci *Block* decoration must: not have an 8-bit integer member. 932e5c31af7Sopenharmony_ci * [[VUID-{refpage}-storagePushConstant8-06330]] 933e5c31af7Sopenharmony_ci If <<features-storagePushConstant8,pname:storagePushConstant8>> is 934e5c31af7Sopenharmony_ci ename:VK_FALSE, then objects containing an 8-bit integer element must: 935e5c31af7Sopenharmony_ci not have storage class of *PushConstant*. 936e5c31af7Sopenharmony_ciendif::VK_KHR_8bit_storage[] 937e5c31af7Sopenharmony_ciifdef::VK_KHR_16bit_storage[] 938e5c31af7Sopenharmony_ci * [[VUID-{refpage}-storageBuffer16BitAccess-06331]] 939e5c31af7Sopenharmony_ci If <<features-storageBuffer16BitAccess,pname:storageBuffer16BitAccess>> 940e5c31af7Sopenharmony_ci is ename:VK_FALSE, then objects containing 16-bit integer or 16-bit 941e5c31af7Sopenharmony_ci floating-point elements must: not have storage class of *StorageBuffer*, 942e5c31af7Sopenharmony_ci *ShaderRecordBufferKHR*, or *PhysicalStorageBuffer*. 943e5c31af7Sopenharmony_ci * [[VUID-{refpage}-uniformAndStorageBuffer16BitAccess-06332]] 944e5c31af7Sopenharmony_ci If 945e5c31af7Sopenharmony_ci <<features-uniformAndStorageBuffer16BitAccess,pname:uniformAndStorageBuffer16BitAccess>> 946e5c31af7Sopenharmony_ci is ename:VK_FALSE, then objects in the *Uniform* storage class with the 947e5c31af7Sopenharmony_ci *Block* decoration must: not have 16-bit integer or 16-bit 948e5c31af7Sopenharmony_ci floating-point members. 949e5c31af7Sopenharmony_ci * [[VUID-{refpage}-storagePushConstant16-06333]] 950e5c31af7Sopenharmony_ci If <<features-storagePushConstant16,pname:storagePushConstant16>> is 951e5c31af7Sopenharmony_ci ename:VK_FALSE, then objects containing 16-bit integer or 16-bit 952e5c31af7Sopenharmony_ci floating-point elements must: not have storage class of *PushConstant*. 953e5c31af7Sopenharmony_ci * [[VUID-{refpage}-storageInputOutput16-06334]] 954e5c31af7Sopenharmony_ci If <<features-storageInputOutput16,pname:storageInputOutput16>> is 955e5c31af7Sopenharmony_ci ename:VK_FALSE, then objects containing 16-bit integer or 16-bit 956e5c31af7Sopenharmony_ci floating-point elements must: not have storage class of *Input* or 957e5c31af7Sopenharmony_ci *Output*. 958e5c31af7Sopenharmony_ciendif::VK_KHR_16bit_storage[] 959e5c31af7Sopenharmony_ciifdef::VK_EXT_shader_atomic_float[] 960e5c31af7Sopenharmony_ciifndef::VK_EXT_shader_atomic_float2[] 961e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06335]] 962e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32Atomics,shaderBufferFloat32Atomics>>, or 963e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32AtomicAdd,shaderBufferFloat32AtomicAdd>>, 964e5c31af7Sopenharmony_ci or <<features-shaderSharedFloat32Atomics,shaderSharedFloat32Atomics>>, 965e5c31af7Sopenharmony_ci or 966e5c31af7Sopenharmony_ci <<features-shaderSharedFloat32AtomicAdd,shaderSharedFloat32AtomicAdd>>, 967e5c31af7Sopenharmony_ci or <<features-shaderImageFloat32Atomics,shaderImageFloat32Atomics>>, or 968e5c31af7Sopenharmony_ci <<features-shaderImageFloat32AtomicAdd,shaderImageFloat32AtomicAdd>> 969e5c31af7Sopenharmony_ci must: be enabled for 32-bit floating point atomic operations 970e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06336]] 971e5c31af7Sopenharmony_ci <<features-shaderBufferFloat64Atomics,shaderBufferFloat64Atomics>>, or 972e5c31af7Sopenharmony_ci <<features-shaderBufferFloat64AtomicAdd,shaderBufferFloat64AtomicAdd>>, 973e5c31af7Sopenharmony_ci or <<features-shaderSharedFloat64Atomics,shaderSharedFloat64Atomics>>, 974e5c31af7Sopenharmony_ci or 975e5c31af7Sopenharmony_ci <<features-shaderSharedFloat64AtomicAdd,shaderSharedFloat64AtomicAdd>> 976e5c31af7Sopenharmony_ci must: be enabled for 64-bit floating point atomic operations 977e5c31af7Sopenharmony_ciendif::VK_EXT_shader_atomic_float2[] 978e5c31af7Sopenharmony_ciendif::VK_EXT_shader_atomic_float[] 979e5c31af7Sopenharmony_ciifdef::VK_EXT_shader_atomic_float2[] 980e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06337]] 981e5c31af7Sopenharmony_ci <<features-shaderBufferFloat16Atomics,shaderBufferFloat16Atomics>>, or 982e5c31af7Sopenharmony_ci <<features-shaderBufferFloat16AtomicAdd,shaderBufferFloat16AtomicAdd>>, 983e5c31af7Sopenharmony_ci or 984e5c31af7Sopenharmony_ci <<features-shaderBufferFloat16AtomicMinMax,shaderBufferFloat16AtomicMinMax>>, 985e5c31af7Sopenharmony_ci or <<features-shaderSharedFloat16Atomics,shaderSharedFloat16Atomics>>, 986e5c31af7Sopenharmony_ci or 987e5c31af7Sopenharmony_ci <<features-shaderSharedFloat16AtomicAdd,shaderSharedFloat16AtomicAdd>>, 988e5c31af7Sopenharmony_ci or 989e5c31af7Sopenharmony_ci <<features-shaderSharedFloat16AtomicMinMax,shaderSharedFloat16AtomicMinMax>> 990e5c31af7Sopenharmony_ci must: be enabled for 16-bit floating point atomic operations 991e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06338]] 992e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32Atomics,shaderBufferFloat32Atomics>>, or 993e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32AtomicAdd,shaderBufferFloat32AtomicAdd>>, 994e5c31af7Sopenharmony_ci or <<features-shaderSharedFloat32Atomics,shaderSharedFloat32Atomics>>, 995e5c31af7Sopenharmony_ci or 996e5c31af7Sopenharmony_ci <<features-shaderSharedFloat32AtomicAdd,shaderSharedFloat32AtomicAdd>>, 997e5c31af7Sopenharmony_ci or <<features-shaderImageFloat32Atomics,shaderImageFloat32Atomics>>, or 998e5c31af7Sopenharmony_ci <<features-shaderImageFloat32AtomicAdd,shaderImageFloat32AtomicAdd>> or 999e5c31af7Sopenharmony_ci <<features-shaderBufferFloat32AtomicMinMax,shaderBufferFloat32AtomicMinMax>>, 1000e5c31af7Sopenharmony_ci or 1001e5c31af7Sopenharmony_ci <<features-shaderSharedFloat32AtomicMinMax,shaderSharedFloat32AtomicMinMax>>, 1002e5c31af7Sopenharmony_ci or 1003e5c31af7Sopenharmony_ci <<features-shaderImageFloat32AtomicMinMax,shaderImageFloat32AtomicMinMax>> 1004e5c31af7Sopenharmony_ci must: be enabled for 32-bit floating point atomic operations 1005e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06339]] 1006e5c31af7Sopenharmony_ci <<features-shaderBufferFloat64Atomics,shaderBufferFloat64Atomics>>, or 1007e5c31af7Sopenharmony_ci <<features-shaderBufferFloat64AtomicAdd,shaderBufferFloat64AtomicAdd>>, 1008e5c31af7Sopenharmony_ci or <<features-shaderSharedFloat64Atomics,shaderSharedFloat64Atomics>>, 1009e5c31af7Sopenharmony_ci or 1010e5c31af7Sopenharmony_ci <<features-shaderSharedFloat64AtomicAdd,shaderSharedFloat64AtomicAdd>>, 1011e5c31af7Sopenharmony_ci or 1012e5c31af7Sopenharmony_ci <<features-shaderBufferFloat64AtomicMinMax,shaderBufferFloat64AtomicMinMax>>, 1013e5c31af7Sopenharmony_ci or 1014e5c31af7Sopenharmony_ci <<features-shaderSharedFloat64AtomicMinMax,shaderSharedFloat64AtomicMinMax>>, 1015e5c31af7Sopenharmony_ci must: be enabled for 64-bit floating point atomic operations 1016e5c31af7Sopenharmony_ciendif::VK_EXT_shader_atomic_float2[] 1017e5c31af7Sopenharmony_ci * [[VUID-{refpage}-NonWritable-06340]] 1018e5c31af7Sopenharmony_ci If <<features-fragmentStoresAndAtomics, fragmentStoresAndAtomics>> is 1019e5c31af7Sopenharmony_ci not enabled, then all storage image, storage texel buffer, and storage 1020e5c31af7Sopenharmony_ci buffer variables in the fragment stage must: be decorated with the 1021e5c31af7Sopenharmony_ci code:NonWritable decoration. 1022e5c31af7Sopenharmony_ci * [[VUID-{refpage}-NonWritable-06341]] 1023e5c31af7Sopenharmony_ci If <<features-vertexPipelineStoresAndAtomics, 1024e5c31af7Sopenharmony_ci vertexPipelineStoresAndAtomics>> is not enabled, then all storage image, 1025e5c31af7Sopenharmony_ci storage texel buffer, and storage buffer variables in the vertex, 1026e5c31af7Sopenharmony_ci tessellation, and geometry stages must: be decorated with the 1027e5c31af7Sopenharmony_ci code:NonWritable decoration. 1028e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06342]] 1029e5c31af7Sopenharmony_ci If <<limits-subgroupQuadOperationsInAllStages, 1030e5c31af7Sopenharmony_ci subgroupQuadOperationsInAllStages>> is ename:VK_FALSE, then 1031e5c31af7Sopenharmony_ci <<features-subgroup-quad,quad subgroup operations>> must: not be used 1032e5c31af7Sopenharmony_ci except for in fragment and compute stages. 1033e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_1[] 1034e5c31af7Sopenharmony_ci * [[VUID-{refpage}-None-06343]] 1035e5c31af7Sopenharmony_ci <<shaders-group-operations,Group operations>> with 1036e5c31af7Sopenharmony_ci <<shaders-scope-subgroup, subgroup scope>> must: not be used if the 1037e5c31af7Sopenharmony_ci shader stage is not in <<limits-subgroupSupportedStages, 1038e5c31af7Sopenharmony_ci subgroupSupportedStages>>. 1039e5c31af7Sopenharmony_ciendif::VK_VERSION_1_1[] 1040e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-06344]] 1041e5c31af7Sopenharmony_ci The first element of the code:Offset operand of code:InterpolateAtOffset 1042e5c31af7Sopenharmony_ci must: be greater than or equal to: 1043e5c31af7Sopenharmony_ci {empty}:: [eq]#frag~width~ {times} <<limits-minInterpolationOffset, 1044e5c31af7Sopenharmony_ci pname:minInterpolationOffset>># 1045e5c31af7Sopenharmony_ci+ 1046e5c31af7Sopenharmony_ciwhere [eq]#frag~width~# is the width of the current fragment in pixels. 1047e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-06345]] 1048e5c31af7Sopenharmony_ci The first element of the code:Offset operand of code:InterpolateAtOffset 1049e5c31af7Sopenharmony_ci must: be less than or equal to: 1050e5c31af7Sopenharmony_ci {empty}:: [eq]#frag~width~ {times} (<<limits-maxInterpolationOffset, 1051e5c31af7Sopenharmony_ci pname:maxInterpolationOffset>> {plus} ULP ) - ULP# 1052e5c31af7Sopenharmony_ci+ 1053e5c31af7Sopenharmony_ciwhere [eq]#frag~width~# is the width of the current fragment in pixels and 1054e5c31af7Sopenharmony_ci[eq]#ULP = 1 / 1055e5c31af7Sopenharmony_ci2^<<limits-subPixelInterpolationOffsetBits,pname:subPixelInterpolationOffsetBits>>^#. 1056e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-06346]] 1057e5c31af7Sopenharmony_ci The second element of the code:Offset operand of 1058e5c31af7Sopenharmony_ci code:InterpolateAtOffset must: be greater than or equal to: 1059e5c31af7Sopenharmony_ci {empty}:: [eq]#frag~height~ {times} <<limits-minInterpolationOffset, 1060e5c31af7Sopenharmony_ci pname:minInterpolationOffset>># 1061e5c31af7Sopenharmony_ci+ 1062e5c31af7Sopenharmony_ciwhere [eq]#frag~height~# is the height of the current fragment in pixels. 1063e5c31af7Sopenharmony_ci * [[VUID-{refpage}-Offset-06347]] 1064e5c31af7Sopenharmony_ci The second element of the code:Offset operand of 1065e5c31af7Sopenharmony_ci code:InterpolateAtOffset must: be less than or equal to: 1066e5c31af7Sopenharmony_ci {empty}:: [eq]#frag~height~ {times} (<<limits-maxInterpolationOffset, 1067e5c31af7Sopenharmony_ci pname:maxInterpolationOffset>> {plus} ULP ) - ULP# 1068e5c31af7Sopenharmony_ci+ 1069e5c31af7Sopenharmony_ciwhere [eq]#frag~height~# is the height of the current fragment in pixels and 1070e5c31af7Sopenharmony_ci[eq]#ULP = 1 / 1071e5c31af7Sopenharmony_ci2^<<limits-subPixelInterpolationOffsetBits,pname:subPixelInterpolationOffsetBits>>^#. 1072e5c31af7Sopenharmony_ci 1073e5c31af7Sopenharmony_ciifdef::VK_KHR_ray_query[] 1074e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpRayQueryInitializeKHR-06348]] 1075e5c31af7Sopenharmony_ci For code:OpRayQueryInitializeKHR instructions, all components of the 1076e5c31af7Sopenharmony_ci code:RayOrigin and code:RayDirection operands must: be finite 1077e5c31af7Sopenharmony_ci floating-point values. 1078e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpRayQueryInitializeKHR-06349]] 1079e5c31af7Sopenharmony_ci For code:OpRayQueryInitializeKHR instructions, the code:RayTmin and 1080e5c31af7Sopenharmony_ci code:RayTmax operands must: be non-negative floating-point values. 1081e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpRayQueryInitializeKHR-06350]] 1082e5c31af7Sopenharmony_ci For code:OpRayQueryInitializeKHR instructions, the code:RayTmin operand 1083e5c31af7Sopenharmony_ci must: be less than or equal to the code:RayTmax operand. 1084e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpRayQueryInitializeKHR-06351]] 1085e5c31af7Sopenharmony_ci For code:OpRayQueryInitializeKHR instructions, code:RayOrigin, 1086e5c31af7Sopenharmony_ci code:RayDirection, code:RayTmin, and code:RayTmax operands must: not 1087e5c31af7Sopenharmony_ci contain NaNs. 1088e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpRayQueryInitializeKHR-06352]] 1089e5c31af7Sopenharmony_ci For code:OpRayQueryInitializeKHR instructions, code:Acceleration 1090e5c31af7Sopenharmony_ci code:Structure must: be an acceleration structure built as a 1091e5c31af7Sopenharmony_ci <<acceleration-structure-top-level, top-level acceleration structure>>. 1092e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpRayQueryGenerateIntersectionKHR-06353]] 1093e5c31af7Sopenharmony_ci For code:OpRayQueryGenerateIntersectionKHR instructions, code:Hit code:T 1094e5c31af7Sopenharmony_ci must: satisfy the condition [eq]##code:RayTmin {leq} code:Hit code:T 1095e5c31af7Sopenharmony_ci {leq} code:RayTmax##, where code:RayTmin is equal to the value returned 1096e5c31af7Sopenharmony_ci by code:OpRayQueryGetRayTMinKHR with the same ray query object, and 1097e5c31af7Sopenharmony_ci code:RayTmax is equal to the value of code:OpRayQueryGetIntersectionTKHR 1098e5c31af7Sopenharmony_ci for the current committed intersection with the same ray query object. 1099e5c31af7Sopenharmony_ciifdef::VK_NV_ray_tracing_motion_blur[] 1100e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpRayQueryGenerateIntersectionKHR-06354]] 1101e5c31af7Sopenharmony_ci For code:OpRayQueryGenerateIntersectionKHR instructions, 1102e5c31af7Sopenharmony_ci code:Acceleration code:Structure must: not be built with 1103e5c31af7Sopenharmony_ci ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV in pname:flags. 1104e5c31af7Sopenharmony_ciendif::VK_NV_ray_tracing_motion_blur[] 1105e5c31af7Sopenharmony_ciendif::VK_KHR_ray_query[] 1106e5c31af7Sopenharmony_ciifdef::VK_KHR_ray_tracing_pipeline[] 1107e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayKHR-06355]] 1108e5c31af7Sopenharmony_ci For code:OpTraceRayKHR instructions, all components of the 1109e5c31af7Sopenharmony_ci code:RayOrigin and code:RayDirection operands must: be finite 1110e5c31af7Sopenharmony_ci floating-point values. 1111e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayKHR-06356]] 1112e5c31af7Sopenharmony_ci For code:OpTraceRayKHR instructions, the code:RayTmin and code:RayTmax 1113e5c31af7Sopenharmony_ci operands must: be non-negative floating-point values. 1114e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayKHR-06357]] 1115e5c31af7Sopenharmony_ci For code:OpTraceRayKHR instructions, the code:RayTmin operand must: be 1116e5c31af7Sopenharmony_ci less than or equal to the code:RayTmax operand. 1117e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayKHR-06358]] 1118e5c31af7Sopenharmony_ci For code:OpTraceRayKHR instructions, code:RayOrigin, code:RayDirection, 1119e5c31af7Sopenharmony_ci code:RayTmin, and code:RayTmax operands must: not contain NaNs. 1120e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayKHR-06359]] 1121e5c31af7Sopenharmony_ci For code:OpTraceRayKHR instructions, code:Acceleration code:Structure 1122e5c31af7Sopenharmony_ci must: be an acceleration structure built as a 1123e5c31af7Sopenharmony_ci <<acceleration-structure-top-level, top-level acceleration structure>>. 1124e5c31af7Sopenharmony_ciendif::VK_KHR_ray_tracing_pipeline[] 1125e5c31af7Sopenharmony_ciifdef::VK_NV_ray_tracing_motion_blur[] 1126e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayKHR-06360]] 1127e5c31af7Sopenharmony_ci For code:OpTraceRayKHR instructions, if code:Acceleration code:Structure 1128e5c31af7Sopenharmony_ci was built with ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV in 1129e5c31af7Sopenharmony_ci pname:flags, the pipeline must: have been created with 1130e5c31af7Sopenharmony_ci ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV set 1131e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayMotionNV-06361]] 1132e5c31af7Sopenharmony_ci For code:OpTraceRayMotionNV instructions, all components of the 1133e5c31af7Sopenharmony_ci code:RayOrigin and code:RayDirection operands must: be finite 1134e5c31af7Sopenharmony_ci floating-point values. 1135e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayMotionNV-06362]] 1136e5c31af7Sopenharmony_ci For code:OpTraceRayMotionNV instructions, the code:RayTmin and 1137e5c31af7Sopenharmony_ci code:RayTmax operands must: be non-negative floating-point values. 1138e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayMotionNV-06363]] 1139e5c31af7Sopenharmony_ci For code:OpTraceRayMotionNV instructions, the code:RayTmin operand must: 1140e5c31af7Sopenharmony_ci be less than or equal to the code:RayTmax operand. 1141e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayMotionNV-06364]] 1142e5c31af7Sopenharmony_ci For code:OpTraceRayMotionNV instructions, code:RayOrigin, 1143e5c31af7Sopenharmony_ci code:RayDirection, code:RayTmin, and code:RayTmax operands must: not 1144e5c31af7Sopenharmony_ci contain NaNs. 1145e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayMotionNV-06365]] 1146e5c31af7Sopenharmony_ci For code:OpTraceRayMotionNV instructions, code:Acceleration 1147e5c31af7Sopenharmony_ci code:Structure must: be an acceleration structure built as a 1148e5c31af7Sopenharmony_ci <<acceleration-structure-top-level, top-level acceleration structure>> 1149e5c31af7Sopenharmony_ci with ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV in pname:flags 1150e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayMotionNV-06366]] 1151e5c31af7Sopenharmony_ci For code:OpTraceRayMotionNV instructions the code:time operand must: be 1152e5c31af7Sopenharmony_ci between 0.0 and 1.0 1153e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpTraceRayMotionNV-06367]] 1154e5c31af7Sopenharmony_ci For code:OpTraceRayMotionNV instructions the pipeline must: have been 1155e5c31af7Sopenharmony_ci created with ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV 1156e5c31af7Sopenharmony_ci set 1157e5c31af7Sopenharmony_ciendif::VK_NV_ray_tracing_motion_blur[] 1158e5c31af7Sopenharmony_ci * [[VUID-{refpage}-x-06429]] 1159e5c31af7Sopenharmony_ci The pname:x size in code:LocalSize or code:LocalSizeId must: be less 1160e5c31af7Sopenharmony_ci than or equal to 1161e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[0] 1162e5c31af7Sopenharmony_ci * [[VUID-{refpage}-y-06430]] 1163e5c31af7Sopenharmony_ci The pname:y size in code:LocalSize or code:LocalSizeId must: be less 1164e5c31af7Sopenharmony_ci than or equal to 1165e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[1] 1166e5c31af7Sopenharmony_ci * [[VUID-{refpage}-z-06431]] 1167e5c31af7Sopenharmony_ci The pname:z size in code:LocalSize or code:LocalSizeId must: be less 1168e5c31af7Sopenharmony_ci than or equal to 1169e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[2] 1170e5c31af7Sopenharmony_ci * [[VUID-{refpage}-x-06432]] 1171e5c31af7Sopenharmony_ci The product of pname:x size, pname:y size, and pname:z size in 1172e5c31af7Sopenharmony_ci code:LocalSize or code:LocalSizeId must: be less than or equal to 1173e5c31af7Sopenharmony_ci sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupInvocations 1174e5c31af7Sopenharmony_ciifndef::VK_KHR_maintenance4[] 1175e5c31af7Sopenharmony_ci * [[VUID-{refpage}-LocalSizeId-06433]] 1176e5c31af7Sopenharmony_ci The execution mode code:LocalSizeId must: not be used 1177e5c31af7Sopenharmony_ciendif::VK_KHR_maintenance4[] 1178e5c31af7Sopenharmony_ciifdef::VK_KHR_maintenance4[] 1179e5c31af7Sopenharmony_ci * [[VUID-{refpage}-LocalSizeId-06434]] 1180e5c31af7Sopenharmony_ci if execution mode code:LocalSizeId is used, <<features-maintenance4, 1181e5c31af7Sopenharmony_ci pname:maintenance4>> must: be enabled 1182e5c31af7Sopenharmony_ciendif::VK_KHR_maintenance4[] 1183e5c31af7Sopenharmony_ciifdef::VK_KHR_zero_initialize_workgroup_memory[] 1184e5c31af7Sopenharmony_ci * [[VUID-{refpage}-shaderZeroInitializeWorkgroupMemory-06372]] 1185e5c31af7Sopenharmony_ci If 1186e5c31af7Sopenharmony_ci <<features-shaderZeroInitializeWorkgroupMemory,pname:shaderZeroInitializeWorkgroupMemory>> 1187e5c31af7Sopenharmony_ci is not enabled, any code:OpVariable with *Workgroup* as its *Storage 1188e5c31af7Sopenharmony_ci Class* must: not have an code:Initializer operand 1189e5c31af7Sopenharmony_ciendif::VK_KHR_zero_initialize_workgroup_memory[] 1190e5c31af7Sopenharmony_ciifndef::VK_KHR_zero_initialize_workgroup_memory[] 1191e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpVariable-06373]] 1192e5c31af7Sopenharmony_ci Any code:OpVariable with *Workgroup* as its *Storage Class* must: not 1193e5c31af7Sopenharmony_ci have an code:Initializer operand 1194e5c31af7Sopenharmony_ciendif::VK_KHR_zero_initialize_workgroup_memory[] 1195e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpImage-06376]] 1196e5c31af7Sopenharmony_ci If an code:OpImage*Gather operation has an image operand of code:Offset, 1197e5c31af7Sopenharmony_ci code:ConstOffset, or code:ConstOffsets the offset value must: be greater 1198e5c31af7Sopenharmony_ci than or equal to <<limits-minTexelGatherOffset,minTexelGatherOffset>> 1199e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpImage-06377]] 1200e5c31af7Sopenharmony_ci If an code:OpImage*Gather operation has an image operand of code:Offset, 1201e5c31af7Sopenharmony_ci code:ConstOffset, or code:ConstOffsets the offset value must: be less 1202e5c31af7Sopenharmony_ci than or equal to <<limits-maxTexelGatherOffset,maxTexelGatherOffset>> 1203e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpImageSample-06435]] 1204e5c31af7Sopenharmony_ci If an code:OpImageSample* or code:OpImageFetch* operation has an image 1205e5c31af7Sopenharmony_ci operand of code:ConstOffset then the offset value must: be greater than 1206e5c31af7Sopenharmony_ci or equal to <<limits-minTexelOffset,minTexelOffset>> 1207e5c31af7Sopenharmony_ci * [[VUID-{refpage}-OpImageSample-06436]] 1208e5c31af7Sopenharmony_ci If an code:OpImageSample* or code:OpImageFetch* operation has an image 1209e5c31af7Sopenharmony_ci operand of code:ConstOffset then the offset value must: be less than or 1210e5c31af7Sopenharmony_ci equal to <<limits-maxTexelOffset,maxTexelOffset>> 1211e5c31af7Sopenharmony_ciifdef::VK_QCOM_render_pass_shader_resolve[] 1212e5c31af7Sopenharmony_ci * [[VUID-{refpage}-SampleRateShading-06378]] 1213e5c31af7Sopenharmony_ci If the subpass description contains 1214e5c31af7Sopenharmony_ci ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, then the SPIR-V 1215e5c31af7Sopenharmony_ci fragment shader Capability code:SampleRateShading must: not be enabled. 1216e5c31af7Sopenharmony_ciendif::VK_QCOM_render_pass_shader_resolve[] 1217e5c31af7Sopenharmony_ciifdef::VK_KHR_shader_subgroup_uniform_control_flow[] 1218e5c31af7Sopenharmony_ci * [[VUID-{refpage}-SubgroupUniformControlFlowKHR-06379]] 1219e5c31af7Sopenharmony_ci The execution mode code:SubgroupUniformControlFlowKHR must: not be 1220e5c31af7Sopenharmony_ci applied to an entry point unless 1221e5c31af7Sopenharmony_ci <<features-shaderSubgroupUniformControlFlow, 1222e5c31af7Sopenharmony_ci pname:shaderSubgroupUniformControlFlow>> is enabled and the 1223e5c31af7Sopenharmony_ci corresponding shader stage bit is set in subgroup 1224e5c31af7Sopenharmony_ci <<limits-subgroup-supportedStages, pname:supportedStages>> and the entry 1225e5c31af7Sopenharmony_ci point does not execute any <<ray-tracing-repack,_invocation repack 1226e5c31af7Sopenharmony_ci instructions_>>. 1227e5c31af7Sopenharmony_ciendif::VK_KHR_shader_subgroup_uniform_control_flow[] 1228e5c31af7Sopenharmony_ci**** 1229e5c31af7Sopenharmony_ci-- 1230e5c31af7Sopenharmony_ci 1231e5c31af7Sopenharmony_ci[[spirvenv-precision-operation]] 1232e5c31af7Sopenharmony_ci== Precision and Operation of SPIR-V Instructions 1233e5c31af7Sopenharmony_ci 1234e5c31af7Sopenharmony_ciThe following rules apply to half, single, and double-precision floating 1235e5c31af7Sopenharmony_cipoint instructions: 1236e5c31af7Sopenharmony_ci 1237e5c31af7Sopenharmony_ci * Positive and negative infinities and positive and negative zeros are 1238e5c31af7Sopenharmony_ci generated as dictated by <<ieee-754,IEEE 754>>, but subject to the 1239e5c31af7Sopenharmony_ci precisions allowed in the following table. 1240e5c31af7Sopenharmony_ci * Dividing a non-zero by a zero results in the appropriately signed 1241e5c31af7Sopenharmony_ci <<ieee-754,IEEE 754>> infinity. 1242e5c31af7Sopenharmony_ci * Signaling [eq]##NaN##s are not required to be generated and exceptions 1243e5c31af7Sopenharmony_ci are never raised. 1244e5c31af7Sopenharmony_ci Signaling [eq]##NaN## may: be converted to quiet [eq]##NaN##s values by 1245e5c31af7Sopenharmony_ci any floating point instruction. 1246e5c31af7Sopenharmony_ci * By default, the implementation may: perform optimizations on half, 1247e5c31af7Sopenharmony_ci single, or double-precision floating-point instructions that ignore sign 1248e5c31af7Sopenharmony_ci of a zero, or assume that arguments and results are not NaNs or 1249e5c31af7Sopenharmony_ci infinities. 1250e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1251e5c31af7Sopenharmony_ci If the entry point is declared with the code:SignedZeroInfNanPreserve 1252e5c31af7Sopenharmony_ci execution mode, then NaNs, infinities, and the sign of zero must: not be 1253e5c31af7Sopenharmony_ci ignored. 1254e5c31af7Sopenharmony_ci ** The following core SPIR-V instructions must: respect the 1255e5c31af7Sopenharmony_ci code:SignedZeroInfNanPreserve execution mode: code:OpPhi, 1256e5c31af7Sopenharmony_ci code:OpSelect, code:OpReturnValue, code:OpVectorExtractDynamic, 1257e5c31af7Sopenharmony_ci code:OpVectorInsertDynamic, code:OpVectorShuffle, 1258e5c31af7Sopenharmony_ci code:OpCompositeConstruct, code:OpCompositeExtract, 1259e5c31af7Sopenharmony_ci code:OpCompositeInsert, code:OpCopyObject, code:OpTranspose, 1260e5c31af7Sopenharmony_ci code:OpFConvert, code:OpFNegate, code:OpFAdd, code:OpFSub, code:OpFMul, 1261e5c31af7Sopenharmony_ci code:OpStore. 1262e5c31af7Sopenharmony_ci This execution mode must: also be respected by code:OpLoad except for 1263e5c31af7Sopenharmony_ci loads from the code:Input storage class in the fragment shader stage 1264e5c31af7Sopenharmony_ci with the floating-point result type. 1265e5c31af7Sopenharmony_ci Other SPIR-V instructions may: also respect the 1266e5c31af7Sopenharmony_ci code:SignedZeroInfNanPreserve execution mode. 1267e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1268e5c31af7Sopenharmony_ci * The following instructions must: not flush denormalized values: 1269e5c31af7Sopenharmony_ci code:OpConstant, code:OpConstantComposite, code:OpSpecConstant, 1270e5c31af7Sopenharmony_ci code:OpSpecConstantComposite, code:OpLoad, code:OpStore, code:OpBitcast, 1271e5c31af7Sopenharmony_ci code:OpPhi, code:OpSelect, code:OpFunctionCall, code:OpReturnValue, 1272e5c31af7Sopenharmony_ci code:OpVectorExtractDynamic, code:OpVectorInsertDynamic, 1273e5c31af7Sopenharmony_ci code:OpVectorShuffle, code:OpCompositeConstruct, 1274e5c31af7Sopenharmony_ci code:OpCompositeExtract, code:OpCompositeInsert, code:OpCopyMemory, 1275e5c31af7Sopenharmony_ci code:OpCopyObject. 1276e5c31af7Sopenharmony_ciifndef::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1277e5c31af7Sopenharmony_ci * Any denormalized value input into a shader or potentially generated by 1278e5c31af7Sopenharmony_ci any instruction in a shader (except those listed above) may: be flushed 1279e5c31af7Sopenharmony_ci to 0. 1280e5c31af7Sopenharmony_ci * The rounding mode cannot: be set, and results will be 1281e5c31af7Sopenharmony_ci <<spirvenv-correctly-rounded, correctly rounded>>, as described below. 1282e5c31af7Sopenharmony_ci * [eq]##NaN##s may: not be generated. 1283e5c31af7Sopenharmony_ci Instructions that operate on a [eq]#NaN# may: not result in a [eq]#NaN#. 1284e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1285e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1286e5c31af7Sopenharmony_ci * Denormalized values are supported. 1287e5c31af7Sopenharmony_ci ** By default, any half, single, or double-precision denormalized value 1288e5c31af7Sopenharmony_ci input into a shader or potentially generated by any instruction (except 1289e5c31af7Sopenharmony_ci those listed above) or any extended instructions for GLSL in a shader 1290e5c31af7Sopenharmony_ci may: be flushed to zero. 1291e5c31af7Sopenharmony_ci ** If the entry point is declared with the code:DenormFlushToZero 1292e5c31af7Sopenharmony_ci execution mode then for the affected instuctions the denormalized 1293e5c31af7Sopenharmony_ci result must: be flushed to zero and the denormalized operands may: be 1294e5c31af7Sopenharmony_ci flushed to zero. 1295e5c31af7Sopenharmony_ci Denormalized values obtained via unpacking an integer into a vector of 1296e5c31af7Sopenharmony_ci values with smaller bit width and interpreting those values as 1297e5c31af7Sopenharmony_ci floating-point numbers must: be flushed to zero. 1298e5c31af7Sopenharmony_ci ** The following core SPIR-V instructions must: respect the 1299e5c31af7Sopenharmony_ci code:DenormFlushToZero execution mode: code:OpSpecConstantOp (with 1300e5c31af7Sopenharmony_ci opcode code:OpFConvert), code:OpFConvert, code:OpFNegate, code:OpFAdd, 1301e5c31af7Sopenharmony_ci code:OpFSub, code:OpFMul, code:OpFDiv, code:OpFRem, code:OpFMod, 1302e5c31af7Sopenharmony_ci code:OpVectorTimesScalar, code:OpMatrixTimesScalar, 1303e5c31af7Sopenharmony_ci code:OpVectorTimesMatrix, code:OpMatrixTimesVector, 1304e5c31af7Sopenharmony_ci code:OpMatrixTimesMatrix, code:OpOuterProduct, code:OpDot; and the 1305e5c31af7Sopenharmony_ci following extended instructions for GLSL: code:Round, code:RoundEven, 1306e5c31af7Sopenharmony_ci code:Trunc, code:FAbs, code:Floor, code:Ceil, code:Fract, code:Radians, 1307e5c31af7Sopenharmony_ci code:Degrees, code:Sin, code:Cos, code:Tan, code:Asin, code:Acos, 1308e5c31af7Sopenharmony_ci code:Atan, code:Sinh, code:Cosh, code:Tanh, code:Asinh, code:Acosh, 1309e5c31af7Sopenharmony_ci code:Atanh, code:Atan2, code:Pow, code:Exp, code:Log, code:Exp2, 1310e5c31af7Sopenharmony_ci code:Log2, code:Sqrt, code:InverseSqrt, code:Determinant, 1311e5c31af7Sopenharmony_ci code:MatrixInverse, code:Modf, code:ModfStruct, code:FMin, code:FMax, 1312e5c31af7Sopenharmony_ci code:FClamp, code:FMix, code:Step, code:SmoothStep, code:Fma, 1313e5c31af7Sopenharmony_ci code:UnpackHalf2x16, code:UnpackDouble2x32, code:Length, code:Distance, 1314e5c31af7Sopenharmony_ci code:Cross, code:Normalize, code:FaceForward, code:Reflect, 1315e5c31af7Sopenharmony_ci code:Refract, code:NMin, code:NMax, code:NClamp. 1316e5c31af7Sopenharmony_ci Other SPIR-V instructions (except those excluded above) may: also flush 1317e5c31af7Sopenharmony_ci denormalized values. 1318e5c31af7Sopenharmony_ci ** The following core SPIR-V instructions must: respect the 1319e5c31af7Sopenharmony_ci code:DenormPreserve execution mode: code:OpTranspose, 1320e5c31af7Sopenharmony_ci code:OpSpecConstantOp, code:OpFConvert, code:OpFNegate, code:OpFAdd, 1321e5c31af7Sopenharmony_ci code:OpFSub, code:OpFMul, code:OpVectorTimesScalar, 1322e5c31af7Sopenharmony_ci code:OpMatrixTimesScalar, code:OpVectorTimesMatrix, 1323e5c31af7Sopenharmony_ci code:OpMatrixTimesVector, code:OpMatrixTimesMatrix, 1324e5c31af7Sopenharmony_ci code:OpOuterProduct, code:OpDot, code:OpFOrdEqual, code:OpFUnordEqual, 1325e5c31af7Sopenharmony_ci code:OpFOrdNotEqual, code:OpFUnordNotEqual, code:OpFOrdLessThan, 1326e5c31af7Sopenharmony_ci code:OpFUnordLessThan, code:OpFOrdGreaterThan, 1327e5c31af7Sopenharmony_ci code:OpFUnordGreaterThan, code:OpFOrdLessThanEqual, 1328e5c31af7Sopenharmony_ci code:OpFUnordLessThanEqual, code:OpFOrdGreaterThanEqual, 1329e5c31af7Sopenharmony_ci code:OpFUnordGreaterThanEqual; and the following extended instructions 1330e5c31af7Sopenharmony_ci for GLSL: code:FAbs, code:FSign, code:Radians, code:Degrees, code:FMin, 1331e5c31af7Sopenharmony_ci code:FMax, code:FClamp, code:FMix, code:Fma, code:PackHalf2x16, 1332e5c31af7Sopenharmony_ci code:PackDouble2x32, code:UnpackHalf2x16, code:UnpackDouble2x32, 1333e5c31af7Sopenharmony_ci code:NMin, code:NMax, code:NClamp. 1334e5c31af7Sopenharmony_ci Other SPIR-V instructions may: also preserve denorm values. 1335e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1336e5c31af7Sopenharmony_ci 1337e5c31af7Sopenharmony_ciThe precision of double-precision instructions is at least that of single 1338e5c31af7Sopenharmony_ciprecision. 1339e5c31af7Sopenharmony_ci 1340e5c31af7Sopenharmony_ciThe precision of operations is defined either in terms of rounding, as an 1341e5c31af7Sopenharmony_cierror bound in ULP, or as inherited from a formula as follows. 1342e5c31af7Sopenharmony_ci 1343e5c31af7Sopenharmony_ci[[spirvenv-correctly-rounded]] 1344e5c31af7Sopenharmony_ci.Correctly Rounded 1345e5c31af7Sopenharmony_ciOperations described as "`correctly rounded`" will return the infinitely 1346e5c31af7Sopenharmony_ciprecise result, [eq]#x#, rounded so as to be representable in 1347e5c31af7Sopenharmony_cifloating-point. 1348e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1349e5c31af7Sopenharmony_ciThe rounding mode is not specified, unless the entry point is declared with 1350e5c31af7Sopenharmony_cithe code:RoundingModeRTE or the code:RoundingModeRTZ execution mode. 1351e5c31af7Sopenharmony_ciThese execution modes affect only correctly rounded SPIR-V instructions. 1352e5c31af7Sopenharmony_ciThese execution modes do not affect code:OpQuantizeToF16. 1353e5c31af7Sopenharmony_ciIf the rounding mode is not specified then this rounding is implementation 1354e5c31af7Sopenharmony_cispecific, subject to the following rules. 1355e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1356e5c31af7Sopenharmony_ciifndef::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1357e5c31af7Sopenharmony_ciThe rounding mode used is not defined but must: obey the following rules. 1358e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1359e5c31af7Sopenharmony_ciIf [eq]#x# is exactly representable then [eq]#x# will be returned. 1360e5c31af7Sopenharmony_ciOtherwise, either the floating-point value closest to and no less than 1361e5c31af7Sopenharmony_ci[eq]#x# or the value closest to and no greater than [eq]#x# will be 1362e5c31af7Sopenharmony_cireturned. 1363e5c31af7Sopenharmony_ci 1364e5c31af7Sopenharmony_ci.ULP 1365e5c31af7Sopenharmony_ciWhere an error bound of [eq]#n# ULP (units in the last place) is given, for 1366e5c31af7Sopenharmony_cian operation with infinitely precise result #x# the value returned must: be 1367e5c31af7Sopenharmony_ciin the range [eq]#[x - n {times} ulp(x), x {plus} n {times} ulp(x)]#. 1368e5c31af7Sopenharmony_ciThe function [eq]#ulp(x)# is defined as follows: 1369e5c31af7Sopenharmony_ci 1370e5c31af7Sopenharmony_ci {empty}:: If there exist non-equal floating-point numbers #a# and #b# such 1371e5c31af7Sopenharmony_ci that [eq]#a {leq} x {leq} b# then [eq]#ulp(x)# is the minimum possible 1372e5c31af7Sopenharmony_ci distance between such numbers, latexmath:[ulp(x) = \mathrm{min}_{a,b} | 1373e5c31af7Sopenharmony_ci b - a |]. 1374e5c31af7Sopenharmony_ci If such numbers do not exist then [eq]#ulp(x)# is defined to be the 1375e5c31af7Sopenharmony_ci difference between the two finite floating-point numbers nearest to 1376e5c31af7Sopenharmony_ci [eq]#x#. 1377e5c31af7Sopenharmony_ci 1378e5c31af7Sopenharmony_ciWhere the range of allowed return values includes any value of magnitude 1379e5c31af7Sopenharmony_cilarger than that of the largest representable finite floating-point number, 1380e5c31af7Sopenharmony_cioperations may:, additionally, return either an infinity of the appropriate 1381e5c31af7Sopenharmony_cisign or the finite number with the largest magnitude of the appropriate 1382e5c31af7Sopenharmony_cisign. 1383e5c31af7Sopenharmony_ciIf the infinitely precise result of the operation is not mathematically 1384e5c31af7Sopenharmony_cidefined then the value returned is undefined:. 1385e5c31af7Sopenharmony_ci 1386e5c31af7Sopenharmony_ci.Inherited From ... 1387e5c31af7Sopenharmony_ciWhere an operation's precision is described as being inherited from a 1388e5c31af7Sopenharmony_ciformula, the result returned must: be at least as accurate as the result of 1389e5c31af7Sopenharmony_cicomputing an approximation to [eq]#x# using a formula equivalent to the 1390e5c31af7Sopenharmony_cigiven formula applied to the supplied inputs. 1391e5c31af7Sopenharmony_ciSpecifically, the formula given may be transformed using the mathematical 1392e5c31af7Sopenharmony_ciassociativity, commutativity and distributivity of the operators involved to 1393e5c31af7Sopenharmony_ciyield an equivalent formula. 1394e5c31af7Sopenharmony_ciThe SPIR-V precision rules, when applied to each such formula and the given 1395e5c31af7Sopenharmony_ciinput values, define a range of permitted values. 1396e5c31af7Sopenharmony_ciIf [eq]#NaN# is one of the permitted values then the operation may return 1397e5c31af7Sopenharmony_ciany result, otherwise let the largest permitted value in any of the ranges 1398e5c31af7Sopenharmony_cibe [eq]#F~max~# and the smallest be [eq]#F~min~#. 1399e5c31af7Sopenharmony_ciThe operation must: return a value in the range [eq]#[x - E, x {plus} E]# 1400e5c31af7Sopenharmony_ciwhere latexmath:[E = \mathrm{max} \left( | x - F_{\mathrm{min}} |, | x - 1401e5c31af7Sopenharmony_ciF_{\mathrm{max}} | \right) ]. 1402e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1403e5c31af7Sopenharmony_ciIf the entry point is declared with the code:DenormFlushToZero execution 1404e5c31af7Sopenharmony_cimode, then any intermediate denormal value(s) while evaluating the formula 1405e5c31af7Sopenharmony_cimay: be flushed to zero. 1406e5c31af7Sopenharmony_ciDenormal final results must: be flushed to zero. 1407e5c31af7Sopenharmony_ciIf the entry point is declared with the code:DenormPreserve execution mode, 1408e5c31af7Sopenharmony_cithen denormals must: be preserved throughout the formula. 1409e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_float_controls[] 1410e5c31af7Sopenharmony_ci 1411e5c31af7Sopenharmony_ciifdef::VK_VERSION_1_2,VK_KHR_shader_float16_int8[] 1412e5c31af7Sopenharmony_ciFor half- (16 bit) and single- (32 bit) precision instructions, precisions 1413e5c31af7Sopenharmony_ciare required: to be at least as follows: 1414e5c31af7Sopenharmony_ci 1415e5c31af7Sopenharmony_ci.Precision of core SPIR-V Instructions 1416e5c31af7Sopenharmony_ci[options="header", cols=",,"] 1417e5c31af7Sopenharmony_ci|==== 1418e5c31af7Sopenharmony_ci| Instruction 1419e5c31af7Sopenharmony_ci | Single precision, unless decorated with RelaxedPrecision | Half precision 1420e5c31af7Sopenharmony_ci| code:OpFAdd 1421e5c31af7Sopenharmony_ci2+| Correctly rounded. 1422e5c31af7Sopenharmony_ci| code:OpFSub 1423e5c31af7Sopenharmony_ci2+| Correctly rounded. 1424e5c31af7Sopenharmony_ci| code:OpFMul, code:OpVectorTimesScalar, code:OpMatrixTimesScalar 1425e5c31af7Sopenharmony_ci2+| Correctly rounded. 1426e5c31af7Sopenharmony_ci| code:OpDot(x, y) 1427e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[\sum_{i = 0}^{n - 1} x_{i} \times y_{i}]. 1428e5c31af7Sopenharmony_ci| code:OpFOrdEqual, code:OpFUnordEqual 1429e5c31af7Sopenharmony_ci2+| Correct result. 1430e5c31af7Sopenharmony_ci| code:OpFOrdLessThan, code:OpFUnordLessThan 1431e5c31af7Sopenharmony_ci2+| Correct result. 1432e5c31af7Sopenharmony_ci| code:OpFOrdGreaterThan, code:OpFUnordGreaterThan 1433e5c31af7Sopenharmony_ci2+| Correct result. 1434e5c31af7Sopenharmony_ci| code:OpFOrdLessThanEqual, code:OpFUnordLessThanEqual 1435e5c31af7Sopenharmony_ci2+| Correct result. 1436e5c31af7Sopenharmony_ci| code:OpFOrdGreaterThanEqual, code:OpFUnordGreaterThanEqual 1437e5c31af7Sopenharmony_ci2+| Correct result. 1438e5c31af7Sopenharmony_ci| code:OpFDiv(x,y) 1439e5c31af7Sopenharmony_ci | 2.5 ULP for [eq]#{vert}y{vert}# in the range [2^-126^, 2^126^]. | 2.5 ULP for [eq]#{vert}y{vert}# in the range [2^-14^, 2^14^]. 1440e5c31af7Sopenharmony_ci| code:OpFRem(x,y) 1441e5c31af7Sopenharmony_ci2+| Inherited from [eq]#x - y {times} trunc(x/y)#. 1442e5c31af7Sopenharmony_ci| code:OpFMod(x,y) 1443e5c31af7Sopenharmony_ci2+| Inherited from [eq]#x - y {times} floor(x/y)#. 1444e5c31af7Sopenharmony_ci| conversions between types 1445e5c31af7Sopenharmony_ci2+| Correctly rounded. 1446e5c31af7Sopenharmony_ci|==== 1447e5c31af7Sopenharmony_ci 1448e5c31af7Sopenharmony_ci[NOTE] 1449e5c31af7Sopenharmony_ci.Note 1450e5c31af7Sopenharmony_ci==== 1451e5c31af7Sopenharmony_ciThe code:OpFRem and code:OpFMod instructions use cheap approximations of 1452e5c31af7Sopenharmony_ciremainder, and the error can be large due to the discontinuity in trunc() 1453e5c31af7Sopenharmony_ciand floor(). 1454e5c31af7Sopenharmony_ciThis can produce mathematically unexpected results in some cases, such as 1455e5c31af7Sopenharmony_ciFMod(x,x) computing x rather than 0, and can also cause the result to have a 1456e5c31af7Sopenharmony_cidifferent sign than the infinitely precise result. 1457e5c31af7Sopenharmony_ci==== 1458e5c31af7Sopenharmony_ci 1459e5c31af7Sopenharmony_ci.Precision of GLSL.std.450 Instructions 1460e5c31af7Sopenharmony_ci[options="header", cols=",,"] 1461e5c31af7Sopenharmony_ci|==== 1462e5c31af7Sopenharmony_ci|Instruction 1463e5c31af7Sopenharmony_ci | Single precision, unless decorated with RelaxedPrecision | Half precision 1464e5c31af7Sopenharmony_ci| code:fma() 1465e5c31af7Sopenharmony_ci2+| Inherited from code:OpFMul followed by code:OpFAdd. 1466e5c31af7Sopenharmony_ci| code:exp(x), code:exp2(x) 1467e5c31af7Sopenharmony_ci a| latexmath:[3 + 2 \times \vert x \vert] ULP. a| latexmath:[1 + 2 \times \vert x \vert] ULP. 1468e5c31af7Sopenharmony_ci| code:log(), code:log2() 1469e5c31af7Sopenharmony_ci a| 3 ULP outside the range latexmath:[[0.5, 2.0\]]. Absolute error < latexmath:[2^{-21}] inside the range latexmath:[[0.5, 2.0\]]. 1470e5c31af7Sopenharmony_ci a| 3 ULP outside the range latexmath:[[0.5, 2.0\]]. Absolute error < latexmath:[2^{-7}] inside the range latexmath:[[0.5, 2.0\]]. 1471e5c31af7Sopenharmony_ci| code:pow(x, y) 1472e5c31af7Sopenharmony_ci2+| Inherited from code:exp2(y {times} code:log2(x)). 1473e5c31af7Sopenharmony_ci| code:sqrt() 1474e5c31af7Sopenharmony_ci2+| Inherited from 1.0 / code:inversesqrt(). 1475e5c31af7Sopenharmony_ci| code:inversesqrt() 1476e5c31af7Sopenharmony_ci2+| 2 ULP. 1477e5c31af7Sopenharmony_ci| code:radians(x) 1478e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[x \times \frac{\pi}{180}]. 1479e5c31af7Sopenharmony_ci| code:degrees(x) 1480e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[x \times \frac{180}{\pi}]. 1481e5c31af7Sopenharmony_ci| code:sin() 1482e5c31af7Sopenharmony_ci a| Absolute error latexmath:[\leq 2^{-11}] inside the range latexmath:[[-\pi, \pi\]]. a| Absolute error latexmath:[\leq 2^{-7}] inside the range latexmath:[[-\pi, \pi\]]. 1483e5c31af7Sopenharmony_ci| code:cos() 1484e5c31af7Sopenharmony_ci a| Absolute error latexmath:[\leq 2^{-11}] inside the range latexmath:[[-\pi, \pi\]]. a| Absolute error latexmath:[\leq 2^{-7}] inside the range latexmath:[[-\pi, \pi\]]. 1485e5c31af7Sopenharmony_ci| code:tan() 1486e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[\frac{\sin()}{\cos()}]. 1487e5c31af7Sopenharmony_ci| code:asin(x) 1488e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[\mathrm{atan2}(x, sqrt(1.0 - x \times x))]. 1489e5c31af7Sopenharmony_ci| code:acos(x) 1490e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[\mathrm{atan2}(sqrt(1.0 - x \times x), x)]. 1491e5c31af7Sopenharmony_ci| code:atan(), code:atan2() 1492e5c31af7Sopenharmony_ci | 4096 ULP | 5 ULP. 1493e5c31af7Sopenharmony_ci| code:sinh(x) 1494e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[(\exp(x) - \exp(-x)) \times 0.5]. 1495e5c31af7Sopenharmony_ci| code:cosh(x) 1496e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[(\exp(x) + \exp(-x)) \times 0.5]. 1497e5c31af7Sopenharmony_ci| code:tanh() 1498e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[\frac{\sinh()}{\cosh()}]. 1499e5c31af7Sopenharmony_ci| code:asinh(x) 1500e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[\log(x + sqrt(x \times x + 1.0))]. 1501e5c31af7Sopenharmony_ci| code:acosh(x) 1502e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[\log(x + sqrt(x \times x - 1.0))]. 1503e5c31af7Sopenharmony_ci| code:atanh(x) 1504e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[\log(\frac{1.0 + x}{1.0 - x}) \times 0.5]. 1505e5c31af7Sopenharmony_ci| code:frexp() 1506e5c31af7Sopenharmony_ci2+| Correctly rounded. 1507e5c31af7Sopenharmony_ci| code:ldexp() 1508e5c31af7Sopenharmony_ci2+| Correctly rounded. 1509e5c31af7Sopenharmony_ci| code:length(x) 1510e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[sqrt(dot(x, x))]. 1511e5c31af7Sopenharmony_ci| code:distance(x, y) 1512e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[length(x - y)]. 1513e5c31af7Sopenharmony_ci| code:cross() 1514e5c31af7Sopenharmony_ci2+| Inherited from [eq]#code:OpFSub(code:OpFMul, code:OpFMul)#. 1515e5c31af7Sopenharmony_ci| code:normalize(x) 1516e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[\frac{x}{length(x)}]. 1517e5c31af7Sopenharmony_ci| code:faceforward(N, I, NRef) 1518e5c31af7Sopenharmony_ci2+| Inherited from [eq]#code:dot(NRef, I) < 0.0 ? N : -N#. 1519e5c31af7Sopenharmony_ci| code:reflect(x, y) 1520e5c31af7Sopenharmony_ci2+| Inherited from [eq]#x - 2.0 {times} code:dot(y, x) {times} y#. 1521e5c31af7Sopenharmony_ci| code:refract(I, N, eta) 1522e5c31af7Sopenharmony_ci2+| Inherited from [eq]#k < 0.0 ? 0.0 : eta {times} I - (eta {times} code:dot(N, I) {plus} code:sqrt(k)) {times} N#, where [eq]#k = 1 - eta {times} eta {times} (1.0 - code:dot(N, I) {times} code:dot(N, I))#. 1523e5c31af7Sopenharmony_ci| code:round 1524e5c31af7Sopenharmony_ci2+| Correctly rounded. 1525e5c31af7Sopenharmony_ci| code:roundEven 1526e5c31af7Sopenharmony_ci2+| Correctly rounded. 1527e5c31af7Sopenharmony_ci| code:trunc 1528e5c31af7Sopenharmony_ci2+| Correctly rounded. 1529e5c31af7Sopenharmony_ci| code:fabs 1530e5c31af7Sopenharmony_ci2+| Correctly rounded. 1531e5c31af7Sopenharmony_ci| code:fsign 1532e5c31af7Sopenharmony_ci2+| Correctly rounded. 1533e5c31af7Sopenharmony_ci| code:floor 1534e5c31af7Sopenharmony_ci2+| Correctly rounded. 1535e5c31af7Sopenharmony_ci| code:ceil 1536e5c31af7Sopenharmony_ci2+| Correctly rounded. 1537e5c31af7Sopenharmony_ci| code:fract 1538e5c31af7Sopenharmony_ci2+| Correctly rounded. 1539e5c31af7Sopenharmony_ci| code:modf 1540e5c31af7Sopenharmony_ci2+| Correctly rounded. 1541e5c31af7Sopenharmony_ci| code:fmin 1542e5c31af7Sopenharmony_ci2+| Correctly rounded. 1543e5c31af7Sopenharmony_ci| code:fmax 1544e5c31af7Sopenharmony_ci2+| Correctly rounded. 1545e5c31af7Sopenharmony_ci| code:fclamp 1546e5c31af7Sopenharmony_ci2+| Correctly rounded. 1547e5c31af7Sopenharmony_ci| code:fmix(x, y, a) 1548e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[x \times (1.0 - a) + y \times a]. 1549e5c31af7Sopenharmony_ci| code:step 1550e5c31af7Sopenharmony_ci2+| Correctly rounded. 1551e5c31af7Sopenharmony_ci| code:smoothStep(edge0, edge1, x) 1552e5c31af7Sopenharmony_ci2+a| Inherited from latexmath:[t \times t \times (3.0 - 2.0 \times t)], 1553e5c31af7Sopenharmony_ciwhere latexmath:[t = clamp(\frac{x - edge0}{edge1 - edge0}, 0.0, 1.0)]. 1554e5c31af7Sopenharmony_ci| code:nmin 1555e5c31af7Sopenharmony_ci2+| Correctly rounded. 1556e5c31af7Sopenharmony_ci| code:nmax 1557e5c31af7Sopenharmony_ci2+| Correctly rounded. 1558e5c31af7Sopenharmony_ci| code:nclamp 1559e5c31af7Sopenharmony_ci2+| Correctly rounded. 1560e5c31af7Sopenharmony_ci|==== 1561e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_float16_int8[] 1562e5c31af7Sopenharmony_ci 1563e5c31af7Sopenharmony_ciifndef::VK_VERSION_1_2,VK_KHR_shader_float16_int8[] 1564e5c31af7Sopenharmony_ciFor single precision (32 bit) instructions, precisions are required: to be 1565e5c31af7Sopenharmony_ciat least as follows, unless decorated with RelaxedPrecision: 1566e5c31af7Sopenharmony_ci 1567e5c31af7Sopenharmony_ci.Precision of core SPIR-V Instructions 1568e5c31af7Sopenharmony_ci[options="header"] 1569e5c31af7Sopenharmony_ci|==== 1570e5c31af7Sopenharmony_ci| Instruction | Precision 1571e5c31af7Sopenharmony_ci| code:OpFAdd | Correctly rounded. 1572e5c31af7Sopenharmony_ci| code:OpFSub | Correctly rounded. 1573e5c31af7Sopenharmony_ci| code:OpFMul, code:OpVectorTimesScalar, code:OpMatrixTimesScalar | Correctly rounded. 1574e5c31af7Sopenharmony_ci| code:OpFOrdEqual, code:OpFUnordEqual | Correct result. 1575e5c31af7Sopenharmony_ci| code:OpFOrdLessThan, code:OpFUnordLessThan | Correct result. 1576e5c31af7Sopenharmony_ci| code:OpFOrdGreaterThan, code:OpFUnordGreaterThan | Correct result. 1577e5c31af7Sopenharmony_ci| code:OpFOrdLessThanEqual, code:OpFUnordLessThanEqual | Correct result. 1578e5c31af7Sopenharmony_ci| code:OpFOrdGreaterThanEqual, code:OpFUnordGreaterThanEqual | Correct result. 1579e5c31af7Sopenharmony_ci| code:OpFDiv(x,y) | 2.5 ULP for [eq]#{vert}y{vert}# in the range [2^-126^, 2^126^]. 1580e5c31af7Sopenharmony_ci| conversions between types | Correctly rounded. 1581e5c31af7Sopenharmony_ci|==== 1582e5c31af7Sopenharmony_ci 1583e5c31af7Sopenharmony_ci.Precision of GLSL.std.450 Instructions 1584e5c31af7Sopenharmony_ci[options="header"] 1585e5c31af7Sopenharmony_ci|==== 1586e5c31af7Sopenharmony_ci|Instruction | Precision 1587e5c31af7Sopenharmony_ci| code:fma() | Inherited from code:OpFMul followed by code:OpFAdd. 1588e5c31af7Sopenharmony_ci| code:exp(x), code:exp2(x) | [eq]#3 {plus} 2 {times} {vert}x{vert}# ULP. 1589e5c31af7Sopenharmony_ci| code:log(), code:log2() | 3 ULP outside the range [eq]#[0.5, 2.0]#. Absolute error < [eq]#2^-21^# inside the range [eq]#[0.5, 2.0]#. 1590e5c31af7Sopenharmony_ci| code:pow(x, y) | Inherited from code:exp2(y {times} code:log2(x)). 1591e5c31af7Sopenharmony_ci| code:sqrt() | Inherited from 1.0 / code:inversesqrt(). 1592e5c31af7Sopenharmony_ci| code:inversesqrt() | 2 ULP. 1593e5c31af7Sopenharmony_ci|==== 1594e5c31af7Sopenharmony_ciendif::VK_VERSION_1_2,VK_KHR_shader_float16_int8[] 1595e5c31af7Sopenharmony_ci 1596e5c31af7Sopenharmony_ciGLSL.std.450 extended instructions specifically defined in terms of the 1597e5c31af7Sopenharmony_ciabove instructions inherit the above errors. 1598e5c31af7Sopenharmony_ciGLSL.std.450 extended instructions not listed above and not defined in terms 1599e5c31af7Sopenharmony_ciof the above have undefined: precision. 1600e5c31af7Sopenharmony_ci 1601e5c31af7Sopenharmony_ciFor the code:OpSRem and code:OpSMod instructions, if either operand is 1602e5c31af7Sopenharmony_cinegative the result is undefined:. 1603e5c31af7Sopenharmony_ci 1604e5c31af7Sopenharmony_ci[NOTE] 1605e5c31af7Sopenharmony_ci.Note 1606e5c31af7Sopenharmony_ci==== 1607e5c31af7Sopenharmony_ciWhile the code:OpSRem and code:OpSMod instructions are supported by the 1608e5c31af7Sopenharmony_ciVulkan environment, they require non-negative values and thus do not enable 1609e5c31af7Sopenharmony_ciadditional functionality beyond what code:OpUMod provides. 1610e5c31af7Sopenharmony_ci==== 1611e5c31af7Sopenharmony_ci 1612e5c31af7Sopenharmony_ciifdef::VK_NV_cooperative_matrix[] 1613e5c31af7Sopenharmony_cicode:OpCooperativeMatrixMulAddNV performs its operations in an 1614e5c31af7Sopenharmony_ciimplementation-dependent order and internal precision. 1615e5c31af7Sopenharmony_ciendif::VK_NV_cooperative_matrix[] 1616e5c31af7Sopenharmony_ci 1617e5c31af7Sopenharmony_ci[[spirvenv-image-signedness]] 1618e5c31af7Sopenharmony_ci== Signedness of SPIR-V Image Accesses 1619e5c31af7Sopenharmony_ci 1620e5c31af7Sopenharmony_ciSPIR-V associates a signedness with all integer image accesses. 1621e5c31af7Sopenharmony_ciThis is required in certain parts of the SPIR-V and the Vulkan image access 1622e5c31af7Sopenharmony_cipipeline to ensure defined results. 1623e5c31af7Sopenharmony_ciThe signedness is determined from a combination of the access instruction's 1624e5c31af7Sopenharmony_cicode:Image code:Operands and the underlying image's code:Sampled code:Type 1625e5c31af7Sopenharmony_cias follows: 1626e5c31af7Sopenharmony_ci 1627e5c31af7Sopenharmony_ci 1. If the instruction's code:Image code:Operands contains the 1628e5c31af7Sopenharmony_ci code:SignExtend operand then the access is signed. 1629e5c31af7Sopenharmony_ci 2. If the instruction's code:Image code:Operands contains the 1630e5c31af7Sopenharmony_ci code:ZeroExtend operand then the access is unsigned. 1631e5c31af7Sopenharmony_ci 3. Otherwise, the image accesses signedness matches that of the 1632e5c31af7Sopenharmony_ci code:Sampled code:Type of the code:OpTypeImage being accessed. 1633e5c31af7Sopenharmony_ci 1634e5c31af7Sopenharmony_ci[[spirvenv-format-type-matching]] 1635e5c31af7Sopenharmony_ci== Image Format and Type Matching 1636e5c31af7Sopenharmony_ci 1637e5c31af7Sopenharmony_ciWhen specifying the code:Image code:Format of an code:OpTypeImage, the 1638e5c31af7Sopenharmony_ciconverted bit width and type, as shown in the table below, must: match the 1639e5c31af7Sopenharmony_cicode:Sampled code:Type. 1640e5c31af7Sopenharmony_ciThe signedness must: match the <<spirvenv-image-signedness,signedness of any 1641e5c31af7Sopenharmony_ciaccess>> to the image. 1642e5c31af7Sopenharmony_ci 1643e5c31af7Sopenharmony_ci[NOTE] 1644e5c31af7Sopenharmony_ci.Note 1645e5c31af7Sopenharmony_ci==== 1646e5c31af7Sopenharmony_ciFormatted accesses are always converted from a shader readable type to the 1647e5c31af7Sopenharmony_ciresource's format or vice versa via <<textures-format-conversion>> for reads 1648e5c31af7Sopenharmony_ciand <<textures-output-format-conversion>> for writes. 1649e5c31af7Sopenharmony_ciAs such, the bit width and format below do not necessarily match 1:1 with 1650e5c31af7Sopenharmony_ciwhat might be expected for some formats. 1651e5c31af7Sopenharmony_ci==== 1652e5c31af7Sopenharmony_ci 1653e5c31af7Sopenharmony_ciFor a given code:Image code:Format, the code:Sampled code:Type must: be the 1654e5c31af7Sopenharmony_citype described in the _Type_ column of the below table, with its 1655e5c31af7Sopenharmony_cicode:Literal code:Width set to that in the _Bit Width_ column. 1656e5c31af7Sopenharmony_ciEvery access that is made to the image must: have a signedness equal to that 1657e5c31af7Sopenharmony_ciin the _Signedness_ column (where applicable). 1658e5c31af7Sopenharmony_ci 1659e5c31af7Sopenharmony_ci[options="autowidth"] 1660e5c31af7Sopenharmony_ci|=== 1661e5c31af7Sopenharmony_ci| Image Format | Type | Bit Width | Signedness 1662e5c31af7Sopenharmony_ci 1663e5c31af7Sopenharmony_ci| code:Unknown | Any | Any | Any 1664e5c31af7Sopenharmony_ci| code:Rgba32f .20+| code:OpTypeFloat .20+| 32 .20+| N/A 1665e5c31af7Sopenharmony_ci| code:Rg32f 1666e5c31af7Sopenharmony_ci| code:R32f 1667e5c31af7Sopenharmony_ci| code:Rgba16f 1668e5c31af7Sopenharmony_ci| code:Rg16f 1669e5c31af7Sopenharmony_ci| code:R16f 1670e5c31af7Sopenharmony_ci| code:Rgba16 1671e5c31af7Sopenharmony_ci| code:Rg16 1672e5c31af7Sopenharmony_ci| code:R16 1673e5c31af7Sopenharmony_ci| code:Rgba16Snorm 1674e5c31af7Sopenharmony_ci| code:Rg16Snorm 1675e5c31af7Sopenharmony_ci| code:R16Snorm 1676e5c31af7Sopenharmony_ci| code:Rgb10A2 1677e5c31af7Sopenharmony_ci| code:R11fG11fB10f 1678e5c31af7Sopenharmony_ci| code:Rgba8 1679e5c31af7Sopenharmony_ci| code:Rg8 1680e5c31af7Sopenharmony_ci| code:R8 1681e5c31af7Sopenharmony_ci| code:Rgba8Snorm 1682e5c31af7Sopenharmony_ci| code:Rg8Snorm 1683e5c31af7Sopenharmony_ci| code:R8Snorm 1684e5c31af7Sopenharmony_ci| code:Rgba32i .19+| code:OpTypeInt .19+| 32 .9+| 1 1685e5c31af7Sopenharmony_ci| code:Rg32i 1686e5c31af7Sopenharmony_ci| code:R32i 1687e5c31af7Sopenharmony_ci| code:Rgba16i 1688e5c31af7Sopenharmony_ci| code:Rg16i 1689e5c31af7Sopenharmony_ci| code:R16i 1690e5c31af7Sopenharmony_ci| code:Rgba8i 1691e5c31af7Sopenharmony_ci| code:Rg8i 1692e5c31af7Sopenharmony_ci| code:R8i 1693e5c31af7Sopenharmony_ci| code:Rgba32ui .10+| 0 1694e5c31af7Sopenharmony_ci| code:Rg32ui 1695e5c31af7Sopenharmony_ci| code:R32ui 1696e5c31af7Sopenharmony_ci| code:Rgba16ui 1697e5c31af7Sopenharmony_ci| code:Rg16ui 1698e5c31af7Sopenharmony_ci| code:R16ui 1699e5c31af7Sopenharmony_ci| code:Rgb10a2ui 1700e5c31af7Sopenharmony_ci| code:Rgba8ui 1701e5c31af7Sopenharmony_ci| code:Rg8ui 1702e5c31af7Sopenharmony_ci| code:R8ui 1703e5c31af7Sopenharmony_ci| code:R64i .2+| code:OpTypeInt .2+| 64 | 1 1704e5c31af7Sopenharmony_ci| code:R64ui | 0 1705e5c31af7Sopenharmony_ci|=== 1706e5c31af7Sopenharmony_ci 1707e5c31af7Sopenharmony_ci[[spirvenv-image-formats]] 1708e5c31af7Sopenharmony_ci== Compatibility Between SPIR-V Image Formats And Vulkan Formats 1709e5c31af7Sopenharmony_ci 1710e5c31af7Sopenharmony_ciSPIR-V code:Image code:Format values are compatible with elink:VkFormat 1711e5c31af7Sopenharmony_civalues as defined below: 1712e5c31af7Sopenharmony_ci 1713e5c31af7Sopenharmony_ci.SPIR-V and Vulkan Image Format Compatibility 1714e5c31af7Sopenharmony_ci[cols="2*", options="header"] 1715e5c31af7Sopenharmony_ci|==== 1716e5c31af7Sopenharmony_ci|SPIR-V Image Format |Compatible Vulkan Format 1717e5c31af7Sopenharmony_ci|code:Unknown |Any 1718e5c31af7Sopenharmony_ci|code:Rgba32f |ename:VK_FORMAT_R32G32B32A32_SFLOAT 1719e5c31af7Sopenharmony_ci|code:Rgba16f |ename:VK_FORMAT_R16G16B16A16_SFLOAT 1720e5c31af7Sopenharmony_ci|code:R32f |ename:VK_FORMAT_R32_SFLOAT 1721e5c31af7Sopenharmony_ci|code:Rgba8 |ename:VK_FORMAT_R8G8B8A8_UNORM 1722e5c31af7Sopenharmony_ci|code:Rgba8Snorm |ename:VK_FORMAT_R8G8B8A8_SNORM 1723e5c31af7Sopenharmony_ci|code:Rg32f |ename:VK_FORMAT_R32G32_SFLOAT 1724e5c31af7Sopenharmony_ci|code:Rg16f |ename:VK_FORMAT_R16G16_SFLOAT 1725e5c31af7Sopenharmony_ci|code:R11fG11fB10f |ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32 1726e5c31af7Sopenharmony_ci|code:R16f |ename:VK_FORMAT_R16_SFLOAT 1727e5c31af7Sopenharmony_ci|code:Rgba16 |ename:VK_FORMAT_R16G16B16A16_UNORM 1728e5c31af7Sopenharmony_ci|code:Rgb10A2 |ename:VK_FORMAT_A2B10G10R10_UNORM_PACK32 1729e5c31af7Sopenharmony_ci|code:Rg16 |ename:VK_FORMAT_R16G16_UNORM 1730e5c31af7Sopenharmony_ci|code:Rg8 |ename:VK_FORMAT_R8G8_UNORM 1731e5c31af7Sopenharmony_ci|code:R16 |ename:VK_FORMAT_R16_UNORM 1732e5c31af7Sopenharmony_ci|code:R8 |ename:VK_FORMAT_R8_UNORM 1733e5c31af7Sopenharmony_ci|code:Rgba16Snorm |ename:VK_FORMAT_R16G16B16A16_SNORM 1734e5c31af7Sopenharmony_ci|code:Rg16Snorm |ename:VK_FORMAT_R16G16_SNORM 1735e5c31af7Sopenharmony_ci|code:Rg8Snorm |ename:VK_FORMAT_R8G8_SNORM 1736e5c31af7Sopenharmony_ci|code:R16Snorm |ename:VK_FORMAT_R16_SNORM 1737e5c31af7Sopenharmony_ci|code:R8Snorm |ename:VK_FORMAT_R8_SNORM 1738e5c31af7Sopenharmony_ci|code:Rgba32i |ename:VK_FORMAT_R32G32B32A32_SINT 1739e5c31af7Sopenharmony_ci|code:Rgba16i |ename:VK_FORMAT_R16G16B16A16_SINT 1740e5c31af7Sopenharmony_ci|code:Rgba8i |ename:VK_FORMAT_R8G8B8A8_SINT 1741e5c31af7Sopenharmony_ci|code:R32i |ename:VK_FORMAT_R32_SINT 1742e5c31af7Sopenharmony_ci|code:Rg32i |ename:VK_FORMAT_R32G32_SINT 1743e5c31af7Sopenharmony_ci|code:Rg16i |ename:VK_FORMAT_R16G16_SINT 1744e5c31af7Sopenharmony_ci|code:Rg8i |ename:VK_FORMAT_R8G8_SINT 1745e5c31af7Sopenharmony_ci|code:R16i |ename:VK_FORMAT_R16_SINT 1746e5c31af7Sopenharmony_ci|code:R8i |ename:VK_FORMAT_R8_SINT 1747e5c31af7Sopenharmony_ci|code:Rgba32ui |ename:VK_FORMAT_R32G32B32A32_UINT 1748e5c31af7Sopenharmony_ci|code:Rgba16ui |ename:VK_FORMAT_R16G16B16A16_UINT 1749e5c31af7Sopenharmony_ci|code:Rgba8ui |ename:VK_FORMAT_R8G8B8A8_UINT 1750e5c31af7Sopenharmony_ci|code:R32ui |ename:VK_FORMAT_R32_UINT 1751e5c31af7Sopenharmony_ci|code:Rgb10a2ui |ename:VK_FORMAT_A2B10G10R10_UINT_PACK32 1752e5c31af7Sopenharmony_ci|code:Rg32ui |ename:VK_FORMAT_R32G32_UINT 1753e5c31af7Sopenharmony_ci|code:Rg16ui |ename:VK_FORMAT_R16G16_UINT 1754e5c31af7Sopenharmony_ci|code:Rg8ui |ename:VK_FORMAT_R8G8_UINT 1755e5c31af7Sopenharmony_ci|code:R16ui |ename:VK_FORMAT_R16_UINT 1756e5c31af7Sopenharmony_ci|code:R8ui |ename:VK_FORMAT_R8_UINT 1757e5c31af7Sopenharmony_ci|code:R64i |ename:VK_FORMAT_R64_SINT 1758e5c31af7Sopenharmony_ci|code:R64ui |ename:VK_FORMAT_R64_UINT 1759e5c31af7Sopenharmony_ci|==== 1760