| // Copyright 2018-2021 The Khronos Group, Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_EXT_astc_decode_mode.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2018-08-07 |
| *Contributors*:: |
| - Jan-Harald Fredriksen, Arm |
| |
| === Description |
| |
| The existing specification requires that low dynamic range (LDR) ASTC |
| textures are decompressed to FP16 values per component. |
| In many cases, decompressing LDR textures to a lower precision intermediate |
| result gives acceptable image quality. |
| Source material for LDR textures is typically authored as 8-bit UNORM |
| values, so decoding to FP16 values adds little value. |
| On the other hand, reducing precision of the decoded result reduces the size |
| of the decompressed data, potentially improving texture cache performance |
| and saving power. |
| |
| The goal of this extension is to enable this efficiency gain on existing |
| ASTC texture data. |
| This is achieved by giving the application the ability to select the |
| intermediate decoding precision. |
| |
| Three decoding options are provided: |
| |
| * Decode to ename:VK_FORMAT_R16G16B16A16_SFLOAT precision: This is the |
| default, and matches the required behavior in the core API. |
| * Decode to ename:VK_FORMAT_R8G8B8A8_UNORM precision: This is provided as |
| an option in LDR mode. |
| * Decode to ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 precision: This is |
| provided as an option in both LDR and HDR mode. |
| In this mode, negative values cannot be represented and are clamped to |
| zero. |
| The alpha component is ignored, and the results are as if alpha was 1.0. |
| This decode mode is optional and support can be queried via the physical |
| device properties. |
| |
| include::{generated}/interfaces/VK_EXT_astc_decode_mode.txt[] |
| |
| === Issues |
| |
| 1) Are implementations allowed to decode at a higher precision than what is |
| requested? |
| |
| RESOLUTION: No. |
| If we allow this, then this extension could be exposed on all |
| implementations that support ASTC. |
| But developers would have no way of knowing what precision was actually |
| used, and thus whether the image quality is sufficient at reduced |
| precision. |
| |
| 2) Should the decode mode be image view state and/or sampler state? |
| |
| RESOLUTION: Image view state only. |
| Some implementations treat the different decode modes as different |
| texture formats. |
| |
| === Example |
| |
| Create an image view that decodes to ename:VK_FORMAT_R8G8B8A8_UNORM |
| precision: |
| |
| [source,c++] |
| ---------------------------------------- |
| |
| VkImageViewASTCDecodeModeEXT decodeMode = |
| { |
| VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, // sType |
| NULL, // pNext |
| VK_FORMAT_R8G8B8A8_UNORM // decode mode |
| }; |
| |
| VkImageViewCreateInfo createInfo = |
| { |
| VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // sType |
| &decodeMode, // pNext |
| // flags, image, viewType set to application-desired values |
| VK_FORMAT_ASTC_8x8_UNORM_BLOCK, // format |
| // components, subresourceRange set to application-desired values |
| }; |
| |
| VkImageView imageView; |
| VkResult result = vkCreateImageView( |
| device, |
| &createInfo, |
| NULL, |
| &imageView); |
| ---------------------------------------- |
| |
| === Version History |
| |
| * Revision 1, 2018-08-07 (Jan-Harald Fredriksen) |
| - Initial revision |
| |