2018-09-16 01:35:16 +00:00
|
|
|
include::meta/VK_NV_shading_rate_image.txt[]
|
|
|
|
|
|
|
|
*Last Modified Date*::
|
|
|
|
2018-09-13
|
|
|
|
*Contributors*::
|
|
|
|
- Pat Brown, NVIDIA
|
|
|
|
- Carsten Rohde, NVIDIA
|
|
|
|
- Jeff Bolz, NVIDIA
|
|
|
|
- Daniel Koch, NVIDIA
|
|
|
|
- Mathias Schott, NVIDIA
|
|
|
|
- Matthew Netsch, Qualcomm Technologies, Inc.
|
|
|
|
|
|
|
|
This extension allows applications to use a variable shading rate when
|
|
|
|
processing fragments of rasterized primitives.
|
|
|
|
By default, Vulkan will spawn one fragment shader for each pixel covered by
|
|
|
|
a primitive.
|
|
|
|
In this extension, applications can bind a _shading rate image_ that can be
|
|
|
|
used to vary the number of fragment shader invocations across the
|
|
|
|
framebuffer.
|
|
|
|
Some portions of the screen may be configured to spawn up to 16 fragment
|
|
|
|
shaders for each pixel, while other portions may use a single fragment
|
|
|
|
shader invocation for a 4x4 block of pixels.
|
|
|
|
This can be useful for use cases like eye tracking, where the portion of the
|
|
|
|
framebuffer that the user is looking at directly can be processed at high
|
|
|
|
frequency, while distant corners of the image can be processed at lower
|
|
|
|
frequency.
|
|
|
|
Each texel in the shading rate image represents a fixed-size rectangle in
|
|
|
|
the framebuffer, covering 16x16 pixels in the initial implementation of this
|
|
|
|
extension.
|
|
|
|
When rasterizing a primitive covering one of these rectangles, the Vulkan
|
|
|
|
implementation reads a texel in the bound shading rate image and looks up
|
|
|
|
the fetched value in a palette to determine a base shading rate.
|
|
|
|
|
|
|
|
In addition to the API support controlling rasterization, this extension
|
Change log for January 13, 2019 Vulkan 1.1.98 spec update:
* Update release number to 98.
Public Issues:
* Fix missing markup in flink:vkDestroyPipelineLayout valid usage
statement (pull request 882).
* Add missing contributors for `<<VK_EXT_buffer_device_address>>` (public
pull request 891).
Internal Issues:
* Detect nested bullet points in valid usage blocks and warn about them
during VUID assignment (internal issue 1382).
* Update the style guide to document the process for reserving new bits in
bitmask types (internal issue 1411).
* Clarify for slink:VkApplicationInfo::pname:apiVersion and in the
<<fundamentals-validusage-versions, Valid Usage for Newer Core
Versions>> section when it is valid for an application to use a certain
version of Vulkan API functionality (for an instance and for a
device/physical device); and when the validation layers must generate an
error (internal issue 1412).
* Add optional <<memory-model-availability-visibility, transitive
availability/visibility operations to the memory model, including a new
pname:vulkanMemoryModelAvailabilityVisibilityChains feature for
slink:VkPhysicalDeviceVulkanMemoryModelFeaturesKHR (internal issue
1460).
* Add the code:StorageBuffer storage class to those in the
<<interfaces-resources-descset, Descriptor Set Interface>> (internal
issue 1480).
* Add missing `returnedonly` tags for a number of returned extension
structures that can be passed in pname:pNext chains (internal issue
1515).
* Clean up and rearrange some spec language for
slink:VkRenderPassCreateInfo and slink:VkAttachmentReference.txt
(internal issue 1522).
* Correctly round the code:OpVectorTimesScalar and
code:OpMatrixTimesScalar SPIR-V operations in the <<Precision of core
SPIR-V Instructions>> table (internal merge request 2996).
* Work around cases in flink:vkCmdBeginTransformFeedbackEXT,
flink:vkCmdEndTransformFeedbackEXT, and
slink:VkPipelineCoverageModulationStateCreateInfoNV where an array
parameter is `optional` but the length is not in `vk.xml`. This is an
interim fix using `noautovalidity` + handcoded VU replacing those that
should be autogenerated (internal issue 2944 and
https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/480).
* Remove redundant capability validation of the code:float16 and code:int8
SPIR-V capabilities from the <<spirvenv-capabilities, Capabilities>>
section, since they are already covered in the preceding table.
* Update check_spec_links script, including validation for reference page
open blocks. Fix errors identified by the script.
2019-01-13 13:53:27 +00:00
|
|
|
also adds Vulkan support for the `SPV_NV_shading_rate` extension to SPIR-V.
|
2018-09-16 01:35:16 +00:00
|
|
|
That extension provides two fragment shader variable decorations that allow
|
|
|
|
fragment shaders to determine the shading rate used for processing the
|
|
|
|
fragment:
|
|
|
|
|
Change log for November 25, 2018 Vulkan 1.1.94 spec update:
* Update release number to 94.
Public Issues:
* Use the terms "`texel block`" and "`texel block size`" instead of "`data
element`" and "`element size`", and define "`element`" as an array slot.
In addition to the terminology changes, retitled the <<texel-block-size,
Representation and Texel Block Size>> section and added texel block size
/ no. of texels/block information to the
<<features-formats-compatibility, Compatible Formats>> table. There is
some additional work underway to make sure the compatibility language
makes sense for all of uncompressed, compressed, and multiplanar formats
(public issue 763).
* Cleanup `VK_NV_ray_tracing` language (public issues 858, 859).
Internal Issues:
* Specify in <<shaders-invocationgroups, Invocation and Derivative
Groups>> and <<textures-output-format-conversion, Texel Output Format
Conversion>> that derivative groups are quads when code:SubgroupSize >=
4 (internal issue 1390).
* Make the type of slink:VkDescriptorUpdateTemplateCreateInfo::pNext
`const` following pattern for the other stext:Vk*CreateInfo structures
(internal issue 1459).
* Specify that flink:vkCmdClearAttachments executes as a drawing command,
rather than a transfer command (internal issue 1463).
* Update `VK_NV_ray_tracing` to use code:InstanceId instead of
code:InstanceIndex.
New Extensions:
* `VK_KHR_swapchain_mutable_format`
* `VK_EXT_fragment_density_map`
2018-11-26 07:27:30 +00:00
|
|
|
* code:FragmentSizeNV, which indicates the width and height of the set of
|
|
|
|
pixels processed by the fragment shader.
|
|
|
|
* code:InvocationsPerPixel, which indicates the maximum number of fragment
|
|
|
|
shader invocations that could be spawned for the pixel(s) covered by the
|
|
|
|
fragment.
|
2018-09-16 01:35:16 +00:00
|
|
|
|
|
|
|
When using SPIR-V in conjunction with the OpenGL Shading Language (GLSL),
|
|
|
|
the fragment shader capabilities are provided by the
|
Change log for January 13, 2019 Vulkan 1.1.98 spec update:
* Update release number to 98.
Public Issues:
* Fix missing markup in flink:vkDestroyPipelineLayout valid usage
statement (pull request 882).
* Add missing contributors for `<<VK_EXT_buffer_device_address>>` (public
pull request 891).
Internal Issues:
* Detect nested bullet points in valid usage blocks and warn about them
during VUID assignment (internal issue 1382).
* Update the style guide to document the process for reserving new bits in
bitmask types (internal issue 1411).
* Clarify for slink:VkApplicationInfo::pname:apiVersion and in the
<<fundamentals-validusage-versions, Valid Usage for Newer Core
Versions>> section when it is valid for an application to use a certain
version of Vulkan API functionality (for an instance and for a
device/physical device); and when the validation layers must generate an
error (internal issue 1412).
* Add optional <<memory-model-availability-visibility, transitive
availability/visibility operations to the memory model, including a new
pname:vulkanMemoryModelAvailabilityVisibilityChains feature for
slink:VkPhysicalDeviceVulkanMemoryModelFeaturesKHR (internal issue
1460).
* Add the code:StorageBuffer storage class to those in the
<<interfaces-resources-descset, Descriptor Set Interface>> (internal
issue 1480).
* Add missing `returnedonly` tags for a number of returned extension
structures that can be passed in pname:pNext chains (internal issue
1515).
* Clean up and rearrange some spec language for
slink:VkRenderPassCreateInfo and slink:VkAttachmentReference.txt
(internal issue 1522).
* Correctly round the code:OpVectorTimesScalar and
code:OpMatrixTimesScalar SPIR-V operations in the <<Precision of core
SPIR-V Instructions>> table (internal merge request 2996).
* Work around cases in flink:vkCmdBeginTransformFeedbackEXT,
flink:vkCmdEndTransformFeedbackEXT, and
slink:VkPipelineCoverageModulationStateCreateInfoNV where an array
parameter is `optional` but the length is not in `vk.xml`. This is an
interim fix using `noautovalidity` + handcoded VU replacing those that
should be autogenerated (internal issue 2944 and
https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/480).
* Remove redundant capability validation of the code:float16 and code:int8
SPIR-V capabilities from the <<spirvenv-capabilities, Capabilities>>
section, since they are already covered in the preceding table.
* Update check_spec_links script, including validation for reference page
open blocks. Fix errors identified by the script.
2019-01-13 13:53:27 +00:00
|
|
|
`GL_NV_shading_rate_image` language extension and correspond to the built-in
|
2018-09-16 01:35:16 +00:00
|
|
|
variables code:gl_FragmentSizeNV and code:gl_InvocationsPerPixelNV,
|
|
|
|
respectively.
|
|
|
|
|
|
|
|
=== New Object Types
|
|
|
|
|
|
|
|
None.
|
|
|
|
|
|
|
|
=== New Enum Constants
|
|
|
|
|
|
|
|
* Extending elink:VkStructureType:
|
|
|
|
** ename:VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV
|
|
|
|
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV
|
|
|
|
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV
|
Change log for November 4, 2018 Vulkan 1.1.91 spec update:
* Update release number to 91.
Public Issues:
* Update Ubuntu subsystem build instructions in `BUILD.adoc` (public pull
request 624).
* Delete the `VK_KHR_mir_surface` extension from the Specification and
XML, due to EOL of the only driver known to have supported it, and
near-EOL of Mir itself (public issue 814).
* Fix options for some figures that were using old ones (public pull
request 841).
* Fix various accidentally repeated words (public pull request 843).
* Use `time.process_time()`, introduced in Python 3.3, in the scripts
instead of `time.clock()`, which will be removed in Python 3.8 (public
pull request 844).
Internal Issues:
* Update valid usage statements for
`VK_ANDROID_external_memory_android_hardware_buffer` in
slink:VkMemoryAllocateInfo,
slink:VkImportAndroidHardwareBufferInfoANDROID, and
flink:vkGetAndroidHardwareBufferPropertiesANDROID to actually be
verifiable (internal issue 1419).
* Update valid usage statements for
`VK_ANDROID_external_memory_android_hardware_buffer` in
slink:VkMemoryAllocateInfo, slink:VkImageCreateInfo, and
slink:VkImageViewCreateInfo to move valid usage statements in
doubly-nested bullet points up one level, accomodating limitations of
the valid usage extraction script that creates `validusage.json`
(internal issue 1434).
* Fix typo etext:VK_ACCESS_SHADING_RATE_IMAGE_BIT_NV to the correct
ename:VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV.
* Add missing etext:VK_STRUCTURE_TYPE_* tokens to appendices for
extensions missing them.
New Extensions:
* `VK_AMD_memory_overallocation_behavior`
* `VK_NV_ray_tracing`, replacing `VK_NVX_raytracing`
2018-11-04 06:50:13 +00:00
|
|
|
** ename:VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV
|
2018-09-16 01:35:16 +00:00
|
|
|
|
|
|
|
* Extending elink:VkImageLayout:
|
|
|
|
** ename:VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV
|
|
|
|
|
|
|
|
* Extending elink:VkDynamicState:
|
|
|
|
** ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV
|
|
|
|
|
|
|
|
* Extending elink:VkAccessFlagBits:
|
|
|
|
** ename:VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV
|
|
|
|
|
|
|
|
* Extending elink:VkImageUsageFlagBits:
|
|
|
|
** ename:VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV
|
|
|
|
|
|
|
|
* Extending elink:VkPipelineStageFlagBits
|
|
|
|
** ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV
|
|
|
|
|
|
|
|
=== New Enums
|
|
|
|
|
|
|
|
* elink:VkShadingRatePaletteEntryNV, containing the following constants:
|
|
|
|
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_NO_INVOCATIONS_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_16_INVOCATIONS_PER_PIXEL_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_8_INVOCATIONS_PER_PIXEL_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_4_INVOCATIONS_PER_PIXEL_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_2_INVOCATIONS_PER_PIXEL_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X1_PIXELS_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X2_PIXELS_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X2_PIXELS_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X4_PIXELS_NV
|
|
|
|
** ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV
|
|
|
|
|
|
|
|
=== New Structures
|
|
|
|
|
|
|
|
* slink:VkShadingRatePaletteNV
|
|
|
|
* slink:VkPipelineViewportShadingRateImageStateCreateInfoNV
|
|
|
|
* slink:VkPhysicalDeviceShadingRateImageFeaturesNV
|
|
|
|
* slink:VkPhysicalDeviceShadingRateImagePropertiesNV
|
|
|
|
|
|
|
|
=== New Functions
|
|
|
|
|
|
|
|
* flink:vkCmdBindShadingRateImageNV
|
|
|
|
* flink:vkCmdSetViewportShadingRatePaletteNV
|
|
|
|
|
|
|
|
=== Issues
|
|
|
|
|
2018-10-08 23:12:09 +00:00
|
|
|
(1) When using shading rates that specify "`coarse`" fragments covering
|
2018-09-16 01:35:16 +00:00
|
|
|
multiple pixels, we will generate a combined coverage mask that combines
|
|
|
|
the coverage masks of all pixels covered by the fragment.
|
|
|
|
By default, these masks are combined in an implementation-dependent
|
|
|
|
order.
|
|
|
|
Should we provide a mechanism allowing applications to query or specify
|
|
|
|
an exact order?
|
|
|
|
|
|
|
|
*RESOLVED*: Yes, this feature is useful for cases where most of the fragment
|
|
|
|
shader can be evaluated once for an entire coarse fragment, but where some
|
|
|
|
per-pixel computations are also required.
|
|
|
|
For example, a per-pixel alpha test may want to kill all the samples for
|
|
|
|
some pixels in a coarse fragment.
|
|
|
|
This sort of test can be implemented using an output sample mask, but such a
|
|
|
|
shader would need to know which bit in the mask corresponds to each sample
|
|
|
|
in the coarse fragment.
|
|
|
|
We are including a mechanism to allow aplications to specify the orders of
|
|
|
|
coverage samples for each shading rate and sample count, either as static
|
|
|
|
pipeline state or dynamically via a command buffer.
|
|
|
|
This portion of the extension has its own feature bit.
|
|
|
|
|
|
|
|
We will not be providing a query to determine the implementation-dependent
|
|
|
|
default ordering.
|
|
|
|
The thinking here is that if an application cares enough about the coarse
|
|
|
|
fragment sample ordering to perform such a query, it could instead just set
|
|
|
|
its own order, also using custom per-pixel sample locations if required.
|
|
|
|
|
|
|
|
(2) For the pipeline stage
|
|
|
|
ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV, should we specify a
|
|
|
|
precise location in the pipeline the shading rate image is accessed
|
|
|
|
(after geometry shading, but before the early fragment tests) or leave
|
|
|
|
it under-specified in case there are other implementations that access
|
|
|
|
the image in a different pipeline location?
|
|
|
|
|
|
|
|
*RESOLVED* We are specifying the pipeline stage to be between the final
|
|
|
|
stage used for vertex processing
|
|
|
|
(ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) and before the first stage
|
|
|
|
used for fragment processing
|
|
|
|
(ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT), which seems to be the
|
|
|
|
natural place to access the shading rate image.
|
|
|
|
|
|
|
|
(3) How do centroid-sampled variables work with fragments larger than one
|
|
|
|
pixel?
|
|
|
|
|
|
|
|
*RESOLVED* For single-pixel fragments, fragment shader inputs decorated with
|
Change log for November 12, 2018 Vulkan 1.1.92 spec update:
* Update release number to 92.
Public Issues:
* Move and modify valid usage statements dealing with pname:aspectMask in
flink:vkCmdClearColorImage, flink:vkCmdClearDepthStencilImage, and
slink:VkClearAttachment, so they are in places where all necessary
information is available (public issue 529).
* Fix math markup in <<textures-texel-anisotropic-filtering, Texel
Anisotropic Filtering>> (public pull request 840).
* Fix misspellings (public pull request 845).
Internal Issues:
* Add installation instructions and a Makefile "`chunked`" target for
chunked HTML generation (internal issue 1352).
* Fix pipeline mesh diagram style; also fix a minor bug in the classic
pipeline diagram where vertex/index buffers wrongly fed into the vertex
shader (internal issue 1436).
* Make asciidoctor ERROR output raise an error, and don't suppress
executed command output from CI make invocation (internal issue 1454).
* Minor typo fixes and clarifications for `VK_NV_raytracing`.
* Cleanup extension-specific properties
** Remove duplicated documentation for pname:maxDiscardRectangles,
pname:pointClippingBehavior, and pname:maxVertexAttribDivisor (they
shouldn't be documented with the other members of
slink:VkPhysicalDeviceLimits at all).
** Remove duplicate anchor for pname:maxVertexAttribDivisor
** Consistently document stext:VkPhysicalDevice<Extension>PropertiesKHR
*** Always document pname:sType/pname:pNext (was inconsistent before)
*** Always mention chaining to slink:VkPhysicalDeviceProperties2 (and not
as slink:VkPhysicalDeviceProperties2KHR)
*** Always include Valid Usage statements last
* Update Makefile 'checklinks' target and associated scripts, and fix
markup problems identified by checkLinks.py, so that we can rely on the
checklinks script as part of Gitlab CI.
2018-11-12 12:40:40 +00:00
|
|
|
code:Centroid are sampled at an implementation-dependent location in the
|
2018-09-16 01:35:16 +00:00
|
|
|
intersection of the area of the primitive being rasterized and the area of
|
|
|
|
the pixel that corresponds to the fragment.
|
|
|
|
With multi-pixel fragments, we follow a similar pattern, using the
|
|
|
|
intersection of the primitive and the *set* of pixels corresponding to the
|
|
|
|
fragment.
|
|
|
|
|
2018-10-08 23:12:09 +00:00
|
|
|
One important thing to keep in mind when using such "`coarse`" shading rates
|
2018-09-16 01:35:16 +00:00
|
|
|
is that fragment attributes are sampled at the center of the fragment by
|
|
|
|
default, regardless of the set of pixels/samples covered by the fragment.
|
|
|
|
For fragments with a size of 4x4 pixels, this center location will be more
|
|
|
|
than two pixels (1.5 * sqrt(2)) away from the center of the pixels at the
|
|
|
|
corners of the fragment.
|
|
|
|
When rendering a primitive that covers only a small part of a coarse
|
|
|
|
fragment, sampling a color outside the primitive can produce overly bright
|
|
|
|
or dark color values if the color values have a large gradient.
|
|
|
|
To deal with this, an application can use centroid sampling on attributes
|
2018-10-08 23:12:09 +00:00
|
|
|
where "`extrapolation`" artifacts can lead to overly bright or dark pixels.
|
2018-09-16 01:35:16 +00:00
|
|
|
Note that this same problem also exists for multisampling with single-pixel
|
|
|
|
fragments, but is less severe because it only affects certain samples of a
|
|
|
|
pixel and such bright/dark samples may be averaged with other samples that
|
|
|
|
don't have a similar problem.
|
|
|
|
|
|
|
|
=== Version History
|
|
|
|
|
|
|
|
* Revision 2, 2018-09-13 (Pat Brown)
|
|
|
|
- Miscellaneous edits preparing the specification for publication.
|
|
|
|
|
|
|
|
* Revision 1, 2018-08-08 (Pat Brown)
|
|
|
|
- Internal revisions
|