// Copyright (c) 2018-2020 NVIDIA Corporation
//
// SPDX-License-Identifier: CC-BY-4.0

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

=== Other Extension Metadata

*Last Modified Date*::
    2018-08-03
*IP Status*::
    No known IP claims.
*Interactions and External Dependencies*::
  - This extension requires
    {spirv}/NV/SPV_NV_fragment_shader_barycentric.html[`SPV_NV_fragment_shader_barycentric`]
  - This extension provides API support for
    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_fragment_shader_barycentric.txt[`GL_NV_fragment_shader_barycentric`]
*Contributors*::
  - Pat Brown, NVIDIA
  - Daniel Koch, NVIDIA

=== Description

This extension adds support for the following SPIR-V extension in Vulkan:

  * {spirv}/NV/SPV_NV_fragment_shader_barycentric.html[`SPV_NV_fragment_shader_barycentric`]

The extension provides access to three additional fragment shader variable
decorations in SPIR-V:

  * code:PerVertexNV, which indicates that a fragment shader input will not
    have interpolated values, but instead must be accessed with an extra
    array index that identifies one of the vertices of the primitive
    producing the fragment
  * code:BaryCoordNV, which indicates that the variable is a three-component
    floating-point vector holding barycentric weights for the fragment
    produced using perspective interpolation
  * code:BaryCoordNoPerspNV, which indicates that the variable is a
    three-component floating-point vector holding barycentric weights for
    the fragment produced using linear interpolation

When using GLSL source-based shader languages, the following variables from
`GL_NV_fragment_shader_barycentric` maps to these SPIR-V built-in
decorations:

  * `in vec3 gl_BaryCoordNV;` -> code:BaryCoordNV
  * `in vec3 gl_BaryCoordNoPerspNV;` -> code:BaryCoordNoPerspNV

GLSL variables declared using the code:__pervertexNV GLSL qualifier are
expected to be decorated with code:PerVertexNV in SPIR-V.

include::{generated}/interfaces/VK_NV_fragment_shader_barycentric.txt[]

=== New Built-In Variables

  * <<interfaces-builtin-variables-barycoordnv,code:BaryCoordNV>>
  * <<interfaces-builtin-variables-barycoordnoperspnv,code:BaryCoordNoPerspNV>>

=== New SPIR-V Decorations

  * <<shaders-interpolation-decorations-pervertexnv,code:PerVertexNV>>

=== New SPIR-V Capabilities

  * <<spirvenv-capabilities-table-FragmentBarycentricNV,code:FragmentBarycentricNV>>

=== Issues

(1) The AMD_shader_explicit_vertex_parameter extension provides similar
    functionality.
    Why write a new extension, and how is this extension different?

*RESOLVED*: For the purposes of Vulkan/SPIR-V, we chose to implement a
separate extension due to several functional differences.

First, the hardware supporting this extension can provide a three-component
barycentric weight vector for variables decorated with code:BaryCoordNV,
while variables decorated with code:BaryCoordSmoothAMD provide only two
components.
In some cases, it may be more efficient to explicitly interpolate an
attribute via:

        float value = (baryCoordNV.x * v[0].attrib +
                       baryCoordNV.y * v[1].attrib +
                       baryCoordNV.z * v[2].attrib);

instead of

       float value = (baryCoordSmoothAMD.x * (v[0].attrib - v[2].attrib) +
                      baryCoordSmoothAMD.y * (v[1].attrib - v[2].attrib) +
                      v[2].attrib);

Additionally, the semantics of the decoration code:BaryCoordPullModelAMD do
not appear to map to anything supported by the initial hardware
implementation of this extension.

This extension provides a smaller number of decorations than the AMD
extension, as we expect that shaders could derive variables decorated with
things like code:BaryCoordNoPerspCentroidAMD with explicit attribute
interpolation instructions.
One other relevant difference is that explicit per-vertex attribute access
using this extension does not require a constant vertex number.

(2) Why do the built-in SPIR-V decorations for this extension include two
separate built-ins code:BaryCoordNV and code:BaryCoordNoPerspNV when a "`no
perspective`" variable could be decorated with code:BaryCoordNV and
code:NoPerspective?

*RESOLVED*: The SPIR-V extension for this feature chose to mirror the
behavior of the GLSL extension, which provides two built-in variables.
Additionally, it is not clear that its a good idea (or even legal) to have
two variables using the "`same attribute`", but with different interpolation
modifiers.

=== Version History

  * Revision 1, 2018-08-03 (Pat Brown)
    - Internal revisions
