2019-01-06 03:40:12 +00:00
|
|
|
// Copyright (c) 2018-2019 Khronos Group. This work is licensed under a
|
2018-09-08 22:52:13 +00:00
|
|
|
// Creative Commons Attribution 4.0 International License; see
|
|
|
|
// http://creativecommons.org/licenses/by/4.0/
|
|
|
|
|
|
|
|
include::meta/VK_EXT_astc_decode_mode.txt[]
|
|
|
|
|
|
|
|
Last Modified Date::
|
|
|
|
2018-08-07
|
|
|
|
Contributors::
|
|
|
|
- Jan-Harald Fredriksen, Arm
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
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
|
|
|
* Decode to ename:VK_FORMAT_R16G16B16A16_SFLOAT precision: This is the
|
2018-09-08 22:52:13 +00:00
|
|
|
default, and matches the required behavior in the core API.
|
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
|
|
|
* Decode to ename:VK_FORMAT_R8G8B8A8_UNORM precision: This is provided as
|
2018-09-08 22:52:13 +00:00
|
|
|
an option in LDR mode.
|
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
|
|
|
* Decode to ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 precision: This is
|
2018-09-08 22:52:13 +00:00
|
|
|
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.
|
|
|
|
|
|
|
|
=== New Enum Constants
|
|
|
|
|
|
|
|
* Extending elink:VkStructureType:
|
|
|
|
** ename:VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT
|
|
|
|
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT
|
|
|
|
|
|
|
|
=== New Enums
|
|
|
|
|
|
|
|
None.
|
|
|
|
|
|
|
|
=== New Structures
|
|
|
|
|
|
|
|
* slink:VkImageViewASTCDecodeModeEXT
|
|
|
|
* slink:VkPhysicalDeviceASTCDecodeFeaturesEXT
|
|
|
|
|
|
|
|
=== New Functions
|
|
|
|
|
|
|
|
None.
|
|
|
|
|
|
|
|
=== 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
|
|
|
|
|
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
|
|
|
Create an image view that decodes to ename:VK_FORMAT_R8G8B8A8_UNORM
|
|
|
|
precision:
|
2018-09-08 22:52:13 +00:00
|
|
|
|
|
|
|
[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
|
2019-01-06 03:40:12 +00:00
|
|
|
};
|
2018-09-08 22:52:13 +00:00
|
|
|
|
|
|
|
VkImageView imageView;
|
|
|
|
VkResult result = vkCreateImageView(
|
|
|
|
device,
|
|
|
|
&createInfo,
|
|
|
|
NULL,
|
|
|
|
&imageView);
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
=== Version History
|
|
|
|
|
|
|
|
* Revision 1, 2018-08-07 (Jan-Harald Fredriksen)
|
|
|
|
- Initial revision
|
|
|
|
|