// Copyright 2018-2021 The Khronos Group, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

include::{generated}/meta/{refprefix}VK_KHR_spirv_1_4.txt[]

=== Other Extension Metadata

*Last Modified Date*::
    2019-04-01
*IP Status*::
    No known IP claims.
*Interactions and External Dependencies*::
  - Requires SPIR-V 1.4.
  - Promoted to Vulkan 1.2 Core
*Contributors*::
  - Alexander Galazin, Arm
  - David Neto, Google
  - Jesse Hall, Google
  - John Kessenich, Google
  - Neil Henning, AMD
  - Tom Olson, Arm

=== Description

This extension allows the use of SPIR-V 1.4 shader modules.
SPIR-V 1.4's new features primarily make it an easier target for compilers
from high-level languages, rather than exposing new hardware functionality.

SPIR-V 1.4 incorporates features that are also available separately as
extensions.
SPIR-V 1.4 shader modules do not need to enable those extensions with the
`OpExtension` opcode, since they are integral parts of SPIR-V 1.4.

SPIR-V 1.4 introduces new floating point execution mode capabilities, also
available via `SPV_KHR_float_controls`.
Implementations are not required to support all of these new capabilities;
support can be queried using
slink:VkPhysicalDeviceFloatControlsPropertiesKHR from the
`apiext:VK_KHR_shader_float_controls` extension.

=== 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_spirv_1_4.txt[]

=== Issues

1.
Should we have an extension specific to this SPIR-V version, or add a
version-generic query for SPIR-V version? SPIR-V 1.4 does not need any other
API changes.

*RESOLVED*: Just expose SPIR-V 1.4.

Most new SPIR-V versions introduce optionally-required capabilities or have
implementation-defined limits, and would need more API and specification
changes specific to that version to make them available in Vulkan.
ifdef::VK_VERSION_1_1[]
For example, to support the subgroup capabilities added in SPIR-V 1.3
required introducing slink:VkPhysicalDeviceSubgroupProperties to allow
querying the supported group operation categories, maximum supported
subgroup size, etc.
endif::VK_VERSION_1_1[]
While we could expose the parts of a new SPIR-V version that do not need
accompanying changes generically, we will still end up writing extensions
specific to each version for the remaining parts.
Thus the generic mechanism will not reduce future spec-writing effort.
In addition, making it clear which parts of a future version are supported
by the generic mechanism and which cannot be used without specific support
would be difficult to get right ahead of time.

2.
Can different stages of the same pipeline use shaders with different SPIR-V
versions?

*RESOLVED*: Yes.

Mixing SPIR-V versions 1.0-1.3 in the same pipeline has not been disallowed,
so it would be inconsistent to disallow mixing 1.4 with previous versions..
SPIR-V 1.4 does not introduce anything that should cause new difficulties
here.

3.
Must Vulkan extensions corresponding to SPIR-V extensions that were promoted
to core in 1.4 be enabled in order to use that functionality in a SPIR-V 1.4
module?

*RESOLVED*: No, with caveats.

The SPIR-V 1.4 module does not need to declare the SPIR-V extensions, since
the functionality is now part of core, so there is no need to enable the
Vulkan extension that allows SPIR-V modules to declare the SPIR-V extension.
However, when the functionality that is now core in SPIR-V 1.4 is optionally
supported, the query for support is provided by a Vulkan extension, and that
query can only be used if the extension is enabled.

This applies to any SPIR-V version; specifically for SPIR-V 1.4 this only
applies to the functionality from `SPV_KHR_float_controls`, which was made
available in Vulkan by `apiext:VK_KHR_shader_float_controls`.
Even though the extension was promoted in SPIR-V 1.4, the capabilities are
still optional in implementations that support `VK_KHR_spirv_1_4`.

A SPIR-V 1.4 module does not need to enable `SPV_KHR_float_controls` in
order to use the capabilities, so if the application has _a priori_
knowledge that the implementation supports the capabilities, it does not
need to enable `apiext:VK_KHR_shader_float_controls`.
However, if it does not have this knowledge and has to query for support at
runtime, it must enable `apiext:VK_KHR_shader_float_controls` in order to
use slink:VkPhysicalDeviceFloatControlsPropertiesKHR.

=== Version History

  * Revision 1, 2019-04-01 (Jesse Hall)
    - Internal draft versions
