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

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

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

=== 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
