| // Copyright 2014-2021 The Khronos Group, Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_KHR_shader_float_controls.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2018-09-11 |
| *Interactions and External Dependencies*:: |
| - Promoted to Vulkan 1.2 Core |
| - This extension requires |
| {spirv}/KHR/SPV_KHR_float_controls.html[`SPV_KHR_float_controls`] |
| *IP Status*:: |
| No known IP claims. |
| *Contributors*:: |
| - Alexander Galazin, Arm |
| - Jan-Harald Fredriksen, Arm |
| - Jeff Bolz, NVIDIA |
| - Graeme Leese, Broadcom |
| - Daniel Rakos, AMD |
| |
| === Description |
| |
| The `VK_KHR_shader_float_controls` extension enables efficient use of |
| floating-point computations through the ability to query and override the |
| implementation's default behavior for rounding modes, denormals, signed |
| zero, and infinity. |
| |
| === Promotion to Vulkan 1.2 |
| |
| All functionality in this extension is included in core Vulkan 1.2, with the |
| KHR suffix omitted. |
| The original type, enum and command names are still available as aliases of |
| the core functionality. |
| |
| include::{generated}/interfaces/VK_KHR_shader_float_controls.txt[] |
| |
| === New SPIR-V Capabilities |
| |
| * <<spirvenv-capabilities-table-DenormPreserve,code:DenormPreserve>> |
| * <<spirvenv-capabilities-table-DenormFlushToZero,code:DenormFlushToZero>> |
| * <<spirvenv-capabilities-table-SignedZeroInfNanPreserve,code:SignedZeroInfNanPreserve>> |
| * <<spirvenv-capabilities-table-RoundingModeRTE,code:RoundingModeRTE>> |
| * <<spirvenv-capabilities-table-RoundingModeRTZ,code:RoundingModeRTZ>> |
| |
| === Issues |
| |
| 1) Which instructions must flush denorms? |
| |
| *RESOLVED*: Only floating-point conversion, floating-point arithmetic, |
| floating-point relational (except code:OpIsNaN, code:OpIsInf), and |
| floating-point GLSL.std.450 extended instructions must flush denormals. |
| |
| 2) What is the denorm behavior for intermediate results? |
| |
| *RESOLVED*: When a SPIR-V instruction is implemented as a sequence of other |
| instructions: |
| |
| * in the code:DenormFlushToZero execution mode, the intermediate |
| instructions may flush denormals, the final result of the sequence must: |
| not be denormal. |
| * in the code:DenormPreserve execution mode, denormals must be preserved |
| throughout the whole sequence. |
| |
| 3) Do denorm and rounding mode controls apply to code:OpSpecConstantOp? |
| |
| *RESOLVED*: Yes, except when the opcode is code:OpQuantizeToF16. |
| |
| 4) The SPIR-V specification says that code:OpConvertFToU and |
| code:OpConvertFToS unconditionally round towards zero. |
| Do the rounding mode controls specified through the execution modes apply to |
| them? |
| |
| *RESOLVED*: No, these instructions unconditionally round towards zero. |
| |
| 5) Do any of the "`Pack`" GLSL.std.450 instructions count as conversion |
| instructions and have the rounding mode applied? |
| |
| *RESOLVED*: No, only instructions listed in "`section 3.32.11. |
| Conversion Instructions`" of the SPIR-V specification count as conversion |
| instructions. |
| |
| 6) When using inf/nan-ignore mode, what is expected of code:OpIsNan and |
| code:OpIsInf? |
| |
| *RESOLVED*: These instructions must always accurately detect inf/nan if it |
| is passed to them. |
| |
| |
| [[VK_KHR_shader_controls_v4_incompatibility]] |
| === Version 4 API incompatibility |
| |
| The original versions of `VK_KHR_shader_float_controls` shipped with |
| booleans named "`separateDenormSettings`" and |
| "`separateRoundingModeSettings`", which at first glance could have indicated |
| "`they can all be set independently, or not`". |
| However the spec language as written indicated that the 32-bit value could |
| always be set independently, and only the 16- and 64-bit controls needed to |
| be the same if these values were ename:VK_FALSE. |
| |
| As a result of this slight disparity, and lack of test coverage for this |
| facet of the extension, we ended up with two different behaviors in the |
| wild, where some implementations worked as written, and others worked based |
| on the naming. |
| As these are hard limits in hardware with reasons for exposure as written, |
| it was not possible to standardise on a single way to make this work within |
| the existing API. |
| |
| No known users of this part of the extension exist in the wild, and as such |
| the Vulkan WG took the unusual step of retroactively changing the once |
| boolean value into a tri-state enum, breaking source compatibility. |
| This was however done in such a way as to retain ABI compatibility, in case |
| any code using this did exist; with the numerical values 0 and 1 retaining |
| their original specified meaning, and a new value signifying the additional |
| "`all need to be set together`" state. |
| If any applications exist today, compiled binaries will continue to work as |
| written in most cases, but will need changes before the code can be |
| recompiled. |
| |
| |
| === Version History |
| |
| * Revision 4, 2019-06-18 (Tobias Hector) |
| - Modified settings restrictions, see |
| <<VK_KHR_shader_controls_v4_incompatibility, Version 4 API |
| incompatibility>> |
| * Revision 3, 2018-09-11 (Alexander Galazin) |
| - Minor restructuring |
| * Revision 2, 2018-04-17 (Alexander Galazin) |
| - Added issues and resolutions |
| * Revision 1, 2018-04-11 (Alexander Galazin) |
| - Initial draft |