blob: b66d16b9b0fad2adc355e90126c660b4fecfc544 [file] [log] [blame]
// 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