| // Copyright (c) 2017-2020 Advanced Micro Devices, Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_AMD_shader_fragment_mask.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2017-08-16 |
| *IP Status*:: |
| No known IP claims. |
| *Interactions and External Dependencies*:: |
| - This extension requires |
| {spirv}/AMD/SPV_AMD_shader_fragment_mask.html[`SPV_AMD_shader_fragment_mask`] |
| *Contributors*:: |
| - Aaron Hagan, AMD |
| - Daniel Rakos, AMD |
| - Timothy Lottes, AMD |
| |
| === Description |
| |
| This extension provides efficient read access to the fragment mask in |
| compressed multisampled color surfaces. |
| The fragment mask is a lookup table that associates color samples with color |
| fragment values. |
| |
| From a shader, the fragment mask can be fetched with a call to |
| code:fragmentMaskFetchAMD, which returns a single code:uint where each |
| subsequent four bits specify the color fragment index corresponding to the |
| color sample, starting from the least significant bit. |
| For example, when eight color samples are used, the color fragment index for |
| color sample 0 will be in bits 0-3 of the fragment mask, for color sample 7 |
| the index will be in bits 28-31. |
| |
| The color fragment for a particular color sample may then be fetched with |
| the corresponding fragment mask value using the code:fragmentFetchAMD shader |
| function. |
| |
| include::{generated}/interfaces/VK_AMD_shader_fragment_mask.txt[] |
| |
| === New SPIR-V Capabilities |
| |
| * <<spirvenv-capabilities-table-FragmentMaskAMD, code:FragmentMaskAMD>> |
| |
| === Examples |
| |
| This example shows a shader that queries the fragment mask from a |
| multisampled compressed surface and uses it to query fragment values. |
| |
| [source,c++] |
| ---------------------------------------- |
| #version 450 core |
| |
| #extension GL_AMD_shader_fragment_mask: enable |
| |
| layout(binding = 0) uniform sampler2DMS s2DMS; |
| layout(binding = 1) uniform isampler2DMSArray is2DMSArray; |
| |
| layout(binding = 2, input_attachment_index = 0) uniform usubpassInputMS usubpassMS; |
| |
| layout(location = 0) out vec4 fragColor; |
| |
| void main() |
| { |
| vec4 fragOne = vec4(0.0); |
| |
| uint fragMask = fragmentMaskFetchAMD(s2DMS, ivec2(2, 3)); |
| uint fragIndex = (fragMask & 0xF0) >> 4; |
| fragOne += fragmentFetchAMD(s2DMS, ivec2(2, 3), 1); |
| |
| fragMask = fragmentMaskFetchAMD(is2DMSArray, ivec3(2, 3, 1)); |
| fragIndex = (fragMask & 0xF0) >> 4; |
| fragOne += fragmentFetchAMD(is2DMSArray, ivec3(2, 3, 1), fragIndex); |
| |
| fragMask = fragmentMaskFetchAMD(usubpassMS); |
| fragIndex = (fragMask & 0xF0) >> 4; |
| fragOne += fragmentFetchAMD(usubpassMS, fragIndex); |
| |
| fragColor = fragOne; |
| } |
| ---------------------------------------- |
| |
| === Version History |
| |
| * Revision 1, 2017-08-16 (Aaron Hagan) |
| - Initial draft |