| // Copyright (c) 2017-2020 NVIDIA Corporation |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_NVX_multiview_per_view_attributes.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2017-01-13 |
| *IP Status*:: |
| No known IP claims. |
| *Interactions and External Dependencies*:: |
| - This extension requires |
| {spirv}/NV/SPV_NVX_multiview_per_view_attributes.html[`SPV_NVX_multiview_per_view_attributes`] |
| - This extension provides API support for |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/nvx/GL_NVX_multiview_per_view_attributes.txt[`GL_NVX_multiview_per_view_attributes`] |
| - This extension interacts with `apiext:VK_NV_viewport_array2`. |
| *Contributors*:: |
| - Jeff Bolz, NVIDIA |
| - Daniel Koch, NVIDIA |
| |
| === Description |
| |
| This extension adds a new way to write shaders to be used with multiview |
| subpasses, where the attributes for all views are written out by a single |
| invocation of the |
| <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader |
| stages>>. |
| Related SPIR-V and GLSL extensions `SPV_NVX_multiview_per_view_attributes` |
| and `GL_NVX_multiview_per_view_attributes` introduce per-view position and |
| viewport mask attributes arrays, and this extension defines how those |
| per-view attribute arrays are interpreted by Vulkan. |
| Pipelines using per-view attributes may: only execute the |
| <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader |
| stages>> once for all views rather than once per-view, which reduces |
| redundant shading work. |
| |
| A subpass creation flag controls whether the subpass uses this extension. |
| A subpass must: either exclusively use this extension or not use it at all. |
| |
| Some Vulkan implementations only support the position attribute varying |
| between views in the X component. |
| A subpass can declare via a second creation flag whether all pipelines |
| compiled for this subpass will obey this restriction. |
| |
| Shaders that use the new per-view outputs (e.g. code:gl_PositionPerViewNV) |
| must: also write the non-per-view output (code:gl_Position), and the values |
| written must: be such that `gl_Position = |
| gl_PositionPerViewNV[gl_ViewIndex]` for all views in the subpass. |
| Implementations are free to either use the per-view outputs or the |
| non-per-view outputs, whichever would be more efficient. |
| |
| If `apiext:VK_NV_viewport_array2` is not also supported and enabled, the |
| per-view viewport mask must: not be used. |
| |
| include::{generated}/interfaces/VK_NVX_multiview_per_view_attributes.txt[] |
| |
| === New Built-In Variables |
| |
| * <<interfaces-builtin-variables-positionperview,code:PositionPerViewNV>> |
| * <<interfaces-builtin-variables-viewportmaskperview,code:ViewportMaskPerViewNV>> |
| |
| === New SPIR-V Capabilities |
| |
| * <<spirvenv-capabilities-table-PerViewAttributesNV,code:PerViewAttributesNV>> |
| |
| === Examples |
| |
| [source,c] |
| --------------------------------------------------- |
| #version 450 core |
| |
| #extension GL_KHX_multiview : enable |
| #extension GL_NVX_multiview_per_view_attributes : enable |
| |
| layout(location = 0) in vec4 position; |
| layout(set = 0, binding = 0) uniform Block { mat4 mvpPerView[2]; } buf; |
| |
| void main() |
| { |
| // Output both per-view positions and gl_Position as a function |
| // of gl_ViewIndex |
| gl_PositionPerViewNV[0] = buf.mvpPerView[0] * position; |
| gl_PositionPerViewNV[1] = buf.mvpPerView[1] * position; |
| gl_Position = buf.mvpPerView[gl_ViewIndex] * position; |
| } |
| |
| --------------------------------------------------- |
| |
| |
| === Version History |
| |
| * Revision 1, 2017-01-13 (Jeff Bolz) |
| - Internal revisions |