Change log for September 8, 2018 Vulkan 1.1.84 spec update:

* Update release number to 84.

Public Issues:

  * Fix code sample in the `<<VK_EXT_debug_utils>>` extension (public issue
    751).
  * Fix misleading comment in `vk.xml` for
    slink:VkDescriptorBufferInfo::pname:buffer (public pull request 762).
  * Fix formatting of deprecation attributes in schema doc (public pull
    request 767).
  * Change `can` to `may` in the description of
    elink:VkSparseImageFormatFlagBits, which are return values from queries
    (public pull request 768).
  * Prettify generated contact list in extension appendices, adding logos
    and a New Issue link (public pull request 770).
  * Enable sRGB conversion based on the image view format, not the image
    format, in the <<textures-format-conversion, Format Conversion>> section
    (public pull request 773).
  * Fix typo in equation in the <<primsrast-lines-basic, Basic Line Segment
    Rasterization>> section (public pull request 780).
  * Fix special characters in GitHub contacts links (public pull request
    783).
  * Make clean_pdf target remove pdf folder (public pull request 784).
  * Fix styleguide bad markup of block continuation (public pull request
    792).

Other Issues:

  * Allow a zero vertex attribute divisor in the
    `<<VK_EXT_vertex_attribute_divisor>>` extension, exposed via the
    slink:VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT feature.
  * Add missing `structextends="VkDeviceCreateInfo"` to
    slink:VkPhysicalDeviceShaderDrawParameterFeatures and
    slink:VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT.

New Extensions:

  * `VK_KHR_memory_model`
  * `VK_EXT_astc_decode_mode`
  * `VK_EXT_inline_uniform_block`
This commit is contained in:
Jon Leech 2018-09-08 15:52:13 -07:00
parent 89155faa62
commit adadfce8a3
30 changed files with 2481 additions and 82 deletions

View File

@ -8,6 +8,51 @@ public pull requests that have been accepted.
-----------------------------------------------------
Change log for September 8, 2018 Vulkan 1.1.84 spec update:
* Update release number to 84.
Public Issues:
* Fix code sample in the `<<VK_EXT_debug_utils>>` extension (public issue
751).
* Fix misleading comment in `vk.xml` for
slink:VkDescriptorBufferInfo::pname:buffer (public pull request 762).
* Fix formatting of deprecation attributes in schema doc (public pull
request 767).
* Change `can` to `may` in the description of
elink:VkSparseImageFormatFlagBits, which are return values from queries
(public pull request 768).
* Prettify generated contact list in extension appendices, adding logos
and a New Issue link (public pull request 770).
* Enable sRGB conversion based on the image view format, not the image
format, in the <<textures-format-conversion, Format Conversion>> section
(public pull request 773).
* Fix typo in equation in the <<primsrast-lines-basic, Basic Line Segment
Rasterization>> section (public pull request 780).
* Fix special characters in GitHub contacts links (public pull request
783).
* Make clean_pdf target remove pdf folder (public pull request 784).
* Fix styleguide bad markup of block continuation (public pull request
792).
Other Issues:
* Allow a zero vertex attribute divisor in the
`<<VK_EXT_vertex_attribute_divisor>>` extension, exposed via the
slink:VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT feature.
* Add missing `structextends="VkDeviceCreateInfo"` to
slink:VkPhysicalDeviceShaderDrawParameterFeatures and
slink:VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT.
New Extensions:
* `VK_KHR_memory_model`
* `VK_EXT_astc_decode_mode`
* `VK_EXT_inline_uniform_block`
-----------------------------------------------------
Change log for August 13, 2018 Vulkan 1.1.83 spec update:
* Update release number to 83.

View File

@ -107,7 +107,7 @@ VERBOSE =
# EXTRAATTRIBS sets additional attributes, if passed to make
# ADOCOPTS options for asciidoc->HTML5 output
NOTEOPTS = -a editing-notes -a implementation-guide
PATCHVERSION = 83
PATCHVERSION = 84
ifneq (,$(findstring VK_VERSION_1_1,$(VERSIONS)))
SPECREVISION = 1.1.$(PATCHVERSION)
else

View File

@ -0,0 +1,113 @@
// Copyright (c) 2018 Khronos Group. This work is licensed under a
// 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:
* Decode to elink:VK_FORMAT_R16G16B16A16_SFLOAT precision: This is the
default, and matches the required behavior in the core API.
* Decode to elink:VK_FORMAT_R8G8B8A8_UNORM precision: This is provided as
an option in LDR mode.
* Decode to elink: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.
=== 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
Create an image view that decodes to 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

View File

@ -152,7 +152,7 @@ happens and the third will log warnings to stdout.
myOutputDebugString, // pfnUserCallback
NULL // pUserData
};
res = pfnCreateDebugUtilsMessengerEXT(instance, &callback1, &cb1);
res = pfnCreateDebugUtilsMessengerEXT(instance, &callback1, NULL, &cb1);
if (res != VK_SUCCESS) {
// Do error handling for VK_ERROR_OUT_OF_MEMORY
}
@ -160,7 +160,7 @@ happens and the third will log warnings to stdout.
callback1.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
callback1.pfnCallback = myDebugBreak;
callback1.pUserData = NULL;
res = pfnCreateDebugUtilsMessengerEXT(instance, &callback1, &cb2);
res = pfnCreateDebugUtilsMessengerEXT(instance, &callback1, NULL, &cb2);
if (res != VK_SUCCESS) {
// Do error handling for VK_ERROR_OUT_OF_MEMORY
}
@ -175,7 +175,7 @@ happens and the third will log warnings to stdout.
mystdOutLogger, // pfnUserCallback
NULL // pUserData
};
res = pfnCreateDebugUtilsMessengerEXT(instance, &callback3, &cb3);
res = pfnCreateDebugUtilsMessengerEXT(instance, &callback3, NULL, &cb3);
if (res != VK_SUCCESS) {
// Do error handling for VK_ERROR_OUT_OF_MEMORY
}
@ -183,9 +183,9 @@ happens and the third will log warnings to stdout.
...
// Remove callbacks when cleaning up
pfnDestroyDebugUtilsMessengerEXT(instance, cb1);
pfnDestroyDebugUtilsMessengerEXT(instance, cb2);
pfnDestroyDebugUtilsMessengerEXT(instance, cb3);
pfnDestroyDebugUtilsMessengerEXT(instance, cb1, NULL);
pfnDestroyDebugUtilsMessengerEXT(instance, cb2, NULL);
pfnDestroyDebugUtilsMessengerEXT(instance, cb3, NULL);
------------------------------------------------------------------------------
**Example 2**

View File

@ -0,0 +1,112 @@
include::meta/VK_EXT_inline_uniform_block.txt[]
*Last Modified Date*::
2018-08-01
*IP Status*::
No known IP claims.
*Contributors*::
- Daniel Rakos, AMD
- Jeff Bolz, NVIDIA
- Slawomir Grajewski, Intel
- Neil Henning, Codeplay
This extension introduces the ability to back uniform blocks directly with
descriptor sets by storing inline uniform data within descriptor pool
storage.
Compared to push constants this new construct allows uniform data to be
reused across multiple disjoint sets of draw or dispatch commands and may:
enable uniform data to be accessed with less indirections compared to
uniforms backed by buffer memory.
=== New Object Types
None
=== New Enum Constants
* Extending elink:VkStructureType:
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT
** ename:VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT
** ename:VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT
* Extending elink:VkDescriptorType:
** ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
=== New Enums
None
=== New Structures
* slink:VkPhysicalDeviceInlineUniformBlockFeaturesEXT
* slink:VkPhysicalDeviceInlineUniformBlockPropertiesEXT
* slink:VkWriteDescriptorSetInlineUniformBlockEXT
* slink:VkDescriptorPoolInlineUniformBlockCreateInfoEXT
=== New Functions
None
=== New Built-In Variables
None
=== Issues
1) Do we need a new storage class for inline uniform blocks vs uniform
blocks?
*RESOLVED*: No.
The code:Uniform storage class is used to allow the same syntax used for
both uniform buffers and inline uniform blocks.
2) Is the descriptor array index and array size expressed in terms of bytes
or dwords for inline uniform block descriptors?
*RESOLVED*: In bytes, but both must: be a multiple of 4, similar to how push
constant ranges are specified.
The pname:descriptorCount of sname:VkDescriptorSetLayoutBinding thus
provides the total number of bytes a particular binding with an inline
uniform block descriptor type can hold, while the pname:srcArrayElement,
pname:dstArrayElement, and pname:descriptorCount members of
sname:VkWriteDescriptorSet, sname:VkCopyDescriptorSet, and
sname:VkDescriptorUpdateTemplateEntry (where applicable) specify the byte
offset and number of bytes to write/copy to the binding's backing store.
Additionally, the pname:stride member of
sname:VkDescriptorUpdateTemplateEntry is ignored for inline uniform blocks
and a default value of one is used, meaning that the data to update inline
uniform block bindings with must be contiguous in memory.
3) What layout rules apply for uniform blocks corresponding to inline
constants?
*RESOLVED*: They use the same layout rules as uniform buffers.
4) Do we need to add non-uniform indexing features/properties as introduced
by `VK_EXT_descriptor_indexing` for inline uniform blocks?
*RESOLVED*: No, because inline uniform blocks are not allowed to be
"arrayed".
A single binding with an inline uniform block descriptor type corresponds to
a single uniform block instance and the array indices inside that binding
refer to individual offsets within the uniform block (see issue #2).
However, this extension does introduce new features/properties about the
level of support for update-after-bind inline uniform blocks.
5) Is the pname:descriptorBindingVariableDescriptorCount feature introduced
by `VK_EXT_descriptor_indexing` supported for inline uniform blocks?
*RESOLVED*: Yes, as long as other inline uniform block specific limits are
respected.
6) Do the robustness guarantees of pname:robustBufferAccess apply to inline
uniform block accesses?
*RESOLVED*: No, similarly to push constants, as they are not backed by
buffer memory like uniform buffers.
=== Version History
* Revision 1, 2018-08-01 (Daniel Rakos)
- Internal revisions

View File

@ -1,7 +1,7 @@
include::meta/VK_EXT_vertex_attribute_divisor.txt[]
*Last Modified Date*::
2018-07-16
2018-08-03
*IP Status*::
No known IP claims.
*Contributors*::
@ -33,6 +33,8 @@ None.
** slink:VkPipelineVertexInputDivisorStateCreateInfoEXT
* slink:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT
* slink:VkVertexInputBindingDivisorDescriptionEXT
* Extending slink:VkPhysicalDeviceFeatures2:
** slink:VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT
=== New Functions
@ -48,9 +50,8 @@ offsets.
2) Should zero be an allowed divisor?
*RESOLVED*: No.
The zero case in OpenGL is handled in Vulkan by setting the pname:inputRate
on the binding to ename:VK_VERTEX_INPUT_RATE_VERTEX.
*RESOLVED*: Yes.
A zero divisor means the vertex attribute is repeated for all instances.
=== Examples
@ -101,3 +102,6 @@ application could use the following set of structures:
- Adjust the interaction between fname:divisor and pname:firstInstance
to match the OpenGL convention.
- Disallow divisors of zero.
* Revision 3, 2018-08-03 (Vikram Kushwaha)
- Allow a zero divisor.
- Add a physical device features structure to query/enable this feature.

View File

@ -0,0 +1,45 @@
// Copyright (c) 2017-2018 Khronos Group. This work is licensed under a
// Creative Commons Attribution 4.0 International License; see
// http://creativecommons.org/licenses/by/4.0/
include::meta/VK_KHR_vulkan_memory_model.txt[]
*Last Modified Date*::
2018-02-05
*IP Status*::
No known IP claims.
*Interactions and External Dependencies*::
- This extension requires
https://www.khronos.org/registry/spir-v/extensions/KHR/SPV_KHR_vulkan_memory_model.html[+SPV_KHR_vulkan_memory_model+]
*Contributors*::
- Jeff Bolz, NVIDIA
- Alan Baker, Google
- Tobias Hector, AMD
- David Neto, Google
- Robert Simpson, Qualcomm Technologies, Inc.
- Brian Sumner, AMD
The +VK_KHR_vulkan_memory_model+ extension allows use of the
<<memory-model,Vulkan Memory Model>>, which formally defines how to
synchronize memory accesses to the same memory locations performed by
multiple shader invocations.
=== New Enum Constants
* Extending elink:VkStructureType:
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR
=== New Structures
* slink:VkPhysicalDeviceVulkanMemoryModelFeaturesKHR
=== New SPIR-V Capabilities
* <<spirvenv-capabilities-table-memorymodel,code:VulkanMemoryModelKHR>>
=== Issues
=== Version History
* Revision 1, 2018-06-24 (Jeff Bolz)
- Initial draft

View File

@ -117,3 +117,261 @@ chapter of the <<data-format,Khronos Data Format Specification>>.
| ename:VK_FORMAT_ASTC_12x12_UNORM_BLOCK ^|[eq]#12 {times} 12# ^|No
| ename:VK_FORMAT_ASTC_12x12_SRGB_BLOCK ^|[eq]#12 {times} 12# ^|Yes
|====
ifdef::VK_EXT_astc_decode_mode[]
=== ASTC decode mode
If the +VK_EXT_astc_decode_mode+ extension is enabled the ASTC decoding
described in the <<data-format,Khronos Data Format Specification>> is
modified by replacing or modifying the corresponding sections as described
below.
.Mapping of Vulkan ASTC decoding format to ASTC decoding modes
[width="75%",options="header",cols="75%,25%"]
|====
| VkFormat ^| Decoding mode
| ename:VK_FORMAT_R16G16B16A16_SFLOAT ^| decode_float16
| ename:VK_FORMAT_R8G8B8A8_UNORM ^| decode_unorm8
| ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 ^| decode_rgb9e5
|====
==== LDR and HDR Modes
[NOTE]
.Note
====
This replaces section 16.5 in the <<data-format,Khronos Data Format
Specification>>.
====
The decoding process for LDR content can be simplified if it is known in
advance that sRGB output is required.
This selection is therefore included as part of the global configuration.
The two modes differ in various ways, as shown in
<<appendix-compressedtex-astc-differences-between-ldr-and-hdr-modes, ASTC
differences between LDR and HDR modes>>.
[[appendix-compressedtex-astc-differences-between-ldr-and-hdr-modes]]
.ASTC differences between LDR and HDR modes
[width="75%",options="header"]
|====
| Operation | LDR Mode | HDR Mode
| Returned Value | Determined by decoding mode | Determined by decoding mode
| sRGB compatible | Yes | No
| LDR endpoint decoding precision | 16 bits, or 8 bits for sRGB | 16 bits
| HDR endpoint mode results | Error color | As decoded
| Error results | Error color | Vector of NaNs (0xFFFF)
|====
The type of the values returned by the decoding process is determined by the
decoding mode as shown in <<appendix-compressedtex-astc-decoding-modes, ASTC
decoding modes>>.
[[appendix-compressedtex-astc-decoding-modes]]
.ASTC decoding modes
[width="75%",options="header"]
|====
| Decode mode | LDR Mode | HDR Mode
| decode_float16 | Vector of FP16 values | Vector of FP16 values
| decode_unorm8 | Vector of 8-bit unsigned normalized values | invalid
| decode_rgb9e5 | Vector using a shared exponent format | Vector using a shared exponent format
|====
Using the decode_unorm8 decoding mode in HDR mode gives undefined results.
For sRGB, the decoding mode is ignored, and the decoding always returns a
vector of 8-bit unsigned normalized values.
The error color is opaque fully-saturated magenta [eq]#[(R,G,B,A) =
(0xFF,0x00,0xFF,0xFF)#.
This has been chosen as it is much more noticeable than black or white, and
occurs far less often in valid images.
For linear RGB decode, the error color may: be either opaque fully-saturated
magenta [eq]#(R,G,B,A) = (1.0,0.0,1.0,1.0)# or a vector of four NaNs
[eq]#(R,G,B,A) = (NaN,NaN,NaN,NaN)#.
In the latter case, the recommended [eq]#NaN# value returned is
[eq]#0xFFFF#.
When using the decode_rgb9e5 decoding mode in HDR mode, error results will
return the error color because NaN cannot be represented.
The error color is returned as an informative response to invalid
conditions, including invalid block encodings or use of reserved endpoint
modes.
Future, forward-compatible extensions to ASTC may define valid
interpretations of these conditions, which will decode to some other color.
Therefore, encoders and applications must not rely on invalid encodings as a
way of generating the error color.
[[appendix-compressedtex-astc-weight-application]]
[NOTE]
.Note
====
This replaces section 16.19 in the <<data-format,Khronos Data Format
Specification>>.
====
Once the effective weight _i_ for the texel has been calculated, the color
endpoints are interpolated and expanded.
For LDR endpoint modes, each color component C is calculated from the
corresponding 8-bit endpoint components C~0~ and C~1~ as follows:
If sRGB conversion is not enabled, or for the alpha channel in any case,
C~0~ and C~1~ are first expanded to 16 bits by bit replication:
-----
C0 = (C0 << 8) | C0; C1 = (C1 << 8) | C1;
-----
If sRGB conversion is enabled, C~0~ and C~1~ for the R, G, and B channels
are expanded to 16 bits differently, as follows:
-----
C0 = (C0 << 8) | 0x80; C1 = (C1 << 8) | 0x80;
-----
C~0~ and C~1~ are then interpolated to produce a UNORM16 result C:
-----
C = floor( (C0*(64-i) + C1*i + 32)/64 )
-----
If sRGB conversion is not enabled and the decoding mode is decode_float16,
then if C = 65535 the final result is 1.0 (0x3C00); otherwise C is divided
by 65536 and the infinite-precision result of the division is converted to
FP16 with round-to-zero semantics.
If sRGB conversion is not enabled and the decoding mode is decode_unorm8,
then top 8 bits of the interpolation result for the R, G, B, and A channels
are used as the final result.
If sRGB conversion is not enabled and the decoding mode is decode_rgb9e5,
then the final result is a combination of the (UNORM16) values of C for the
three color components (Cr, Cg, and Cb) computed as follows:
-----
int lz = clz17( Cr | Cg | Cb | 1);
if (Cr == 65535 ) { Cr = 65536; lz = 0; }
if (Cg == 65535 ) { Cg = 65536; lz = 0; }
if (Cb == 65535 ) { Cb = 65536; lz = 0; }
Cr <<= lz;
Cg <<= lz;
Cb <<= lz;
Cr = (Cr >> 8) & 0x1FF;
Cg = (Cg >> 8) & 0x1FF;
Cb = (Cb >> 8) & 0x1FF;
uint32_t exponent = 16 - lz;
uint32_t texel = (exponent << 27) | (Cb << 18) | (Cg << 9) | Cr;
-----
The clz17() function counts leading zeros in a 17-bit value.
If sRGB conversion is enabled, then the decoding mode is ignored, and the
top 8 bits of the interpolation result for the R, G and B channels are
passed to the external sRGB conversion block and used as the final result.
The A channle uses the decode_float16 decoding mode.
For HDR endpoint modes, color values are represented in a 12-bit
pseudo-logarithmic representation, and interpolation occurs in a
piecewise-approximate logarithmic manner as follows:
In LDR mode, the error result is returned.
In HDR mode, the color components from each endpoint, C~0~ and C~1~, are
initially shifted left 4 bits to become 16-bit integer values and these are
interpolated in the same way as LDR.
The 16-bit value C is then decomposed into the top five bits, E, and the
bottom 11 bits M, which are then processed and recombined with E to form the
final value C~f~:
-----
C = floor( (C0*(64-i) + C1*i + 32)/64 )
E = (C & 0xF800) >> 11; M = C & 0x7FF;
if (M < 512) { Mt = 3*M; }
else if (M >= 1536) { Mt = 5*M - 2048; }
else { Mt = 4*M - 512; }
Cf = (E<<10) + (Mt>>3)
-----
This interpolation is a considerably closer approximation to a logarithmic
space than simple 16-bit interpolation.
This final value C~f~ is interpreted as an IEEE FP16 value.
If the result is +Inf or NaN, it is converted to the bit pattern 0x7BFF,
which is the largest representable finite value.
If the decoding mode is decode_rgb9e5, then the final result is a
combination of the (IEEE FP16) values of Cf for the three color components
(Cr, Cg, and Cb) computed as follows:
-----
if( Cr > 0x7c00 ) Cr = 0; else if( Cr == 0x7c00 ) Cr = 0x7bff;
if( Cg > 0x7c00 ) Cg = 0; else if( Cg == 0x7c00 ) Cg = 0x7bff;
if( Cb > 0x7c00 ) Cb = 0; else if( Cb == 0x7c00 ) Cb = 0x7bff;
int Re = (Cr >> 10) & 0x1F;
int Ge = (Cg >> 10) & 0x1F;
int Be = (Cb >> 10) & 0x1F;
int Rex = Re == 0 ? 1 : Re;
int Gex = Ge == 0 ? 1 : Ge;
int Bex = Be == 0 ? 1 : Be;
int Xm = ((Cr | Cg | Cb) & 0x200) >> 9;
int Xe = Re | Ge | Be;
uint32_t rshift, gshift, bshift, expo;
if (Xe == 0)
{
expo = rshift = gshift = bshift = Xm;
}
else if (Re >= Ge && Re >= Be)
{
expo = Rex + 1;
rshift = 2;
gshift = Rex - Gex + 2;
bshift = Rex - Bex + 2;
}
else if (Ge >= Be)
{
expo = Gex + 1;
rshift = Gex - Rex + 2;
gshift = 2;
bshift = Gex - Bex + 2;
}
else
{
expo = Bex + 1;
rshift = Bex - Rex + 2;
gshift = Bex - Gex + 2;
bshift = 2;
}
int Rm = (Cr & 0x3FF) | (Re == 0 ? 0 : 0x400);
int Gm = (Cg & 0x3FF) | (Ge == 0 ? 0 : 0x400);
int Bm = (Cb & 0x3FF) | (Be == 0 ? 0 : 0x400);
Rm = (Rm >> rshift) & 0x1FF;
Gm = (Gm >> gshift) & 0x1FF;
Bm = (Bm >> bshift) & 0x1FF;
uint32_t texel = (expo << 27) | (Bm << 18) | (Gm << 9) | (Rm << 0);
-----
=== Void-Extent Blocks
[NOTE]
.Note
====
This modifies section 16.23 in the <<data-format,Khronos Data Format
Specification>>.
====
In the HDR case, if the decoding mode is decode_rgb9e5, then any negative
color component values are set to 0 before conversion to the shared exponent
format (as described in <<appendix-compressedtex-astc-weight-application,
Weight Application>>).

View File

@ -59,4 +59,5 @@ interface stability than a non-`X` extension from the same vendor.
====
include::meta/current_extensions_appendix.txt[]
include::meta/provisional_extensions_appendix.txt[]
include::meta/deprecated_extensions_appendix.txt[]

View File

@ -660,6 +660,12 @@ Initial State (Command Buffer)::
A command buffer that has not begun recording commands.
See also Recorded State and Executable State.
ifdef::VK_EXT_inline_uniform_block[]
Inline Uniform Block::
A descriptor type that represents uniform data stored directly in
descriptor sets, and supports read-only access in a shader.
endif::VK_EXT_inline_uniform_block[]
Input Attachment::
A descriptor type that represents an image view, and supports unfiltered
read-only access in a shader, only at the fragment's location in the
@ -750,6 +756,20 @@ Memory Dependency::
* The availability operation happens-before the visibility operation
* The visibility operation happens-before the second set of operations
Memory Domain::
A memory domain is an abstract place to which memory writes are made
available by availability operations and memory domain operations.
The memory domains correspond to the set of agents that the write can:
then be made visible to.
The memory domains are _host_, _device_, _shader_, _workgroup instance_
(for workgroup instance there is a unique domain for each compute
workgroup) and _subgroup instance_ (for subgroup instance there is a
unique domain for each subgroup).
Memory Domain Operation::
An operation that makes the writes that are available to one memory
domain available to another memory domain.
Memory Heap::
A region of memory from which device memory allocations can: be made.
@ -972,6 +992,13 @@ Protected Image::
An image to which protected device memory can: be bound.
endif::VK_VERSION_1_1[]
Provisional::
A feature is released provisionally in order to get wider feedback on
the functionality before it is finalized.
Provisional features may change in ways that break backwards
compatibility, and thus are not recommended for use in production
applications.
Provoking Vertex::
The vertex in a primitive from which flat shaded attribute values are
taken.

848
appendices/memorymodel.txt Normal file
View File

@ -0,0 +1,848 @@
[[memory-model]]
= Memory Model
[[memory-model-agent]]
== Agent
_Operation_ is a general term for any task that is executed on the system.
NOTE: An operation is by definition something that is executed, thus if an
instruction is skipped due to flow control it does not constitute an
operation.
Each operation is executed by a particular _agent_.
Possible agents include each shader invocation, each host thread, and each
fixed-function stage of the pipeline.
[[memory-model-memory-location]]
== Memory Location
A _memory location_ identifies unique storage for 8 bits of data.
Memory operations access a _set of memory locations_ consisting of one or
more memory locations at a time, e.g. an operation accessing a 32-bit
integer in memory would read/write a set of four memory locations.
Two sets of memory locations _overlap_ if the intersection of their sets of
memory locations is non-empty.
A memory operation must: not affect memory at a memory location not within
its set of memory locations.
Memory locations for buffers and images are explicitly allocated in
VkDeviceMemory objects, and are implicitly allocated for SPIR-V variables in
each shader invocation.
[[memory-model-allocation]]
== Allocation
The values stored in newly allocated memory locations are determined by a
SPIR-V variable's initializer, if present, or else are undefined.
At the time an allocation is created there have been no
<<memory-model-memory-operation,memory operations>> to any of its memory
locations.
The initialization is not considered to be a memory operation.
NOTE: For tessellation control shader output variables, a consequence of
initialization not being considered a memory operation is that some
implementations may need to insert a barrier between the initialization of
the output variables and any reads of those variables.
[[memory-model-memory-operation]]
== Memory Operation
For an operation A and memory location M:
* [[memory-model-access-read]] A _reads_ M if and only if the data stored
in M is an input to A.
* [[memory-model-access-write]] A _writes_ M if and only if the data
output from A is stored to M.
* [[memory-model-access-access]] A _accesses_ M if and only if it either
reads or writes (or both) M.
NOTE: A write whose value is the same as what was already in those memory
locations is still considered to be a write and has all the same effects.
[[memory-model-references]]
== Reference
A _reference_ is an object that a particular agent can: use to access a set
of memory locations.
On the host, a reference is a host virtual address.
On the device, a reference is:
* The descriptor that a variable is bound to, for variables in Image,
Uniform, or StorageBuffer storage classes.
If the variable is an array (or array of arrays, etc.) then each element
of the array may: be a unique reference.
* The variable itself for variables in other storage classes.
Two memory accesses through distinct references may: require availability
and visibility operations as defined
<<memory-model-location-ordered,below>>.
[[memory-model-program-order]]
== Program-Order
A _dynamic instance_ of an instruction is defined in SPIR-V
(https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html#DynamicInstance)
as a way of referring to a particular execution of a static instruction.
Program-order is an ordering on dynamic instances of instructions executed
by a single shader invocation:
* (Basic block): If instructions A and B are in the same basic block, and
A is listed in the module before B, then the n'th dynamic instance of A
is program-ordered before the n'th dynamic instance of B.
* (Branch): The dynamic instance of a branch or switch instruction is
program-ordered before the dynamic instance of the OpLabel instruction
to which it transfers control.
* (Call entry): The dynamic instance of a function call instruction is
program-ordered before the dynamic instances of the
code:OpFunctionParameter instructions and the body of the called
function.
* (Call exit): The dynamic instance of the instruction following a
function call instruction is program-ordered after the dynamic instance
of the return instruction executed by the called function.
* (Transitive Closure): If dynamic instance A of any instruction is
program-ordered before dynamic instance B of any instruction and B is
program-ordered before dynamic instance C of any instruction then A is
program-ordered before C.
* (Complete definition): No other dynamic instances are program-ordered.
For instructions executed on the host, the source language defines the
program-order relation (e.g. as "sequenced-before").
[[memory-model-scope]]
== Scope
A _scope_ describes a set of shader invocations, where each such set is a
_scope instance_.
Scopes are defined hierarchically such that a more inclusive scope includes
one or more sets of less inclusive scope instances.
The scopes defined by SPIR-V are as follows, defined from most inclusive to
least inclusive:
* code:CrossDevice identifies all shader invocations in a Vulkan instance
across all shader launches, and all host threads interacting with that
instance.
* code:Device identifes all shader invocations that execute on a given
device, including those from different shader launches.
* code:QueueFamilyKHR identifes all shader invocations that execute on any
queue in a given queue family, including those from different shader
launches.
* code:Workgroup identifies all invocations in a single workgroup.
* code:Subgroup identifies all invocations in a single subgroup.
* code:Invocation identifies a single invocation.
Atomic and barrier instructions include scopes which identify sets of shader
invocations that must: obey the requested ordering and atomicity rules of
the operation, as defined below.
[[memory-model-atomic-operation]]
== Atomic Operation
An _atomic operation_ on the device is any SPIR-V operation whose name
begins with code:OpAtomic.
An atomic operation on the host is any operation performed with an
std::atomic typed object.
Each atomic operation has a memory <<memory-model-scope,scope>> and a
<<memory-model-memory-semantics,semantics>>.
Informally, the scope determines which other agents it is atomic with
respect to, and the <<memory-model-memory-semantics,semantics>> constrains
the ordering of other memory accesses.
Device atomic operations have explicit scopes and semantics.
Each host atomic operation implicitly uses the code:CrossDevice scope, and
uses a memory semantics equivalent to a C++ std::memory_order value of
relaxed, acquire, release, acq_rel, or seq_cst.
Two atomic operations A and B are _potentially-mutually-ordered_ if and only
if all of the following are true:
* They access the same set of memory locations.
* They use the same reference.
* A is in the instance of B's memory scope.
* B is in the instance of A's memory scope.
Two atomic operations A and B are _mutually-ordered_ if and only if they are
potentially-mutually-ordered and any of the following are true:
* A and B are both device operations.
* A and B are both host operations.
* A is a device operation, B is a host operation, and the implementation
supports concurrent host- and device-atomics.
NOTE: If two atomic operations are not mutually-ordered, then each must: be
synchronized against the other as if it were a non-atomic operation.
[[memory-model-scoped-modification-order]]
== Scoped Modification Order
For a given atomic operation A, all atomic operations that are
mutually-ordered with A occur in an order known as A's _scoped modification
order_.
NOTE: Invocations outside the instance of A's memory scope may: observe the
values at A's set of memory locations becoming visible to it in an order
that disagrees with the scoped modification order.
NOTE: It is valid to have non-atomic operations or atomics in a different
scope instance to the same set of memory locations, as long as they are
synchronized against each other as if they were non-atomic (if they are not,
it is treated as a <<memory-model-access-data-race,data race>>).
That means this definition of A's scoped modification order could include
atomic operations that occur much later, after intervening non-atomics.
That is a bit non-intuitive, but it helps to keep this definition simple and
non-circular.
[[memory-model-memory-semantics]]
== Memory Semantics
Non-atomic memory operations, by default, may: be observed by one agent in a
different order than they were written by another agent.
Atomics and some synchronization operations include _memory semantics_,
which are flags that constrain the order in which other memory accesses
(including non-atomic memory accesses and
<<memory-model-availability-visibility,availability and visibility
operations>>) performed by the same agent can: be observed by other agents,
or can: observe accesses by other agents.
Device instructions that include semantics are code:OpAtomic*,
code:OpControlBarrier, code:OpMemoryBarrier, and code:OpMemoryNamedBarrier.
Host instructions that include semantics are some std::atomic methods and
memory fences.
SPIR-V supports the following memory semantics:
* Relaxed: No constraints on order of other memory accesses.
* Acquire: A memory read with this semantic performs an _acquire
operation_.
A memory barrier with this semantic is an _acquire barrier_.
* Release: A memory write with this semantic performs a _release
operation_.
A memory barrier with this semantic is a _release barrier_.
* AcquireRelease: A memory read-modify-write operation with this semantic
performs both an acquire operation and a release operation, and inherits
the limitations on ordering from both of those operations.
A memory barrier with this semantic is both a release and acquire
barrier.
NOTE: SPIR-V does not support "consume" semantics on the device.
The memory semantics operand also includes _storage class semantics_ which
indicate which storage classes are constrained by the synchronization.
SPIR-V storage class semantics include:
* UniformMemory
* WorkgroupMemory
* ImageMemory
* OutputMemoryKHR
Each SPIR-V memory operation accesses a single storage class.
Semantics in synchronization operations can include a combination of storage
classes.
The UniformMemory storage class semantic applies to accesses to memory in
the Uniform and StorageBuffer storage classes.
The WorkgroupMemory storage class semantic applies to accesses to memory in
the Workgroup storage class.
The ImageMemory storage class semantic applies to accesses to memory in the
Image storage class.
The OutputMemoryKHR storage class semantic applies to accesses to memory in
the Output storage class.
NOTE: Informally, these constraints limit how memory operations can be
reordered, and these limits apply not only to the order of accesses as
performed in the agent that executes the instruction, but also to the order
the effects of writes become visible to all other agents within the same
instance of the instruction's memory scope.
NOTE: Release and acquire operations in different threads can: act as
synchronization operations, to guarantee that writes that happened before
the release are visible after the acquire.
(This is not a formal definition, just an informative forward reference.)
NOTE: The OutputMemoryKHR storage class semantic is only useful in
tessellation control shaders, which is the only execution model where output
variables are shared between invocations.
The memory semantics operand also optionally includes availability and
visibility flags, which apply availability and/or visibility operations as
described in <<memory-model-availability-visibility,availability and
visibility>>.
The availability/visibility flags are:
* MakeAvailable: Semantics must: be Release or AcquireRelease.
Performs an availability operation before the release operation or
barrier.
* MakeVisible: Semantics must: be Acquire or AcquireRelease.
Performs a visibility operation after the acquire operation or barrier.
The specifics of these operations are defined in
<<memory-model-availability-visibility-semantics,Availability and Visibility
Semantics>>.
Host atomic operations may: support a different list of memory semantics and
synchronization operations, depending on the host architecture and source
language.
[[memory-model-release-sequence]]
== Release Sequence
After an atomic operation A performs a release operation on a set of memory
locations M, the _release sequence headed by A_ is the longest continuous
subsequence of A's scoped modification order that consists of:
* the atomic operation A as its first element
* atomic read-modify-write operations on M by any agent
NOTE: The atomics in the last bullet must: be mutually-ordered with A by
virtue of being in A's scoped modification order.
NOTE: This intentionally omits "atomic writes to M performed by the same
agent that performed A", which is present in the corresponding C++
definition.
[[memory-model-synchronizes-with]]
== Synchronizes-With
_Synchronizes-with_ is a relation between atomic operations and/or memory
barriers (aka fences on the host).
If A and B are atomic operations, then A synchronizes-with B if and only if
all of the following are true:
* A performs a release operation
* B performs an acquire operation
* A and B are mutually-ordered
* B takes its value from the release sequence headed by A
code:OpControlBarrier, code:OpMemoryBarrier, and code:OpMemoryNamedBarrier
are _memory barrier_ instructions in SPIR-V.
If A is a release barrier and B is an atomic operation that performs an
acquire operation, then A synchronizes-with B if and only if all of the
following are true:
* there exists an atomic write X (with any memory semantics)
* A is program-ordered before X
* X and B are mutually-ordered
* B reads the value written by X (or the release sequence headed by X, if
X has release semantics)
* A and B are in the instance of each other's memory scopes
* X's storage class is in A's semantics.
If A is an atomic operation that performs a release operation and B is an
acquire barrier, then A synchronizes-with B if and only if all of the
following are true:
* there exists an atomic read X (with any memory semantics)
* X is program-ordered before B
* X and A are mutually-ordered
* X reads the value written by A (or the release sequence headed by A)
* A and B are in the instance of each other's memory scopes
* X's storage class is in B's semantics.
If A is a release barrier and B is an acquire barrier, then A
synchronizes-with B if all of the following are true:
* there exists an atomic write X (with any memory semantics)
* A is program-ordered before X
* there exists an atomic read Y (with any memory semantics)
* Y is program-ordered before B
* X and Y are mutually-ordered
* Y reads the value written by X (or the release sequence headed by X, if
X has release semantics)
* A and B are in the instance of each other's memory scopes
* X's and Y's storage class is in A's and B's semantics.
** NOTE: X and Y must have the same storage class, because they are
mutually ordered.
If A is a release barrier and B is an acquire barrier and C is a control
barrier (where A can optionally equal C and/or B can optionally equal C),
then A synchronizes-with B if all of the following are true:
* A is program-ordered before (or equals) C
* C is program-ordered before (or equals) B
* A and B are in the instance of each other's memory scopes
* A and B are in the instance of C's execution scope
NOTE: This is similar to the barrier-barrier synchronization above, but with
a control barrier filling the role of the relaxed atomics.
No other release and acquire barriers synchronize-with each other.
[[memory-model-system-synchronizes-with]]
== System-Synchronizes-With
_System-synchronizes-with_ is a relation between arbitrary operations on the
device or host.
Certain operations system-synchronize-with each other, which informally
means the first operation occurs before the second and that the
synchronization is performed without using application-visible memory
accesses.
If there is an <<synchronization-dependencies-execution,execution
dependency>> between two operations A and B, then the operation in the first
synchronization scope system-synchronizes-with the operation in the second
synchronization scope.
NOTE: This covers all Vulkan synchronization primitives, including device
operations executing before a synchronization primitive is signaled, wait
operations happening before subsequent device operations, signal operations
happening before host operations that wait on them, and host operations
happening before vkQueueSubmit.
The list is spread throughout the synchronization chapter, and is not
repeated here.
System-synchronizes-with implicitly includes all storage class semantics and
has code:CrossDevice scope.
If A system-synchronizes-with B, we also say A is
_system-synchronized-before_ B and B is _system-synchronized-after_ A.
[[memory-model-non-private]]
== Private vs. Non-Private
By default, non-atomic memory operations are treated as _private_, meaning
such a memory operation is not intended to be used for communication with
other agents.
Memory operations with the NonPrivatePointerKHR/NonPrivateTexelKHR bit set
are treated as _non-private_, and are intended to be used for communication
with other agents.
More precisely, for private memory operations to be
<<memory-model-location-ordered,Location-Ordered>> between distinct agents
requires using system-synchronizes-with rather than shader-based
synchronization.
Non-private memory operations still obey program-order.
Atomic operations are always considered non-private.
[[memory-model-inter-thread-happens-before]]
== Inter-Thread-Happens-Before
Let SC be a non-empty set of storage class semantics.
Then (using template syntax) operation A _inter-thread-happens-before_<SC>
operation B if and only if any of the following is true:
* A system-synchronizes-with B
* A synchronizes-with B, and both A and B have all of SC in their
semantics
* A is an operation on memory in a storage class in SC or that has all of
SC in its semantics, B is a release barrier or release atomic with all
of SC in its semantics, and A is program-ordered before B
* A is an acquire barrier or acquire atomic with all of SC in its
semantics, B is an operation on memory in a storage class in SC or that
has all of SC in its semantics, and A is program-ordered before B
* A and B are both host operations and A inter-thread-happens-before B as
defined in the host language spec
* A inter-thread-happens-before<SC> some X and X
inter-thread-happens-before<SC> B
[[memory-model-happens-before]]
== Happens-Before
Operation A _happens-before_ operation B if and only if any of the following
is true:
* A is program-ordered before B
* A inter-thread-happens-before<SC> B for some set of storage classes SC
_Happens-after_ is defined similarly.
NOTE: Unlike C++, happens-before is not always sufficient for a write to be
visible to a read.
Additional <<memory-model-availability-visibility,availability and
visibility>> operations may: be required for writes to be
<<memory-model-visible-to,visible-to>> other memory accesses.
NOTE: Happens-before is not transitive, but each of program-order and
inter-thread-happens-before<SC> are transitive.
These can be thought of as covering the "single-threaded" case and the
"multi-threaded" case, and it's not necessary (and not valid) to form chains
between the two.
[[memory-model-availability-visibility]]
== Availability and Visibility
_Availability_ and _visibility_ are states of a write operation, which
(informally) track how far the write has permeated the system, i.e. which
agents and references are able to observe the write.
Availability state is per _memory domain_.
Visibility state is per (agent,reference) pair.
Availability and visibility states are per-memory location for each write.
Memory domains are named according to the agents whose memory accesses use
the domain.
Domains used by shader invocations are organized hierarchically into
multiple smaller memory domains which correspond to the different
<<memory-model-scope, scopes>>.
The memory domains defined in Vulkan include:
* _host_ - accessible by host agents
* _device_ - accessible by all device agents for a particular device
* _shader_ - accessible by shader agents for a particular device,
corresponding to the code:Device scope
* _queue family instance_ - accessible by shader agents in a single queue
family, corresponding to the code:QueueFamilyKHR scope.
* _workgroup instance_ - accessible by shader agents in the same
workgroup, corresponding to the code:Workgroup scope.
* _subgroup instance_ - accessible by shader agents in the same subgroup,
corresponding to the code:Subgroup scope.
NOTE: These do not correspond to storage classes or device-local and
host-local VkDeviceMemory allocations, rather they indicate whether a write
can be made visible only to agents in the same subgroup, same workgroup, in
any shader invocation, or anywhere on the device, or host.
The shader, queue family instance, workgroup instance, and subgroup instance
domains are only used for shader-based availability/visibility operatons, in
other cases writes can be made available from/visible to the shader via the
device domain.
_Availability operations_, _visibility operations_, and _memory domain
operations_ alter the state of the write operations that happen-before them,
and which are included in their _source scope_ to be available or visible to
their _destination scope_.
* For an availability operation, the source scope is a set of
(agent,reference,memory location) tuples, and the destination scope is a
set of memory domains.
* For a memory domain operation, the source scope is a memory domain and
the destination scope is a memory domain.
* For a visibility operation, the source scope is a set of memory domains
and the destination scope is a set of (agent,reference,memory location)
tuples.
How the scopes are determined depends on the specific operation.
Availability and memory domain operations expand the set of memory domains
to which the write is available.
Visibility operations expand the set of (agent,reference,memory location)
tuples to which the write is visible.
Recall that availability and visibility states are per-memory location, and
let W be a write operation to one or more locations performed by agent A via
reference R. Let L be one of the locations written.
(W,L) (the write W to L), is initially not available to any memory domain
and only visible to (A,R,L).
An availability operation AV that happens-after W and that includes (A,R,L)
in its source scope makes (W,L) _available_ to the memory domains in its
destination scope.
A memory domain operation DOM that happens-after AV and for which (W,L) is
available in the source scope makes (W,L) available in the destination
memory domain.
A visibility operation VIS that happens-after AV (or DOM) and for which
(W,L) is available in any domain in the source scope makes (W,L) _visible_
to all (agent,reference,L) tuples included in its destination scope.
If write W~2~ happens-after W, and their sets of memory locations overlap,
then W will not be available/visible to all agents/references for those
memory locations that overlap (and future AV/DOM/VIS ops can't revive W's
write to those locations).
Availability, memory domain, and visibility operations are treated like
other non-atomic memory accesses for the purpose of
<<memory-model-memory-semantics,memory semantics>>, meaning they can be
ordered by release-acquire sequences or memory barriers.
[[memory-model-vulkan-availability-visibility]]
== Availability, Visibility, and Domain Operations
The following operations generate availability, visibility, and domain
operations.
When multiple availability/visibility/domain operations are described, they
are system-synchronized-with each other in the order listed.
An operation that performs a <<synchronization-dependencies-memory,memory
dependency>> generates:
* If the source access mask includes ename:VK_ACCESS_HOST_WRITE_BIT, then
the dependency includes a memory domain operation from host domain to
device domain.
* An availability operation with source scope of all writes in the first
<<synchronization-dependencies-access-scopes,access scope>> of the
dependency and a destination scope of the device domain.
* A visibility operation with source scope of the device domain and
destination scope of the second access scope of the dependency.
* If the destination access mask includes ename:VK_ACCESS_HOST_READ_BIT or
ename:VK_ACCESS_HOST_WRITE_BIT, then the dependency includes a memory
domain operation from device domain to host domain.
flink:vkFlushMappedMemoryRanges performs an availability operation, with a
source scope of (agents,references) = (all host threads, all mapped memory
ranges passed to the command), and destination scope of the host domain.
flink:vkInvalidateMappedMemoryRanges performs a visibility operation, with a
source scope of the host domain and a destination scope of
(agents,references) = (all host threads, all mapped memory ranges passed to
the command).
flink:vkQueueSubmit performs a memory domain operation from host to device,
and a visibility operation with source scope of the device domain and
destination scope of all agents and references on the device.
[[memory-model-availability-visibility-semantics]]
== Availability and Visibility Semantics
A memory barrier or atomic operation via agent A that includes MakeAvailable
in its semantics performs an availability operation whose source scope
includes agent A and all references in the storage classes in that
instruction's storage class semantics, and all memory locations, and whose
destination scope is a set of memory domains selected as specified below.
The implicit availability operation is program-ordered between the barrier
or atomic and all other operations program-ordered before the write.
A memory barrier or atomic operation via agent A that includes MakeVisible
in its semantics performs a visibility operation whose source scope is a set
of memory domains selected as specified below, and whose destination scope
includes agent A and all references in the storage classes in that
instruction's storage class semantics, and all memory locations.
The implicit visibility operation is program-ordered between the barrier or
atomic and all other operations program-ordered after the write.
The memory domains are selected based on the memory scope of the instruction
as follows:
* code:Device scope uses the shader domain
* code:QueueFamilyKHR scope uses the queue family instance domain
* code:Workgroup scope uses the workgroup instance domain
* code:Subgroup uses the subgroup instance domain
* code:Invocation perform no availability/visibility operations.
When an availability operation performed by an agent A includes a memory
domain D in its destination scope, where D corresponds to scope instance S,
it also includes the memory domains that correspond to each smaller scope
instance S' that is a subset of S and that includes A. Similarly for
visibility operations.
[[memory-model-instruction-av-vis]]
== Per-Instruction Availability and Visibility Semantics
A memory write instruction that includes MakePointerAvailable, or an image
write instruction that includes MakeTexelAvailable, performs an availability
operation whose source scope includes the agent and reference used to
perform the write and the memory locations written by the instruction, and
whose destination scope is a set of memory domains selected by the Scope
operand specified in <<memory-model-availability-visibility-semantics,
Availability and Visibility Semantics>>.
The implicit availability operation is program-ordered between the write and
all other operations program-ordered after the write.
A memory read instruction that includes MakePointerVisible, or an image read
instruction that includes MakeTexelVisible, performs a visibility operation
whose source scope is a set of memory domains selected by the Scope operand
as specified in <<memory-model-availability-visibility-semantics,
Availability and Visibility Semantics>>, and whose destination scope
includes the agent and reference used to perform the read and the memory
locations read by the instruction.
The implicit visibility operation is program-ordered between read and all
other operations program-ordered before the read.
NOTE: Although reads with per-instruction visibility only perform visibility
ops from the shader or workgroup instance or subgroup instance domain, they
will also see writes that were made visible via the device domain, i.e.
those writes previously performed by non-shader agents and made visible via
API commands.
NOTE: It is expected that all invocations in a subgroup execute on the same
processor with the same path to memory, and thus availability and visibility
operations with subgroup scope can be expected to be "free".
[[memory-model-location-ordered]]
== Location-Ordered
Let X and Y be memory accesses to overlapping sets of memory locations M,
where X != Y. Let (A~X~,R~X~) be the agent and reference used for X, and
(A~Y~,R~Y~) be the agent and reference used for Y. For now, let "->" denote
happens-before and "->^rcpo^" denote the reflexive closure of
program-ordered before.
If D~1~ and D~2~ are different memory domains, then let DOM(D~1~,D~2~) be a
memory domain operation from D~1~ to D~2~.
Otherwise, let DOM(D,D) be a placeholder such that X->DOM(D,D)->Y if and
only if X->Y.
X is _location-ordered_ before Y for a location L in M if and only if any of
the following is true:
* A~X~ == A~Y~ and R~X~ == R~Y~ and X->Y
** NOTE: this case means no availability/visibility ops required when it's
the same (agent,reference).
* X and Y are mutually-ordered atomics, and X is before Y in X's scoped
modification order
* X is a read, both X and Y are non-private, and X->Y
* X is a read, and X (transitively) system-synchronizes with Y
* If R~X~ == R~Y~ and A~X~ and A~Y~ access a common memory domain D (e.g.
are in the same workgroup instance if D is the workgroup instance
domain), and both X and Y are non-private:
** X is a write, Y is a write, AV(A~X~,R~X~,D,L) is an availability
operation making (X,L) available to domain D, and
X->^rcpo^AV(A~X~,R~X~,D,L)->Y
** X is a write, Y is a read, AV(A~X~,R~X~,D,L) is an availability
operation making (X,L) available to domain D, VIS(A~Y~,R~Y~,D,L) is a
visibility operation making writes to L available in domain D visible
to Y, and X->^rcpo^AV(A~X~,R~X~,D,L)->VIS(A~Y~,R~Y~,D,L)->^rcpo^Y
* Let D~X~ and D~Y~ each be either the device domain or the host domain,
depending on whether A~X~ and A~Y~ execute on the device or host:
** X is a write and Y is a write, and
X->AV(A~X~,R~X~,D~X~,L)->DOM(D~X~,D~Y~)->Y
** X is a write and Y is a read, and
X->AV(A~X~,R~X~,D~X~,L)->DOM(D~X~,D~Y~)->VIS(A~Y~,R~Y~,D~Y~,L)->Y
NOTE: The final bullet (synchronization through device/host domain) requires
API-level synchronization operations, since the device/host domains are not
accessible via shader instructions.
And "device domain" is not to be confused with "device scope", which
synchronizes through the "shader domain".
[[memory-model-access-data-race]]
== Data Race
Let X and Y be operations that access overlapping sets of memory locations
M, where X != Y, and at least one of X and Y is a write, and X and Y are not
mutually-ordered atomic operations.
If there does not exist a location-ordered relation between X and Y for each
location in M, then there is a _data race_.
Applications must: ensure that no data races occur during the execution of
their application.
NOTE: Data races can only occur due to instructions that are actually
executed, and for example an instruction skipped due to flow control must
not contribute to a data race.
[[memory-model-visible-to]]
== Visible-To
Let X be a write and Y be a read whose sets of memory locations overlap, and
let M be the set of memory locations that overlap.
Let M~2~ be a non-empty subset of M. Then X is _visible-to_ Y for memory
locations M~2~ if and only if all of the following are true:
* X is location-ordered before Y for each location L in M~2~.
* There does not exist another write Z to any location L in M~2~ such that
X is location-ordered before Z for location L and Z is location-ordered
before Y for location L.
If X is visible-to Y, then Y reads the value written by X for locations
M~2~.
NOTE: It is possible for there to be a write between X and Y that overwrites
a subset of the memory locations, but the remaining memory locations (M~2~)
will still be visible-to Y.
[[memory-model-scoped-modification-order-coherence]]
== Scoped Modification Order Coherence
Let A and B be mutually-ordered atomic operations, where A happens-before B,
and let O be A's scoped modification order.
Then:
* If A and B are both writes, then A must: be earlier than B in O
* If A and B are both reads, then the write that A takes its value from
must: be earlier in O than (or the same as) the write that B takes its
value from
* If A is a write and B is a read, then B must: take its value from A or a
write later than A in O
* If A is a read and B is a write, then A must: take its value from a
write earlier than B in O
[[memory-model-shader-io]]
== Shader I/O
If a shader invocation A in a shader stage other than code:Vertex performs a
memory read operation X from an object in the code:Input storage class, then
X is system-synchronized-after all writes to the corresponding code:Output
storage variable(s) in the upstream shader invocation(s) that contribute to
generating invocation A, and those writes are all visible-to X.
NOTE: It is not necessary for the upstream shader invocations to have
completed execution, they only need to have generated the output that is
being read.
[[memory-model-deallocation]]
== Deallocation
A call to vkFreeMemory must: happen-after all memory operations on all
memory locations in that VkDeviceMemory object.
NOTE: Normally, device memory operations in a given queue are synchronized
with vkFreeMemory by having a host thread wait on a fence signalled by that
queue, and the wait happens-before the call to vkFreeMemory on the host.
The deallocation of SPIR-V variables is managed by the system and
happens-after all operations on those variables.
[[memory-model-informative-descriptions]]
== Informative Descriptions
This subsection is non-normative, and offers more easily understandable
consequences of the memory model for app/compiler developers.
Let SC be the storage class(es) specified by a release or acquire operation
or barrier.
* An atomic write with release semantics must not be reordered against any
read or write to SC that is program-ordered before it (regardless of the
storage class the atomic is in).
* An atomic read with acquire semantics must not be reordered against any
read or write to SC that is program-ordered after it (regardless of the
storage class the atomic is in).
* Any write to SC program-ordered after a release barrier must not be
reordered against any read or write to SC program-ordered before that
barrier.
* Any read from SC program-ordered before an acquire barrier must not be
reordered against any read or write to SC program-ordered after the
barrier.
A control barrier (even if it has no memory semantics) must not be reordered
against any memory barriers.
This memory model allows memory accesses with and without availability and
visibility operations, as well as atomic operations, all to be performed on
the same memory location.
This is critical to allow it to reason about memory that is reused in
multiple ways, e.g. across the lifetime of different shader invocations or
draw calls.
While GLSL (and legacy SPIR-V) applies the "coherent" decoration to
variables (for historical reasons), this model treats each memory access
instruction as having optional implicit availability/visibility operations.
GLSL to SPIR-V compilers should map all (non-atomic) operations on a
coherent variable to Make{Pointer,Texel}{Available}{Visible} flags in this
model.
Atomic operations implicitly have availability/visibility operations, and
the scope of those operations is taken from the atomic operation's scope.
[[memory-model-tessellation-output-ordering]]
== Tessellation Output Ordering
For SPIR-V that uses the Vulkan Memory Model, the code:OutputMemory storage
class is used to synchronize accesses to tessellation control output
variables.
For legacy SPIR-V that does not enable the Vulkan Memory Model via
code:OpMemoryModel, tessellation outputs can be ordered using a control
barrier with no particular memory scope or semantics, as defined below.
Let X and Y be memory operations performed by shader invocations A~X~ and
A~Y~.
Operation X is _tessellation-output-ordered_ before operation Y if and only
if all of the following are true:
* There is a dynamic instance of an code:OpControlBarrier instruction C
such that X is program-ordered before C in A~X~ and C is program-ordered
before Y in A~Y~.
* A~X~ and A~Y~ are in the same instance of C's execution scope.
If shader invocations A~X~ and A~Y~ in the code:TessellationControl
execution model execute memory operations X and Y, respectively, on the
code:Output storage class, and X is tessellation-output-ordered before Y
with a scope of code:Workgroup, then X is location-ordered before Y, and if
X is a write and Y is a read then X is visible-to Y.

View File

@ -206,6 +206,11 @@ ifdef::VK_KHR_8bit_storage[]
| code:UniformAndStorageBuffer8BitAccess | <<features-features-uniformAndStorageBuffer8BitAccess,UniformAndStorageBuffer8BitAccess>>
| code:StoragePushConstant8 | <<features-features-storagePushConstant8,StoragePushConstant8>>
endif::VK_KHR_8bit_storage[]
ifdef::VK_KHR_vulkan_memory_model[]
[[spirvenv-capabilities-table-memorymodel]]
| code:VulkanMemoryModelKHR | <<features-features-vulkanMemoryModel,vulkanMemoryModel>>
| code:VulkanMemoryModelDeviceScopeKHR | <<features-features-vulkanMemoryModel,vulkanMemoryModelDeviceScope>>
endif::VK_KHR_vulkan_memory_model[]
|====
ifdef::VK_VERSION_1_1,VK_KHR_variable_pointers[]
@ -332,6 +337,11 @@ The application can: pass a SPIR-V module to flink:vkCreateShaderModule that
uses the +SPV_EXT_descriptor_indexing+ SPIR-V extension.
endif::VK_EXT_descriptor_indexing[]
ifdef::VK_KHR_vulkan_memory_model[]
The application can: pass a SPIR-V module to flink:vkCreateShaderModule that
uses the `SPV_KHR_vulkan_memory_model` SPIR-V extension.
endif::VK_KHR_vulkan_memory_model[]
The application must: not pass a SPIR-V module containing any of the
following to flink:vkCreateShaderModule:
@ -356,6 +366,23 @@ following rules:
** *Subgroup*
* *Scope* for memory must: be limited to:
** *Device*
ifdef::VK_KHR_vulkan_memory_model[]
*** If <<features-features-vulkanMemoryModel,pname:vulkanMemoryModel>> is
enabled and
<<features-features-vulkanMemoryModelDeviceScope,pname:vulkanMemoryModelDeviceScope>>
is not enabled, *Device* scope must: not be used.
*** If <<features-features-vulkanMemoryModel,pname:vulkanMemoryModel>> is
not enabled, *Device* scope only extends to the queue family, not the
whole device.
endif::VK_KHR_vulkan_memory_model[]
ifndef::VK_KHR_vulkan_memory_model[]
*** *Device* scope only extends to the queue family, not the whole device.
endif::VK_KHR_vulkan_memory_model[]
ifdef::VK_KHR_vulkan_memory_model[]
** *QueueFamilyKHR*
*** If <<features-features-vulkanMemoryModel,pname:vulkanMemoryModel>> is
not enabled, *QueueFamilyKHR* must: not be used.
endif::VK_KHR_vulkan_memory_model[]
** *Workgroup*
ifdef::VK_VERSION_1_1[]
** *Subgroup*

View File

@ -1023,7 +1023,7 @@ See <<devsandqueues-lost-device,Lost Device>>.
Each element of the pname:pCommandBuffers member of each element of
pname:pSubmits must: have been allocated from a sname:VkCommandPool that
was created for the same queue family pname:queue belongs to.
* [[VUID-vkQueueSubmit-pCommandBuffers]]
* [[VUID-vkQueueSubmit-pSubmits-02207]]
If any element of pname:pSubmits->pname:pCommandBuffers includes a
<<synchronization-queue-transfers-acquire, Queue Family Transfer Acquire
Operation>>, there must: exist a previously submitted

View File

@ -267,6 +267,30 @@ to a <<descriptorsets-binding-dynamicoffsets, dynamic offset>> when binding
the descriptor set.
ifdef::VK_EXT_inline_uniform_block[]
[[descriptorsets-inlineuniformblock]]
=== Inline Uniform Block
An _inline uniform block_
(ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) is almost identical to a
<<descriptorsets-uniformbuffer, uniform buffer>>, and differs only in taking
its storage directly from the encompassing descriptor set instead of being
backed by buffer memory.
It is typically used to access a small set of constant data that does not
require the additional flexibility provided by the indirection enabled when
using a uniform buffer where the descriptor and the referenced buffer memory
are decoupled.
Compared to push constants, they allow reusing the same set of constant data
across multiple disjoint sets of draw and dispatch commands.
Inline uniform block descriptors cannot: be aggregated into arrays.
Instead, the array size specified for an inline uniform block descriptor
binding specifies the binding's capacity in bytes.
endif::VK_EXT_inline_uniform_block[]
[[descriptorsets-inputattachment]]
=== Input Attachment
@ -380,6 +404,13 @@ ifdef::VK_KHR_push_descriptor[]
elements of pname:pBindings must: not have a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or
ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkDescriptorSetLayoutCreateInfo-flags-02208]]
If pname:flags contains
ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all
elements of pname:pBindings must: not have a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
endif::VK_EXT_inline_uniform_block[]
* [[VUID-VkDescriptorSetLayoutCreateInfo-flags-00281]]
If pname:flags contains
ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then the
@ -460,7 +491,13 @@ include::../api/structs/VkDescriptorSetLayoutBinding.txt[]
* pname:descriptorType is a elink:VkDescriptorType specifying which type
of resource descriptors are used for this binding.
* pname:descriptorCount is the number of descriptors contained in the
binding, accessed in a shader as an array.
binding, accessed in a shader as an array
ifdef::VK_EXT_inline_uniform_block[]
, except if pname:descriptorType is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT in which case
pname:descriptorCount is the size in bytes of the inline uniform block
endif::VK_EXT_inline_uniform_block[]
.
If pname:descriptorCount is zero this binding entry is reserved and the
resource must: not be accessed from any stage via this binding within
any pipeline using the set layout.
@ -523,6 +560,17 @@ avoid wasted memory.
pname:descriptorCount is not `0` and pname:pImmutableSamplers is not
`NULL`, pname:pImmutableSamplers must: be a valid pointer to an array of
pname:descriptorCount valid sname:VkSampler handles
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkDescriptorSetLayoutBinding-descriptorType-02209]]
If pname:descriptorType is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:descriptorCount must: be a multiple of `4`
* [[VUID-VkDescriptorSetLayoutBinding-descriptorType-02210]]
If pname:descriptorType is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:descriptorCount must: be less than or equal to
sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxInlineUniformBlockSize
endif::VK_EXT_inline_uniform_block[]
* [[VUID-VkDescriptorSetLayoutBinding-descriptorCount-00283]]
If pname:descriptorCount is not `0`, pname:stageFlags must: be a valid
combination of elink:VkShaderStageFlagBits values
@ -621,6 +669,14 @@ endif::VK_KHR_push_descriptor[]
is not enabled, all bindings with descriptor type
ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER must: not use
ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingInlineUniformBlockUpdateAfterBind-02211]]
If
slink:VkPhysicalDeviceInlineUniformBlockFeatureEXT::pname:descriptorBindingInlineUniformBlockUpdateAfterBind
is not enabled, all bindings with descriptor type
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT must: not use
ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT
endif::VK_EXT_inline_uniform_block[]
* [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-None-03011]]
All bindings with descriptor type
ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
@ -702,7 +758,16 @@ endif::VK_KHR_descriptor_update_template[]
layout (i.e. the binding with the largest value of pname:binding).
For the purposes of counting against limits such as
pname:maxDescriptorSet* and pname:maxPerStageDescriptor*, the full value
of pname:descriptorCount is counted.
of pname:descriptorCount is counted
ifdef::VK_EXT_inline_uniform_block[]
, except for descriptor bindings with a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT where
pname:descriptorCount specifies the upper bound on the byte size of the
binding, thus it counts against the
<<features-limits-maxInlineUniformBlockSize,
pname:maxInlineUniformBlockSize>> limit instead.
endif::VK_EXT_inline_uniform_block[]
.
[NOTE]
.Note
@ -822,6 +887,12 @@ include::../api/structs/VkDescriptorSetVariableDescriptorCountLayoutSupportEXT.t
* pname:maxVariableDescriptorCount indicates the maximum number of
descriptors supported in the highest numbered binding of the layout, if
that binding is variable-sized.
ifdef::VK_EXT_inline_uniform_block[]
If the highest numbered binding of the layout has a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:maxVariableDescriptorCount indicates the maximum byte size
supported for the binding, if that binding is variable-sized.
endif::VK_EXT_inline_uniform_block[]
If the create info includes a variable-sized descriptor, then
pname:supported is determined assuming the requested size of the
@ -1133,6 +1204,14 @@ ifndef::VK_EXT_descriptor_indexing[]
stage across all elements of pname:pSetLayouts must: be less than or
equal to
sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorInputAttachments
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02212]]
The total number of bindings with a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any
given shader stage across all elements of pname:pSetLayouts must: be
less than or equal to
sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxPerStageDescriptorInlineUniformBlocks
endif::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677]]
The total number of descriptors of the type
ename:VK_DESCRIPTOR_TYPE_SAMPLER and
@ -1185,6 +1264,14 @@ ifndef::VK_EXT_descriptor_indexing[]
stages and across all elements of pname:pSetLayouts must: be less than
or equal to
sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetInputAttachments
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02213]]
The total number of bindings with a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all
shader stages and across all elements of pname:pSetLayouts must: be less
than or equal to
sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxDescriptorSetInlineUniformBlocks
endif::VK_EXT_inline_uniform_block[]
endif::VK_EXT_descriptor_indexing[]
ifdef::VK_EXT_descriptor_indexing[]
* [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03016]]
@ -1246,6 +1333,16 @@ ifdef::VK_EXT_descriptor_indexing[]
stage across all elements of pname:pSetLayouts must: be less than or
equal to
sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorInputAttachments
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02214]]
The total number of bindings in descriptor set layouts created without
the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT
bit set with a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any
given shader stage across all elements of pname:pSetLayouts must: be
less than or equal to
sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxPerStageDescriptorInlineUniformBlocks
endif::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03022]]
The total number of descriptors with a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_SAMPLER and
@ -1288,6 +1385,14 @@ ifdef::VK_EXT_descriptor_indexing[]
stage across all elements of pname:pSetLayouts must: be less than or
equal to
sname:VkPhysicalDeviceDescriptorIndexingPropertiesEXT::pname:maxPerStageDescriptorUpdateAfterBindInputAttachments
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02215]]
The total number of bindings with a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any
given shader stage across all elements of pname:pSetLayouts must: be
less than or equal to
sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks
endif::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03028]]
The total number of descriptors in descriptor set layouts created
without the
@ -1363,6 +1468,16 @@ ifdef::VK_EXT_descriptor_indexing[]
stages and across all elements of pname:pSetLayouts must: be less than
or equal to
sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetInputAttachments
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02216]]
The total number of bindings in descriptor set layouts created without
the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT
bit set with a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all
shader stages and across all elements of pname:pSetLayouts must: be less
than or equal to
sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxDescriptorSetInlineUniformBlocks
endif::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036]]
The total number of descriptors of the type
ename:VK_DESCRIPTOR_TYPE_SAMPLER and
@ -1415,6 +1530,14 @@ ifdef::VK_EXT_descriptor_indexing[]
stages and across all elements of pname:pSetLayouts must: be less than
or equal to
sname:VkPhysicalDeviceDescriptorIndexingPropertiesEXT::pname:maxDescriptorSetUpdateAfterBindInputAttachments
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02217]]
The total number of bindings with a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all
shader stages and across all elements of pname:pSetLayouts must: be less
than or equal to
sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks
endif::VK_EXT_inline_uniform_block[]
endif::VK_EXT_descriptor_indexing[]
* [[VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292]]
Any two elements of pname:pPushConstantRanges must: not include the same
@ -1566,6 +1689,13 @@ ifdef::VK_EXT_descriptor_indexing[]
or pname:maxDescriptorSetUpdateAfterBindInputAttachments
endif::VK_EXT_descriptor_indexing[]
| input attachment
ifdef::VK_EXT_inline_uniform_block[]
| pname:maxDescriptorSetInlineUniformBlocks
ifdef::VK_EXT_descriptor_indexing[]
or pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks
endif::VK_EXT_descriptor_indexing[]
| inline uniform block
endif::VK_EXT_inline_uniform_block[]
|====
@ -1803,6 +1933,37 @@ endif::VK_EXT_descriptor_indexing[]
include::../validity/structs/VkDescriptorPoolCreateInfo.txt[]
--
ifdef::VK_EXT_inline_uniform_block[]
[open,refpage='VkDescriptorPoolInlineUniformBlockCreateInfoEXT',desc='Structure specifying the maximum number of inline uniform block bindings of a newly created descriptor pool',type='structs']
--
In order to be able to allocate descriptor sets having
<<descriptorsets-inlineuniformblock, inline uniform block>> bindings the
descriptor pool must: be created with specifying the inline uniform block
binding capacity of the descriptor pool, in addition to the total inline
uniform data capacity in bytes which is specified through an instance of the
slink:VkDescriptorPoolSize structure with a pname:descriptorType value of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT.
This can: be done by chaining an instance of the
sname:VkDescriptorPoolInlineUniformBlockCreateInfoEXT structure to the
pname:pNext chain of sname:VkDescriptorPoolCreateInfo.
The sname:VkDescriptorPoolInlineUniformBlockCreateInfoEXT structure is
defined as:
include::../api/structs/VkDescriptorPoolInlineUniformBlockCreateInfoEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* pname:maxInlineUniformBlockBindings is the number of inline uniform
block bindings to allocate.
include::../validity/structs/VkDescriptorPoolInlineUniformBlockCreateInfoEXT.txt[]
--
endif::VK_EXT_inline_uniform_block[]
[open,refpage='VkDescriptorPoolCreateFlagBits',desc='Bitmask specifying certain supported operations on a descriptor pool',type='enums']
--
@ -1849,11 +2010,21 @@ include::../api/structs/VkDescriptorPoolSize.txt[]
* pname:type is the type of descriptor.
* pname:descriptorCount is the number of descriptors of that type to
allocate.
ifdef::VK_EXT_inline_uniform_block[]
If pname:type is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:descriptorCount is the number of bytes to allocate for descriptors
of this type.
endif::VK_EXT_inline_uniform_block[]
.Valid Usage
****
* [[VUID-VkDescriptorPoolSize-descriptorCount-00302]]
pname:descriptorCount must: be greater than `0`
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkDescriptorPoolSize-type-02218]]
If pname:type is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:descriptorCount must: be a multiple of `4`
endif::VK_EXT_inline_uniform_block[]
****
include::../validity/structs/VkDescriptorPoolSize.txt[]
@ -1954,6 +2125,15 @@ fname:vkAllocateDescriptorSets would cause the number of any given
descriptor type to exceed the sum of all the pname:descriptorCount members
of each element of slink:VkDescriptorPoolCreateInfo::pname:pPoolSizes with a
pname:member equal to that type.
ifdef::VK_EXT_inline_uniform_block[]
Additionally, the allocation may: also fail if a call to
fname:vkAllocateDescriptorSets would cause the total number of inline
uniform block bindings allocated from the pool to exceed the value of
slink:VkDescriptorPoolInlineUniformBlockCreateInfoEXT::pname:maxInlineUniformBlockBindings
used to create the descriptor pool.
endif::VK_EXT_inline_uniform_block[]
If the allocation fails due to no more space in the descriptor pool, and not
because of system or device memory exhaustion, then
ename:VK_ERROR_OUT_OF_POOL_MEMORY must: be returned.
@ -2075,6 +2255,12 @@ pname:pNext chain, then the variable lengths are considered to be zero.
Otherwise, pname:pDescriptorCounts[i] is the number of descriptors in the
variable count descriptor binding in the corresponding descriptor set
layout.
ifdef::VK_EXT_inline_uniform_block[]
If the variable count descriptor binding in the corresponding descriptor set
layout has a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:pDescriptorCounts[i] specifies the binding's capacity in bytes.
endif::VK_EXT_inline_uniform_block[]
If slink:VkDescriptorSetAllocateInfo::pname:pSetLayouts[i] does not include
a variable count descriptor binding, then pname:pDescriptorCounts[i] is
ignored.
@ -2250,9 +2436,27 @@ include::../api/structs/VkWriteDescriptorSet.txt[]
* pname:dstSet is the destination descriptor set to update.
* pname:dstBinding is the descriptor binding within that set.
* pname:dstArrayElement is the starting element in that array.
ifdef::VK_EXT_inline_uniform_block[]
If the descriptor binding identified by pname:dstSet and
pname:dstBinding has a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:dstArrayElement specifies the starting byte offset within the
binding.
endif::VK_EXT_inline_uniform_block[]
* pname:descriptorCount is the number of descriptors to update (the number
of elements in pname:pImageInfo, pname:pBufferInfo, or
pname:pTexelBufferView).
pname:pTexelBufferView
ifdef::VK_EXT_inline_uniform_block[]
, or a value matching the pname:dataSize member of an instance of
slink:VkWriteDescriptorSetInlineUniformBlockEXT in the pname:pNext chain
endif::VK_EXT_inline_uniform_block[]
).
ifdef::VK_EXT_inline_uniform_block[]
If the descriptor binding identified by pname:dstSet and
pname:dstBinding has a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:descriptorCount specifies the number of bytes to update.
endif::VK_EXT_inline_uniform_block[]
* pname:descriptorType is a elink:VkDescriptorType specifying the type of
each descriptor in pname:pImageInfo, pname:pBufferInfo, or
pname:pTexelBufferView, as described below.
@ -2271,7 +2475,15 @@ include::../api/structs/VkWriteDescriptorSet.txt[]
Only one of pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView
members is used according to the descriptor type specified in the
pname:descriptorType member of the containing sname:VkWriteDescriptorSet
structure, as specified below.
structure,
ifdef::VK_EXT_inline_uniform_block[]
or none of them in case pname:descriptorType is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, in which case the source
data for the descriptor writes is taken from the instance of
slink:VkWriteDescriptorSetInlineUniformBlockEXT in the pname:pNext chain of
sname:VkWriteDescriptorSet,
endif::VK_EXT_inline_uniform_block[]
as specified below.
[[descriptorsets-updates-consecutive, consecutive binding updates]]
If the pname:dstBinding has fewer than pname:descriptorCount array elements
@ -2282,6 +2494,22 @@ If a binding has a pname:descriptorCount of zero, it is skipped.
This behavior applies recursively, with the update affecting consecutive
bindings as needed to update all pname:descriptorCount descriptors.
ifdef::VK_EXT_inline_uniform_block[]
[NOTE]
.Note
====
The same behavior applies to bindings with a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK where pname:descriptorCount
specifies the number of bytes to update while pname:dstArrayElement
specifies the starting byte offset, thus in this case if the
pname:dstBinding has a smaller byte size than the sum of
pname:dstArrayElement and pname:descriptorCount, then the remainder will be
used to update the subsequent binding - [eq]#pname:dstBinding+1# starting at
offset zero.
This falls out as a special case of the above rule.
====
endif::VK_EXT_inline_uniform_block[]
.Valid Usage
****
* [[VUID-VkWriteDescriptorSet-dstBinding-00315]]
@ -2309,6 +2537,16 @@ bindings as needed to update all pname:descriptorCount descriptors.
than or equal to the number of array elements in the descriptor set
binding specified by pname:dstBinding, and all applicable consecutive
bindings, as described by <<descriptorsets-updates-consecutive>>
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkWriteDescriptorSet-descriptorType-02219]]
If pname:descriptorType is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:dstArrayElement
must: be an integer multiple of `4`
* [[VUID-VkWriteDescriptorSet-descriptorType-02220]]
If pname:descriptorType is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:descriptorCount
must: be an integer multiple of `4`
endif::VK_EXT_inline_uniform_block[]
* [[VUID-VkWriteDescriptorSet-descriptorType-00322]]
If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLER,
ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
@ -2343,6 +2581,13 @@ bindings as needed to update all pname:descriptorCount descriptors.
ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the pname:imageView and
pname:imageLayout members of each element of pname:pImageInfo must: be a
valid sname:VkImageView and elink:VkImageLayout, respectively
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkWriteDescriptorSet-descriptorType-02221]]
If pname:descriptorType is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, the pname:pNext chain
must: include a slink:VkWriteDescriptorSetInlineUniformBlockEXT
structure whose pname:dataSize member equals pname:descriptorCount
endif::VK_EXT_inline_uniform_block[]
ifdef::VULKAN_1_1,VK_KHR_sampler_ycbcr_conversion[]
* [[VUID-VkWriteDescriptorSet-descriptorType-01946]]
If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, then
@ -2491,8 +2736,12 @@ include::../api/enums/VkDescriptorType.txt[]
* ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC specifies a
<<descriptorsets-storagebufferdynamic, dynamic storage buffer
descriptor>>.
* ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT specifies a
* ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT specifies an
<<descriptorsets-inputattachment, input attachment descriptor>>.
ifdef::VK_EXT_inline_uniform_block[]
* ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT specifies an
<<descriptorsets-inlineuniformblock, inline uniform block>>.
endif::VK_EXT_inline_uniform_block[]
When a descriptor set is updated via elements of slink:VkWriteDescriptorSet,
members of pname:pImageInfo, pname:pBufferInfo and pname:pTexelBufferView
@ -2500,7 +2749,7 @@ are only accessed by the implementation when they correspond to descriptor
type being defined - otherwise they are ignored.
The members accessed are as follows for each descriptor type:
* For ename:VK_DESCRIPTOR_TYPE_SAMPLER, only the pname:sample member of
* For ename:VK_DESCRIPTOR_TYPE_SAMPLER, only the pname:sampler member of
each element of slink:VkWriteDescriptorSet::pname:pImageInfo is
accessed.
* For ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
@ -2518,6 +2767,15 @@ The members accessed are as follows for each descriptor type:
* For ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or
ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, each element of
slink:VkWriteDescriptorSet::pname:pTexelBufferView is accessed.
ifdef::VK_EXT_inline_uniform_block[]
When updating descriptors with a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, none of the
pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView members are
accessed, instead the source data of the descriptor update operation is
taken from the instance of slink:VkWriteDescriptorSetInlineUniformBlockEXT
in the pname:pNext chain of sname:VkWriteDescriptorSet.
endif::VK_EXT_inline_uniform_block[]
--
[open,refpage='VkDescriptorBufferInfo',desc='Structure specifying descriptor buffer info',type='structs']
@ -2627,6 +2885,37 @@ endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
include::../validity/structs/VkDescriptorImageInfo.txt[]
--
ifdef::VK_EXT_inline_uniform_block[]
[open,refpage='VkWriteDescriptorSetInlineUniformBlockEXT',desc='Structure specifying inline uniform block data',type='structs']
--
If the pname:descriptorType member of slink:VkWriteDescriptorSet is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then the data to write to
the descriptor set is specified through an instance of
sname:VkWriteDescriptorSetInlineUniformBlockEXT chained to the pname:pNext
chain of sname:VkWriteDescriptorSet.
The sname:VkWriteDescriptorSetInlineUniformBlockEXT structure is defined as:
include::../api/structs/VkWriteDescriptorSetInlineUniformBlockEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* pname:dataSize is the number of bytes of inline uniform block data
pointed to by pname:pData.
* pname:pData is a pointer to pname:dataSize number of bytes of data to
write to the inline uniform block.
.Valid Usage
****
* [[VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-02222]]
pname:dataSize must: be an integer multiple of `4`
****
include::../validity/structs/VkWriteDescriptorSetInlineUniformBlockEXT.txt[]
--
endif::VK_EXT_inline_uniform_block[]
[open,refpage='VkCopyDescriptorSet',desc='Structure specifying a copy descriptor set operation',type='structs']
--
@ -2638,13 +2927,35 @@ include::../api/structs/VkCopyDescriptorSet.txt[]
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* pname:srcSet, pname:srcBinding, and pname:srcArrayElement are the source
set, binding, and array element, respectively.
ifdef::VK_EXT_inline_uniform_block[]
If the descriptor binding identified by pname:srcSet and
pname:srcBinding has a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:srcArrayElement specifies the starting byte offset within the
binding to copy from.
endif::VK_EXT_inline_uniform_block[]
* pname:dstSet, pname:dstBinding, and pname:dstArrayElement are the
destination set, binding, and array element, respectively.
ifdef::VK_EXT_inline_uniform_block[]
If the descriptor binding identified by pname:dstSet and
pname:dstBinding has a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:dstArrayElement specifies the starting byte offset within the
binding to copy to.
endif::VK_EXT_inline_uniform_block[]
* pname:descriptorCount is the number of descriptors to copy from the
source to destination.
If pname:descriptorCount is greater than the number of remaining array
elements in the source or destination binding, those affect consecutive
bindings in a manner similar to slink:VkWriteDescriptorSet above.
ifdef::VK_EXT_inline_uniform_block[]
If the descriptor binding identified by pname:srcSet and
pname:srcBinding has a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
pname:descriptorCount specifies the number of bytes to copy and the
remaining array elements in the source or destination binding refer to
the remaining number of bytes in those.
endif::VK_EXT_inline_uniform_block[]
.Valid Usage
****
@ -2667,6 +2978,21 @@ include::../api/structs/VkCopyDescriptorSet.txt[]
destination ranges of descriptors must: not overlap, where the ranges
may: include array elements from consecutive bindings as described by
<<descriptorsets-updates-consecutive>>
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkCopyDescriptorSet-srcBinding-02223]]
If the descriptor type of the descriptor set binding specified by
pname:srcBinding is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT,
pname:srcArrayElement must: be an integer multiple of `4`
* [[VUID-VkCopyDescriptorSet-dstBinding-02224]]
If the descriptor type of the descriptor set binding specified by
pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT,
pname:dstArrayElement must: be an integer multiple of `4`
* [[VUID-VkCopyDescriptorSet-srcBinding-02225]]
If the descriptor type of the descriptor set binding specified by either
pname:srcBinding or pname:dstBinding is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:descriptorCount
must: be an integer multiple of `4`
endif::VK_EXT_inline_uniform_block[]
ifdef::VK_EXT_descriptor_indexing[]
* [[VUID-VkCopyDescriptorSet-srcSet-01918]]
If pname:srcSet's layout was created with the
@ -2941,10 +3267,22 @@ endif::VK_KHR_descriptor_update_template[]
descriptor update template.
* pname:dstArrayElement is the starting element in the array belonging to
pname:dstBinding.
ifdef::VK_EXT_inline_uniform_block[]
If the descriptor binding identified by pname:srcBinding has a
descriptor type of ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
then pname:dstArrayElement specifies the starting byte offset to update.
endif::VK_EXT_inline_uniform_block[]
* pname:descriptorCount is the number of descriptors to update.
If pname:descriptorCount is greater than the number of remaining array
elements in the destination binding, those affect consecutive bindings
in a manner similar to slink:VkWriteDescriptorSet above.
ifdef::VK_EXT_inline_uniform_block[]
If the descriptor binding identified by pname:dstBinding has a
descriptor type of ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
then pname:descriptorCount specifies the number of bytes to update and
the remaining array elements in the destination binding refer to the
remaining number of bytes in it.
endif::VK_EXT_inline_uniform_block[]
* pname:descriptorType is a elink:VkDescriptorType specifying the type of
the descriptor.
* pname:offset is the offset in bytes of the first binding in the raw data
@ -2962,6 +3300,12 @@ endif::VK_KHR_descriptor_update_template[]
+
The stride is useful in case the bindings are stored in structs along with
other data.
ifdef::VK_EXT_inline_uniform_block[]
If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
then the value of pname:stride is ignored and the stride is assumed to be
`1`, i.e. the descriptor update information for them is always specified as
a contiguous range.
endif::VK_EXT_inline_uniform_block[]
.Valid Usage
****
@ -2975,6 +3319,16 @@ other data.
implicitly specified when using a descriptor update template to update
descriptors, and all applicable consecutive bindings, as described by
<<descriptorsets-updates-consecutive>>
ifdef::VK_EXT_inline_uniform_block[]
* [[VUID-VkDescriptorUpdateTemplateEntry-descriptor-02226]]
If pname:descriptor type is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:dstArrayElement
must: be an integer multiple of `4`
* [[VUID-VkDescriptorUpdateTemplateEntry-descriptor-02227]]
If pname:descriptor type is
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:descriptorCount
must: be an integer multiple of `4`
endif::VK_EXT_inline_uniform_block[]
****
include::../validity/structs/VkDescriptorUpdateTemplateEntry.txt[]

View File

@ -1316,6 +1316,141 @@ include::../validity/structs/VkPhysicalDeviceDescriptorIndexingFeaturesEXT.txt[]
endif::VK_EXT_descriptor_indexing[]
ifdef::VK_EXT_vertex_attribute_divisor[]
[open,refpage='VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT',desc='Structure describing if fetching of vertex attribute may be repeated for instanced rendering',type='structs']
--
The sname:VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT structure is
defined as:
include::../api/structs/VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* [[features-features-vertexAttributeInstanceRateDivisor]]
pname:vertexAttributeInstanceRateDivisor specifies whether vertex
attribute fetching may be repeated in case of instanced rendering.
* [[features-features-vertexAttributeInstanceRateZeroDivisor]]
pname:vertexAttributeInstanceRateZeroDivisor specifies whether a zero
value for sname:VkVertexInputBindingDivisorDescriptionEXT::pname:divisor
is supported.
If the sname:VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT structure is
included in the pname:pNext chain of flink:VkPhysicalDeviceFeatures2, it is
filled with values indicating the implementation-dependent behavior.
sname:VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT can: also be used in
pname:pNext chain of slink:VkDeviceCreateInfo to enable the feature.
include::../validity/structs/VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT.txt[]
--
endif::VK_EXT_vertex_attribute_divisor[]
ifdef::VK_EXT_astc_decode_mode[]
[open,refpage='VkPhysicalDeviceASTCDecodeFeaturesEXT',desc='Structure describing ASTC decode mode features',type='structs']
--
The sname:VkPhysicalDeviceASTCDecodeFeaturesEXT structure is defined as:
include::../api/structs/VkPhysicalDeviceASTCDecodeFeaturesEXT.txt[]
The members of the sname:VkPhysicalDeviceASTCDecodeFeaturesEXT structure
describe the following features:
* [[features-features-astc-decodeModeSharedExponent]]
pname:decodeModeSharedExponent indicates whether the implementation
supports decoding ASTC compressed formats to
ename:FORMAT_E5B9G9R9_UFLOAT_PACK32 internal precision.
If the sname:VkPhysicalDeviceASTCDecodeFeaturesEXT structure is included in
the pname:pNext chain of flink:vkGetPhysicalDeviceFeatures2KHR, it is filled
with values indicating whether each feature is supported.
sname:VkPhysicalDeviceASTCDecodeFeaturesEXT can: also be used in the
pname:pNext chain of flink:vkCreateDevice to enable features.
include::../validity/structs/VkPhysicalDeviceASTCDecodeFeaturesEXT.txt[]
--
endif::VK_EXT_astc_decode_mode[]
ifdef::VK_KHR_vulkan_memory_model[]
[open,refpage='VkPhysicalDeviceVulkanMemoryModelFeaturesKHR',desc='Structure describing features supported by VK_KHR_vulkan_memory_model',type='structs']
--
To query memory model features additionally supported call
flink:vkGetPhysicalDeviceFeatures2 with a
sname:VkPhysicalDeviceVulkanMemoryModelFeaturesKHR structure included in the
pname:pNext chain of its pname:pFeatures parameter.
The sname:VkPhysicalDeviceVulkanMemoryModelFeaturesKHR structure can: also
be in the pname:pNext chain of a slink:VkDeviceCreateInfo structure, in
which case it controls which additional features are enabled in the device.
The slink:VkPhysicalDeviceVulkanMemoryModelFeaturesKHR structure is defined
as:
include::../api/structs/VkPhysicalDeviceVulkanMemoryModelFeaturesKHR.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* [[features-features-vulkanMemoryModel]] pname:vulkanMemoryModel
indicates whether the Vulkan Memory Model is supported, as defined in
<<memory-model,Vulkan Memory Model>>.
This also indicates whether shader modules can: declare the
code:VulkanMemoryModelKHR capability.
* [[features-features-vulkanMemoryModelDeviceScope]]
pname:vulkanMemoryModelDeviceScope indicates whether the Vulkan Memory
Model can use code:Device scope synchronization.
This also indicates whether shader modules can: declare the
code:VulkanMemoryModelDeviceScopeKHR capability.
include::../validity/structs/VkPhysicalDeviceVulkanMemoryModelFeaturesKHR.txt[]
--
endif::VK_KHR_vulkan_memory_model[]
ifdef::VK_EXT_inline_uniform_block[]
[open,refpage='VkPhysicalDeviceInlineUniformBlockFeaturesEXT',desc='Structure describing inline uniform block features that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceInlineUniformBlockFeaturesEXT structure is defined
as:
include::../api/structs/VkPhysicalDeviceInlineUniformBlockFeaturesEXT.txt[]
The members of the sname:VkPhysicalDeviceInlineUniformBlockFeaturesEXT
structure describe the following features:
* [[features-features-inlineUniformBlock]] pname:inlineUniformBlock
indicates whether the implementation supports inline uniform block
descriptors.
If this feature is not enabled,
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT must: not be used.
* [[features-features-descriptorBindingInlineUniformBlockUpdateAfterBind]]
pname:descriptorBindingInlineUniformBlockUpdateAfterBind
ifndef::VK_EXT_descriptor_indexing[]
is ename:VK_FALSE and reserved for future use.
endif::VK_EXT_descriptor_indexing[]
ifdef::VK_EXT_descriptor_indexing[]
indicates whether the implementation supports updating inline uniform
block descriptors after a set is bound.
If this feature is not enabled,
ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT must: not be used
with ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT.
endif::VK_EXT_descriptor_indexing[]
If the sname:VkPhysicalDeviceInlineUniformBlockFeaturesEXT structure is
included in the pname:pNext chain of slink:VkPhysicalDeviceFeatures2, it is
filled with values indicating whether each feature is supported.
sname:VkPhysicalDeviceInlineUniformBlockFeaturesEXT can: also be used in the
pname:pNext chain of slink:VkDeviceCreateInfo to enable features.
include::../validity/structs/VkPhysicalDeviceInlineUniformBlockFeaturesEXT.txt[]
--
endif::VK_EXT_inline_uniform_block[]
[[features-features-requirements]]
=== Feature Requirements
@ -1374,6 +1509,14 @@ ifdef::VK_EXT_descriptor_indexing[]
pname:descriptorBindingPartiallyBound>>
** <<features-features-runtimeDescriptorArray,
pname:runtimeDescriptorArray>>
ifdef::VK_EXT_inline_uniform_block[]
* <<features-features-inlineUniformBlock,pname:inlineUniformBlock>>, if
the `<<VK_EXT_inline_uniform_block>>` extension is supported.
* <<features-features-descriptorBindingInlineUniformBlockUpdateAfterBind,
pname:descriptorBindingInlineUniformBlockUpdateAfterBind>>, if the
`<<VK_EXT_inline_uniform_block>>` and `<<VK_EXT_descriptor_indexing>>`
extensions are both supported.
endif::VK_EXT_inline_uniform_block[]
endif::VK_EXT_descriptor_indexing[]
All other features defined in the Specification are optional:.
@ -2903,6 +3046,81 @@ include::../validity/structs/VkPhysicalDeviceDescriptorIndexingPropertiesEXT.txt
endif::VK_EXT_descriptor_indexing[]
ifdef::VK_EXT_inline_uniform_block[]
[open,refpage='VkPhysicalDeviceInlineUniformBlockPropertiesEXT',desc='Structure describing inline uniform block properties that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT structure is
defined as:
include::../api/structs/VkPhysicalDeviceInlineUniformBlockPropertiesEXT.txt[]
The members of the sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT
structure describe the following implementation-dependent limits:
* [[features-limits-maxInlineUniformBlockSize]]
pname:maxInlineUniformBlockSize is the maximum size in bytes of an
<<descriptorsets-inlineuniformblock, inline uniform block>> binding.
* [[features-limits-maxPerStageDescriptorInlineUniformBlocks]]
pname:maxPerStageDescriptorInlineUniformBlock is the maximum number of
inline uniform block bindings that can: be accessible to a single shader
stage in a pipeline layout.
Descriptor bindings with a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT count against this
limit.
ifdef::VK_EXT_descriptor_indexing[]
Only descriptor bindings in descriptor set layouts created without the
ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit
set count against this limit.
endif::VK_EXT_descriptor_indexing[]
* [[features-limits-maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks]]
pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks
ifndef::VK_EXT_descriptor_indexing[]
equals pname:maxPerStageDescriptorInlineUniformBlocks and is reserved
for future use.
endif::VK_EXT_descriptor_indexing[]
ifdef::VK_EXT_descriptor_indexing[]
is similar to pname:maxPerStageDescriptorInlineUniformBlocks but counts
descriptor bindings from descriptor sets created with or without the
ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit
set.
endif::VK_EXT_descriptor_indexing[]
* [[features-limits-maxDescriptorSetInlineUniformBlocks]]
pname:maxDescriptorSetInlineUniformBlocks is the maximum number of
inline uniform block bindings that can: be included in descriptor
bindings in a pipeline layout across all pipeline shader stages and
descriptor set numbers.
Descriptor bindings with a descriptor type of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT count against this
limit.
ifdef::VK_EXT_descriptor_indexing[]
Only descriptor bindings in descriptor set layouts created without the
ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit
set count against this limit.
endif::VK_EXT_descriptor_indexing[]
* [[features-limits-maxDescriptorSetUpdateAfterBindInlineUniformBlocks]]
pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks
ifndef::VK_EXT_descriptor_indexing[]
equals pname:maxDescriptorSetInlineUniformBlocks and is reserved for
future use.
endif::VK_EXT_descriptor_indexing[]
ifdef::VK_EXT_descriptor_indexing[]
is similar to pname:maxDescriptorSetInlineUniformBlocks but counts
descriptor bindings from descriptor sets created with or without the
ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit
set.
endif::VK_EXT_descriptor_indexing[]
If the sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT structure is
included in the pname:pNext chain of slink:VkPhysicalDeviceProperties2KHR,
it is filled with the implementation-dependent limits.
include::../validity/structs/VkPhysicalDeviceInlineUniformBlockPropertiesEXT.txt[]
--
endif::VK_EXT_inline_uniform_block[]
ifdef::VK_EXT_conservative_rasterization[]
[open,refpage='VkPhysicalDeviceConservativeRasterizationPropertiesEXT',desc='Structure describing conservative raster properties that can be supported by an implementation',type='structs']
@ -3413,6 +3631,13 @@ ifdef::VK_EXT_descriptor_indexing[]
| pname:maxDescriptorSetUpdateAfterBindStorageImages | - |500000 ^9^ | min
| pname:maxDescriptorSetUpdateAfterBindInputAttachments | - |500000 ^9^ | min
endif::VK_EXT_descriptor_indexing[]
ifdef::VK_EXT_inline_uniform_block[]
| pname:maxInlineUniformBlockSize | - | 256 | min
| pname:maxPerStageDescriptorInlineUniformBlocks | - | 4 | min
| pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks | - | 4 | min
| pname:maxDescriptorSetInlineUniformBlocks | - | 4 | min
| pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks | - | 4 | min
endif::VK_EXT_inline_uniform_block[]
ifdef::VK_EXT_vertex_attribute_divisor[]
| pname:maxVertexAttribDivisor | - | 2^16^-1 | min
endif::VK_EXT_vertex_attribute_divisor[]

View File

@ -460,10 +460,13 @@ ifdef::VK_EXT_vertex_attribute_divisor[]
[open,refpage='VkPipelineVertexInputDivisorStateCreateInfoEXT',desc='Structure specifying vertex attributes assignment during instanced rendering',type='structs']
--
If the pname:pNext chain of slink:VkPipelineVertexInputStateCreateInfo
includes a sname:VkPipelineVertexInputDivisorStateCreateInfoEXT structure,
then that structure controls how vertex attributes are assigned to an
instance when instanced rendering is enabled.
If
<<features-features-vertexAttributeInstanceRateDivisor,pname:vertexAttributeInstanceRateDivisor>>
feature is enabled and the pname:pNext chain of
slink:VkPipelineVertexInputStateCreateInfo includes a
sname:VkPipelineVertexInputDivisorStateCreateInfoEXT structure, then that
structure controls how vertex attributes are assigned to an instance when
instanced rendering is enabled.
The sname:VkPipelineVertexInputDivisorStateCreateInfoEXT structure is
defined as:
@ -497,6 +500,11 @@ include::../api/structs/VkVertexInputBindingDivisorDescriptionEXT.txt[]
The maximum value of divisor is implementation dependent and can be
queried using
sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::pname:maxVertexAttribDivisor.
A value of `0` can: be used for the divisor if the
<<features-features-vertexAttributeInstanceRateZeroDivisor,pname:vertexAttributeInstanceRateZeroDivisor>>
feature is enabled.
In this case, the same vertex attribute will be applied to all
instances.
If this structure is not used to define a divisor value for an attribute
then the divisor has a logical default value of 1.
@ -506,8 +514,14 @@ then the divisor has a logical default value of 1.
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869]]
pname:binding must: be less than
sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateZeroDivisor-02228]]
If the pname:vertexAttributeInstanceRateZeroDivisor feature is not
enabled, pname:divisor must: not be `0`
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateDivisor-02229]]
If the pname:vertexAttributeInstanceRateDivisor feature is not enabled,
pname:divisor must: be `1`
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870]]
pname:divisor must: be a value between `1` and
pname:divisor must: be a value between `0` and
sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::pname:maxVertexAttribDivisor,
inclusive.
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871]]
@ -555,7 +569,10 @@ ifndef::VK_EXT_vertex_attribute_divisor[]
vertexOffset = instanceIndex * bindingDesc.stride;
endif::VK_EXT_vertex_attribute_divisor[]
ifdef::VK_EXT_vertex_attribute_divisor[]
vertexOffset = (firstInstance + ((instanceIndex - firstInstance) / divisor)) * bindingDesc.stride;
if (divisor == 0)
vertexOffset = firstInstance * bindingDesc.stride;
else
vertexOffset = (firstInstance + ((instanceIndex - firstInstance) / divisor)) * bindingDesc.stride;
endif::VK_EXT_vertex_attribute_divisor[]
attribAddress = bufferBindingAddress + vertexOffset + attribDesc.offset;

View File

@ -563,6 +563,18 @@ for that variable to extend outside the range [eq]#[0,
pname:maxStorageBufferRange)#.
endif::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
ifdef::VK_EXT_inline_uniform_block[]
Variables identified with the code:Uniform storage class can: also be used
to access transparent descriptor set backed resources when the variable is
assigned to a descriptor set layout binding with a pname:descriptorType of
ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK.
In this case the variable must: be typed as code:OpTypeStruct and cannot: be
aggregated into arrays of that type.
Further, the code:Offset decoration for any member of such a variable must:
not cause the space required for that variable to extend outside the range
[eq]#[0,maxInlineUniformBlockSize)#.
endif::VK_EXT_inline_uniform_block[]
Variables identified with a storage class of code:UniformConstant and a
decoration of code:InputAttachmentIndex must: be declared as described in
<<interfaces-inputattachment,Fragment Input Attachment Interface>>.
@ -661,6 +673,9 @@ endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
| storage buffer | ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
| input attachment | ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
ifdef::VK_EXT_inline_uniform_block[]
| inline uniform block | ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
endif::VK_EXT_inline_uniform_block[]
|====
[[interfaces-resources-storage-class-correspondence]]
@ -699,6 +714,11 @@ endif::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
| input attachment
| code:UniformConstant | code:OpTypeImage (code:Dim=code:SubpassData, code:Sampled=2)
| code:InputAttachmentIndex
ifdef::VK_EXT_inline_uniform_block[]
| inline uniform block
| code:Uniform | code:OpTypeStruct
| code:Block, code:Offset, (code:ArrayStride), (code:MatrixStride)
endif::VK_EXT_inline_uniform_block[]
|====
1:: in addition to code:DescriptorSet and code:Binding
@ -834,6 +854,13 @@ ifdef::VK_EXT_descriptor_indexing[]
or pname:maxPerStageDescriptorUpdateAfterBindInputAttachments
endif::VK_EXT_descriptor_indexing[]
| input attachment^1^
ifdef::VK_EXT_inline_uniform_block[]
| pname:maxPerStageDescriptorInlineUniformBlocks
ifdef::VK_EXT_descriptor_indexing[]
or pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks
endif::VK_EXT_descriptor_indexing[]
| inline uniform block
endif::VK_EXT_inline_uniform_block[]
|====
1::

View File

@ -2436,9 +2436,10 @@ include::../api/protos/vkFlushMappedMemoryRanges.txt[]
flush.
fname:vkFlushMappedMemoryRanges guarantees that host writes to the memory
ranges described by pname:pMemoryRanges can: be made available to device
access, via <<synchronization-dependencies-available-and-visible,
availability operations>> from the ename:VK_ACCESS_HOST_WRITE_BIT
ranges described by pname:pMemoryRanges are made available to the host
memory domain, such that they can: be made available to the device memory
domain via <<synchronization-dependencies-available-and-visible, memory
domain operations>> using the ename:VK_ACCESS_HOST_WRITE_BIT
<<synchronization-access-types,access type>>.
Within each range described by pname:pMemoryRanges, each set of
@ -2482,10 +2483,10 @@ include::../api/protos/vkInvalidateMappedMemoryRanges.txt[]
invalidate.
fname:vkInvalidateMappedMemoryRanges guarantees that device writes to the
memory ranges described by pname:pMemoryRanges, which have been made visible
to the ename:VK_ACCESS_HOST_WRITE_BIT and ename:VK_ACCESS_HOST_READ_BIT
<<synchronization-access-types, access types>>, are made visible to the
host.
memory ranges described by pname:pMemoryRanges, which have been made
available to the host memory domain using the ename:VK_ACCESS_HOST_WRITE_BIT
and ename:VK_ACCESS_HOST_READ_BIT <<synchronization-access-types, access
types>>, are made visible to the host.
If a range of non-coherent memory is written by the host and then
invalidated without first being flushed, its contents are undefined.

View File

@ -2837,6 +2837,76 @@ That is:
--
ifdef::VK_EXT_astc_decode_mode[]
[open,refpage='VkImageViewASTCDecodeModeEXT',desc='Structure describing the ASTC decode mode for an image view',type='structs']
--
If the pname:pNext list includes a sname:VkImageViewASTCDecodeModeEXT
structure, then that structure includes a parameter that specifies the
decode mode for image views using ASTC compressed formats.
The sname:VkImageViewASTCDecodeModeEXT structure is defined as:
include::../api/structs/VkImageViewASTCDecodeModeEXT.txt[]
* pname:sType is the type of this structure.
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
* pname:decodeMode is the intermediate format used to decode ASTC
compressed formats.
.Valid Usage
****
* [[VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02230]]
pname:decodeMode must: be one of ename:VK_FORMAT_R16G16B16A16_SFLOAT,
ename:VK_FORMAT_R8G8B8A8_UNORM, or
ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
* [[VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02231]]
If the <<features-features-astc-decodeModeSharedExponent,
decodeModeSharedExponent>> feature is not enabled, pname:decodeMode
must: not be ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
* [[VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02232]]
If pname:decodeMode is ename:VK_FORMAT_R8G8B8A8_UNORM the image view
must: not include blocks using any of the ASTC HDR modes
* [[VUID-VkImageViewASTCDecodeModeEXT-format-02233]]
pname:format of the image view must: be one of
ename:VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
ename:VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
ename:VK_FORMAT_ASTC_12x12_UNORM_BLOCK, or
ename:VK_FORMAT_ASTC_12x12_SRGB_BLOCK
****
If pname:format uses sRGB encoding then the pname:decodeMode has no effect.
include::../validity/structs/VkImageViewASTCDecodeModeEXT.txt[]
--
endif::VK_EXT_astc_decode_mode[]
[open,refpage='vkDestroyImageView',desc='Destroy an image view object',type='protos']
--
@ -4587,9 +4657,6 @@ render pass must: declare the attachments using the
<<renderpass-aliasing,ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT>>, and
follow the other rules listed in that section.
Access to resources which alias memory from shaders using variables
decorated with code:Coherent are not automatically coherent with each other.
[NOTE]
.Note
====

View File

@ -251,6 +251,19 @@ assumes that the other invocation has been launched and will complete its
writes in finite time.
====
ifdef::VK_KHR_vulkan_memory_model[]
The <<memory-model,Memory Model>> appendix defines the terminology and rules
for how to correctly communicate between shader invocations, such as when a
write is <<memory-model-visible-to,Visible-To>> a read, and what constitutes
a <<memory-model-access-data-race,Data Race>>.
Applications must: not cause a data race.
endif::VK_KHR_vulkan_memory_model[]
ifndef::VK_KHR_vulkan_memory_model[]
Stores issued to different memory locations within a single shader
invocation may: not be visible to other invocations, or may: not become
visible in the order they were performed.
@ -319,6 +332,7 @@ Atomics allow shaders to use shared global addresses for mutual exclusion or
as counters, among other uses.
====
endif::VK_KHR_vulkan_memory_model[]
[[shaders-inputs]]
== Shader Inputs and Outputs

View File

@ -119,14 +119,27 @@ resulting from writes in one set of operations can: be read from another set
of operations.
[[synchronization-dependencies-available-and-visible]]
Two additional types of operation are used to control memory access.
Three additional types of operation are used to control memory access.
_Availability operations_ cause the values generated by specified memory
write accesses to become _available_ for future access.
write accesses to become _available_ to a memory domain for future access.
Any available value remains available until a subsequent write to the same
memory location occurs (whether it is made available or not) or the memory
is freed.
_Visibility operations_ cause any available values to become _visible_ to
specified memory accesses.
_Memory domain operations_ cause writes that are available to a source
memory domain to become available to a destination memory domain (an example
of this is making writes available to the host domain available to the
device domain).
_Visibility operations_ cause values available to a memory domain to become
_visible_ to specified memory accesses.
ifdef::VK_KHR_vulkan_memory_model[]
Availability, visibility, memory domains, and memory domain operations are
formally defined in the <<memory-model-availability-visibility,Availability
and Visibility>> section of the <<memory-model,Memory Model>> chapter.
Which API operations perform each of these operations is defined in
<<memory-model-vulkan-availability-visibility,Availability, Visibility, and
Domain Operations>>.
endif::VK_KHR_vulkan_memory_model[]
[[synchronization-dependencies-memory]]
A _memory dependency_ is an execution dependency which includes availability
@ -732,31 +745,27 @@ endif::VK_EXT_conditional_rendering[]
If a memory object does not have the
ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT property, then
flink:vkFlushMappedMemoryRanges must: be called in order to guarantee that
writes to the memory object from the host are made visible to the
ename:VK_ACCESS_HOST_WRITE_BIT <<synchronization-access-types, access
type>>, where it can: be further made available to the device by
<<synchronization, synchronization commands>>.
writes to the memory object from the host are made available to the host
domain, where they can: be further made available to the device domain via a
domain operation.
Similarly, flink:vkInvalidateMappedMemoryRanges must: be called to guarantee
that writes which are visible to the ename:VK_ACCESS_HOST_READ_BIT
<<synchronization-access-types, access type>> are made visible to host
that writes which are available to the host domain are made visible to host
operations.
If the memory object does have the
ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT property flag, writes to the
memory object from the host are automatically made visible to the
ename:VK_ACCESS_HOST_WRITE_BIT <<synchronization-access-types,access type>>.
Similarly, writes made visible to the ename:VK_ACCESS_HOST_READ_BIT
<<synchronization-access-types, access type>> are automatically made visible
to the host.
memory object from the host are automatically made available to the host
domain.
Similarly, writes made available to the host domain are automatically made
visible to the host.
[NOTE]
.Note
====
The flink:vkQueueSubmit command <<synchronization-submission-host-writes,
automatically guarantees that host writes flushed to
ename:VK_ACCESS_HOST_WRITE_BIT are made available>> if they were flushed
before the command executed, so in most cases an explicit memory barrier is
not needed for this case.
automatically performs a domain operation from host to device>> for all
writes performed before the command executes, so in most cases an explicit
memory barrier is not needed for this case.
In the few circumstances where a submit does not occur between the host
write and the device read access, writes can: be made available by using an
explicit memory barrier.
@ -4227,8 +4236,8 @@ queue submission>>, and all commands that occur later in
<<synchronization-submission-order,submission order>>.
The first <<synchronization-dependencies-access-scopes, access scope>>
includes all host writes to mappable device memory that are either coherent,
or have been flushed with flink:vkFlushMappedMemoryRanges.
includes all host writes to mappable device memory that are available to the
host memory domain.
The second <<synchronization-dependencies-access-scopes, access scope>>
includes all memory access performed by the device.

View File

@ -578,9 +578,9 @@ elink:VkFormat), using the appropriate equations in
<<textures-sexp-RGB,Shared Exponent to RGB>>.
Signed integer components smaller than 32 bits are sign-extended.
If the image view format is sRGB, the color components are first converted as if
they are UNORM, and then sRGB to linear conversion is applied to the R, G,
and B components as described in the "`sRGB EOTF`" section of the
If the image view format is sRGB, the color components are first converted
as if they are UNORM, and then sRGB to linear conversion is applied to the
R, G, and B components as described in the "`sRGB EOTF`" section of the
<<data-format,Khronos Data Format Specification>>.
The A component, if present, is unchanged.

View File

@ -43,7 +43,7 @@ extern "C" {
#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff)
#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff)
// Version of this file
#define VK_HEADER_VERSION 83
#define VK_HEADER_VERSION 84
#define VK_NULL_HANDLE 0
@ -305,6 +305,8 @@ typedef enum VkStructureType {
VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000,
VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000,
VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000,
VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001,
VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000,
VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001,
VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002,
@ -380,6 +382,10 @@ typedef enum VkStructureType {
VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = 1000130000,
VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = 1000130001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = 1000138000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = 1000138001,
VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = 1000138002,
VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT = 1000138003,
VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000,
VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001,
VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002,
@ -406,8 +412,10 @@ typedef enum VkStructureType {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000,
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002,
VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000,
VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = 1000211000,
VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES,
@ -1122,6 +1130,7 @@ typedef enum VkDescriptorType {
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 8,
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 9,
VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 10,
VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT = 1000138000,
VK_DESCRIPTOR_TYPE_BEGIN_RANGE = VK_DESCRIPTOR_TYPE_SAMPLER,
VK_DESCRIPTOR_TYPE_END_RANGE = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
VK_DESCRIPTOR_TYPE_RANGE_SIZE = (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT - VK_DESCRIPTOR_TYPE_SAMPLER + 1),
@ -5983,6 +5992,19 @@ typedef struct VkPhysicalDevice8BitStorageFeaturesKHR {
#define VK_KHR_vulkan_memory_model 1
#define VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION 2
#define VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME "VK_KHR_vulkan_memory_model"
typedef struct VkPhysicalDeviceVulkanMemoryModelFeaturesKHR {
VkStructureType sType;
void* pNext;
VkBool32 vulkanMemoryModel;
VkBool32 vulkanMemoryModelDeviceScope;
} VkPhysicalDeviceVulkanMemoryModelFeaturesKHR;
#define VK_EXT_debug_report 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)
@ -6433,6 +6455,24 @@ typedef struct VkValidationFlagsEXT {
#define VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME "VK_EXT_shader_subgroup_vote"
#define VK_EXT_astc_decode_mode 1
#define VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION 1
#define VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME "VK_EXT_astc_decode_mode"
typedef struct VkImageViewASTCDecodeModeEXT {
VkStructureType sType;
const void* pNext;
VkFormat decodeMode;
} VkImageViewASTCDecodeModeEXT;
typedef struct VkPhysicalDeviceASTCDecodeFeaturesEXT {
VkStructureType sType;
void* pNext;
VkBool32 decodeModeSharedExponent;
} VkPhysicalDeviceASTCDecodeFeaturesEXT;
#define VK_EXT_conditional_rendering 1
#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 1
#define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering"
@ -7301,6 +7341,42 @@ typedef struct VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT {
#define VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME "VK_AMD_shader_fragment_mask"
#define VK_EXT_inline_uniform_block 1
#define VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION 1
#define VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME "VK_EXT_inline_uniform_block"
typedef struct VkPhysicalDeviceInlineUniformBlockFeaturesEXT {
VkStructureType sType;
void* pNext;
VkBool32 inlineUniformBlock;
VkBool32 descriptorBindingInlineUniformBlockUpdateAfterBind;
} VkPhysicalDeviceInlineUniformBlockFeaturesEXT;
typedef struct VkPhysicalDeviceInlineUniformBlockPropertiesEXT {
VkStructureType sType;
void* pNext;
uint32_t maxInlineUniformBlockSize;
uint32_t maxPerStageDescriptorInlineUniformBlocks;
uint32_t maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks;
uint32_t maxDescriptorSetInlineUniformBlocks;
uint32_t maxDescriptorSetUpdateAfterBindInlineUniformBlocks;
} VkPhysicalDeviceInlineUniformBlockPropertiesEXT;
typedef struct VkWriteDescriptorSetInlineUniformBlockEXT {
VkStructureType sType;
const void* pNext;
uint32_t dataSize;
const void* pData;
} VkWriteDescriptorSetInlineUniformBlockEXT;
typedef struct VkDescriptorPoolInlineUniformBlockCreateInfoEXT {
VkStructureType sType;
const void* pNext;
uint32_t maxInlineUniformBlockBindings;
} VkDescriptorPoolInlineUniformBlockCreateInfoEXT;
#define VK_EXT_shader_stencil_export 1
#define VK_EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION 1
#define VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME "VK_EXT_shader_stencil_export"
@ -7734,7 +7810,7 @@ typedef struct VkPhysicalDeviceShaderCorePropertiesAMD {
#define VK_EXT_vertex_attribute_divisor 1
#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 2
#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 3
#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor"
typedef struct VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT {
@ -7755,6 +7831,13 @@ typedef struct VkPipelineVertexInputDivisorStateCreateInfoEXT {
const VkVertexInputBindingDivisorDescriptionEXT* pVertexBindingDivisors;
} VkPipelineVertexInputDivisorStateCreateInfoEXT;
typedef struct VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT {
VkStructureType sType;
void* pNext;
VkBool32 vertexAttributeInstanceRateDivisor;
VkBool32 vertexAttributeInstanceRateZeroDivisor;
} VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT;
#define VK_NV_shader_subgroup_partitioned 1

View File

@ -1,2 +1,2 @@
# The value to start tagging VU statements at, unless overridden by -nextvu
startVUID = 2027
startVUID = 2234

View File

@ -2004,6 +2004,8 @@ files and Python scripts are logged in Github history.
[[changelog]]
= Change Log
* 2018-08-28 - Add optional attr:provisional attribute to tag:extension
tags.
* 2018-07-07 - Add optional attr:promotedto, attr:deprecatedby, and
attr:obsoletedby attributes to tag:extension tags.
* 2018-06-25 - Remove attr:vendorids tags for Khronos vendor IDs.

View File

@ -480,6 +480,7 @@ cell separator must be `a|` instead of just `|`:
p_2(A_s,A_d) & = A_d(1-A_s) \\
\end{aligned}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|====
----

View File

@ -119,6 +119,10 @@ include::chapters/debugging.txt[]
include::appendices/spirvenv.txt[]
ifdef::VK_KHR_vulkan_memory_model[]
include::appendices/memorymodel.txt[]
endif::VK_KHR_vulkan_memory_model[]
include::appendices/compressedtex.txt[]
ifdef::VK_VERSION_1_1[]

View File

@ -52,6 +52,7 @@ class Extension:
promotedTo,
deprecatedBy,
obsoletedBy,
provisional,
revision ):
self.generator = generator
self.filename = filename
@ -64,6 +65,7 @@ class Extension:
self.promotedTo = promotedTo
self.deprecatedBy = deprecatedBy
self.obsoletedBy = obsoletedBy
self.provisional = provisional
self.revision = revision
self.deprecationType = None
@ -279,6 +281,7 @@ class Extension:
# or empty string if deprecated without replacement
# obsoletedBy extension or Vulkan version which obsoleted this extension,
# or empty string if obsoleted without replacement
# provisional 'true' if this extension is released provisionally
#
# ---- methods ----
# ExtensionMetaDocOutputGenerator(errFile, warnFile, diagFile) - args as for
@ -367,6 +370,10 @@ class ExtensionMetaDocOutputGenerator(OutputGenerator):
deprecated_extension_appendices_fp = self.newFile(self.directory + '/deprecated_extension_appendices.txt')
deprecated_extension_appendices_toc_fp = self.newFile(self.directory + '/deprecated_extension_appendices_toc.txt')
deprecated_extensions_guard_macro_fp = self.newFile(self.directory + '/deprecated_extensions_guard_macro.txt')
provisional_extensions_appendix_fp = self.newFile(self.directory + '/provisional_extensions_appendix.txt')
provisional_extension_appendices_fp = self.newFile(self.directory + '/provisional_extension_appendices.txt')
provisional_extension_appendices_toc_fp = self.newFile(self.directory + '/provisional_extension_appendices_toc.txt')
provisional_extensions_guard_macro_fp = self.newFile(self.directory + '/provisional_extensions_guard_macro.txt')
write('include::deprecated_extensions_guard_macro.txt[]', file=current_extensions_appendix_fp)
write('', file=current_extensions_appendix_fp)
@ -396,12 +403,28 @@ class ExtensionMetaDocOutputGenerator(OutputGenerator):
# add include guard to allow multiple includes
write('ifndef::DEPRECATED_EXTENSIONS_GUARD_MACRO_INCLUDE_GUARD[]', file=deprecated_extensions_guard_macro_fp)
write(':DEPRECATED_EXTENSIONS_GUARD_MACRO_INCLUDE_GUARD:\n', file=deprecated_extensions_guard_macro_fp)
write('ifndef::PROVISIONAL_EXTENSIONS_GUARD_MACRO_INCLUDE_GUARD[]', file=provisional_extensions_guard_macro_fp)
write(':PROVISIONAL_EXTENSIONS_GUARD_MACRO_INCLUDE_GUARD:\n', file=provisional_extensions_guard_macro_fp)
write('include::provisional_extensions_guard_macro.txt[]', file=provisional_extensions_appendix_fp)
write('', file=provisional_extensions_appendix_fp)
write('ifdef::HAS_PROVISIONAL_EXTENSIONS[]', file=provisional_extensions_appendix_fp)
write('[[provisional-extension-appendices-list]]', file=provisional_extensions_appendix_fp)
write('== List of Provisional Extensions', file=provisional_extensions_appendix_fp)
write('include::provisional_extension_appendices_toc.txt[]', file=provisional_extensions_appendix_fp)
write('<<<', file=provisional_extensions_appendix_fp)
write('include::provisional_extension_appendices.txt[]', file=provisional_extensions_appendix_fp)
write('endif::HAS_PROVISIONAL_EXTENSIONS[]', file=provisional_extensions_appendix_fp)
for ext in self.extensions:
include = 'include::../' + ext.name + '.txt[]'
link = ' * <<' + ext.name + '>>'
if ext.deprecationType is None:
if ext.provisional == 'true':
write(self.conditionalExt(ext.name, include), file=provisional_extension_appendices_fp)
write(self.conditionalExt(ext.name, link), file=provisional_extension_appendices_toc_fp)
write(self.conditionalExt(ext.name, ':HAS_PROVISIONAL_EXTENSIONS:'), file=provisional_extensions_guard_macro_fp)
elif ext.deprecationType is None:
write(self.conditionalExt(ext.name, include), file=current_extension_appendices_fp)
write(self.conditionalExt(ext.name, link), file=current_extension_appendices_toc_fp)
else:
@ -449,10 +472,11 @@ class ExtensionMetaDocOutputGenerator(OutputGenerator):
promotedTo = self.getAttrib(interface, 'promotedto', OPTIONAL)
deprecatedBy = self.getAttrib(interface, 'deprecatedby', OPTIONAL)
obsoletedBy = self.getAttrib(interface, 'obsoletedby', OPTIONAL)
provisional = self.getAttrib(interface, 'provisional', OPTIONAL, 'false')
filename = self.directory + '/' + name + '.txt'
self.extensions.append( Extension(self, filename, name, number, type, requires, requiresCore, contact, promotedTo, deprecatedBy, obsoletedBy, revision) )
self.extensions.append( Extension(self, filename, name, number, type, requires, requiresCore, contact, promotedTo, deprecatedBy, obsoletedBy, provisional, revision) )
def endFeature(self):
# Finish processing in superclass

View File

@ -414,6 +414,7 @@ Extensions = element extensions {
# obsoletedby - Vulkan version or a name of an extension that obsoletes
# this extension. It may be empty string.
# e.g. 'VK_VERSION_1_1', or 'VK_EXT_debug_utils', or ''
# provisional - 'true' if this extension is released provisionally
# In addition, <require> / <remove> tags also support an api attribute:
# api - only require/remove these features for the matching API.
# Not a regular expression.
@ -431,6 +432,7 @@ Extension = element extension {
attribute promotedto { text } ? ,
attribute deprecatedby { text } ? ,
attribute obsoletedby { text } ? ,
attribute provisional { text } ? ,
Comment ? ,
(
element require {

View File

@ -147,7 +147,7 @@ server.
<type category="define">// Vulkan 1.1 version number
#define <name>VK_API_VERSION_1_1</name> <type>VK_MAKE_VERSION</type>(1, 1, 0)// Patch version should always be set to 0</type>
<type category="define">// Version of this file
#define <name>VK_HEADER_VERSION</name> 83</type>
#define <name>VK_HEADER_VERSION</name> 84</type>
<type category="define">
#define <name>VK_DEFINE_HANDLE</name>(object) typedef struct object##_T* object;</type>
@ -2796,7 +2796,7 @@ server.
<member>const <type>void</type>* <name>pNext</name></member>
<member><type>VkSamplerReductionModeEXT</type> <name>reductionMode</name></member>
</type>
<type category="struct" name="VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT" structextends="VkPhysicalDeviceFeatures2">
<type category="struct" name="VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
<member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
<member noautovalidity="true"><type>void</type>* <name>pNext</name></member>
<member><type>VkBool32</type> <name>advancedBlendCoherentOperations</name></member>
@ -2818,6 +2818,32 @@ server.
<member><type>VkBool32</type> <name>dstPremultiplied</name></member>
<member><type>VkBlendOverlapEXT</type> <name>blendOverlap</name></member>
</type>
<type category="struct" name="VkPhysicalDeviceInlineUniformBlockFeaturesEXT" returnedonly="true" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
<member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
<member><type>void</type>* <name>pNext</name></member>
<member><type>VkBool32</type> <name>inlineUniformBlock</name></member>
<member><type>VkBool32</type> <name>descriptorBindingInlineUniformBlockUpdateAfterBind</name></member>
</type>
<type category="struct" name="VkPhysicalDeviceInlineUniformBlockPropertiesEXT" returnedonly="true" structextends="VkPhysicalDeviceProperties2">
<member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT"><type>VkStructureType</type> <name>sType</name></member>
<member><type>void</type>* <name>pNext</name></member>
<member><type>uint32_t</type> <name>maxInlineUniformBlockSize</name></member>
<member><type>uint32_t</type> <name>maxPerStageDescriptorInlineUniformBlocks</name></member>
<member><type>uint32_t</type> <name>maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks</name></member>
<member><type>uint32_t</type> <name>maxDescriptorSetInlineUniformBlocks</name></member>
<member><type>uint32_t</type> <name>maxDescriptorSetUpdateAfterBindInlineUniformBlocks</name></member>
</type>
<type category="struct" name="VkWriteDescriptorSetInlineUniformBlockEXT">
<member values="VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT"><type>VkStructureType</type> <name>sType</name></member>
<member>const <type>void</type>* <name>pNext</name></member>
<member><type>uint32_t</type> <name>dataSize</name></member>
<member len="dataSize">const <type>void</type>* <name>pData</name></member>
</type>
<type category="struct" name="VkDescriptorPoolInlineUniformBlockCreateInfoEXT" structextends="VkDescriptorPoolCreateInfo">
<member values="VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT"><type>VkStructureType</type> <name>sType</name></member>
<member>const <type>void</type>* <name>pNext</name></member>
<member><type>uint32_t</type> <name>maxInlineUniformBlockBindings</name></member>
</type>
<type category="struct" name="VkPipelineCoverageModulationStateCreateInfoNV" structextends="VkPipelineMultisampleStateCreateInfo">
<member values="VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV"><type>VkStructureType</type> <name>sType</name></member>
<member>const <type>void</type>* <name>pNext</name></member>
@ -2858,7 +2884,7 @@ server.
<member><type>VkBool32</type> <name>supported</name></member>
</type>
<type category="struct" name="VkDescriptorSetLayoutSupportKHR" alias="VkDescriptorSetLayoutSupport"/>
<type category="struct" name="VkPhysicalDeviceShaderDrawParameterFeatures" structextends="VkPhysicalDeviceFeatures2">
<type category="struct" name="VkPhysicalDeviceShaderDrawParameterFeatures" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
<member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES"><type>VkStructureType</type> <name>sType</name></member>
<member noautovalidity="true"><type>void</type>* <name>pNext</name></member>
<member><type>VkBool32</type> <name>shaderDrawParameters</name></member>
@ -3199,6 +3225,18 @@ server.
<member><type>VkBool32</type> <name>conditionalRendering</name></member>
<member><type>VkBool32</type> <name>inheritedConditionalRendering</name></member>
</type>
<type category="struct" name="VkPhysicalDeviceVulkanMemoryModelFeaturesKHR" returnedonly="true" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
<member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR"><type>VkStructureType</type> <name>sType</name></member>
<member noautovalidity="true"><type>void</type>* <name>pNext</name></member>
<member><type>VkBool32</type> <name>vulkanMemoryModel</name></member>
<member><type>VkBool32</type> <name>vulkanMemoryModelDeviceScope</name></member>
</type>
<type category="struct" name="VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
<member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
<member noautovalidity="true"><type>void</type>* <name>pNext</name></member>
<member><type>VkBool32</type> <name>vertexAttributeInstanceRateDivisor</name></member>
<member><type>VkBool32</type> <name>vertexAttributeInstanceRateZeroDivisor</name></member>
</type>
<type category="struct" name="VkQueueFamilyCheckpointPropertiesNV" structextends="VkQueueFamilyProperties2" returnedonly="true">
<member values="VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV"><type>VkStructureType</type> <name>sType</name></member>
<member><type>void</type>* <name>pNext</name></member>
@ -3210,6 +3248,16 @@ server.
<member><type>VkPipelineStageFlagBits</type> <name>stage</name></member>
<member noautovalidity="true"><type>void</type>* <name>pCheckpointMarker</name></member>
</type>
<type category="struct" name="VkImageViewASTCDecodeModeEXT" structextends="VkImageViewCreateInfo">
<member values="VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT"><type>VkStructureType</type> <name>sType</name></member>
<member>const <type>void</type>* <name>pNext</name></member>
<member><type>VkFormat</type> <name>decodeMode</name></member>
</type>
<type category="struct" name="VkPhysicalDeviceASTCDecodeFeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
<member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
<member noautovalidity="true"><type>void</type>* <name>pNext</name></member>
<member><type>VkBool32</type> <name>decodeModeSharedExponent</name></member>
</type>
</types>
<comment>Vulkan enumerant (token) definitions</comment>
@ -7493,10 +7541,14 @@ server.
<enum value="&quot;VK_ARM_extension_01&quot;" name="VK_ARM_EXTENSION_01_EXTENSION_NAME"/>
</require>
</extension>
<extension name="VK_ARM_extension_02" number="68" type="device" author="ARM" contact="Jan-Harald Fredriksen @janharaldfredriksen-arm" supported="disabled">
<extension name="VK_EXT_astc_decode_mode" number="68" type="device" author="ARM" contact="Jan-Harald Fredriksen @janharaldfredriksen-arm" requires="VK_KHR_get_physical_device_properties2" supported="vulkan">
<require>
<enum value="0" name="VK_ARM_EXTENSION_02_SPEC_VERSION"/>
<enum value="&quot;VK_ARM_extension_02&quot;" name="VK_ARM_EXTENSION_02_EXTENSION_NAME"/>
<enum value="1" name="VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION"/>
<enum value="&quot;VK_EXT_astc_decode_mode&quot;" name="VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME"/>
<enum offset="0" extends="VkStructureType" name="VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT"/>
<enum offset="1" extends="VkStructureType" name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT"/>
<type name="VkImageViewASTCDecodeModeEXT"/>
<type name="VkPhysicalDeviceASTCDecodeFeaturesEXT"/>
</require>
</extension>
<extension name="VK_IMG_extension_69" number="69" type="device" author="IMG" contact="Tobias Hector @tobski" supported="disabled">
@ -8344,10 +8396,19 @@ server.
<enum value="&quot;VK_AMD_shader_fragment_mask&quot;" name="VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME"/>
</require>
</extension>
<extension name="VK_AMD_extension_139" number="139" author="AMD" contact="Mais Alnasser @malnasse" supported="disabled">
<extension name="VK_EXT_inline_uniform_block" number="139" type="device" author="EXT" requires="VK_KHR_get_physical_device_properties2,VK_KHR_maintenance1" contact="Daniel Rakos @aqnuep" supported="vulkan">
<require>
<enum value="0" name="VK_AMD_EXTENSION_139_SPEC_VERSION"/>
<enum value="&quot;VK_AMD_extension_139&quot;" name="VK_AMD_EXTENSION_139_EXTENSION_NAME"/>
<enum value="1" name="VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION"/>
<enum value="&quot;VK_EXT_inline_uniform_block&quot;" name="VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME"/>
<enum offset="0" extends="VkDescriptorType" name="VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT"/>
<enum offset="0" extends="VkStructureType" name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT"/>
<enum offset="1" extends="VkStructureType" name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT"/>
<enum offset="2" extends="VkStructureType" name="VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT"/>
<enum offset="3" extends="VkStructureType" name="VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT"/>
<type name="VkPhysicalDeviceInlineUniformBlockFeaturesEXT"/>
<type name="VkPhysicalDeviceInlineUniformBlockPropertiesEXT"/>
<type name="VkWriteDescriptorSetInlineUniformBlockEXT"/>
<type name="VkDescriptorPoolInlineUniformBlockCreateInfoEXT"/>
</require>
</extension>
<extension name="VK_AMD_extension_140" number="140" author="AMD" contact="Mais Alnasser @malnasse" supported="disabled">
@ -8705,18 +8766,13 @@ server.
<enum value="&quot;VK_NV_extension_165&quot;" name="VK_EXT_EXTENSION_165_EXTENSION_NAME"/>
<enum bitpos="23" extends="VkAccessFlagBits" name="VK_ACCESS_RESERVED_23_BIT_NV"/>
<enum bitpos="8" extends="VkImageUsageFlagBits" name="VK_IMAGE_USAGE_RESERVED_8_BIT_NV"/>
<enum bitpos="22" extends="VkPipelineStageFlagBits" name="VK_PIPELINE_STAGE_RESERVED_22_BIT_NV"/>
</require>
</extension>
<extension name="VK_NV_extension_166" number="166" author="NV" contact="Daniel Koch @dgkoch" supported="disabled">
<require>
<enum value="0" name="VK_EXT_EXTENSION_166_SPEC_VERSION"/>
<enum value="&quot;VK_NV_extension_166&quot;" name="VK_EXT_EXTENSION_166_EXTENSION_NAME"/>
</require>
</extension>
<extension name="VK_NV_extension_167" number="167" author="NV" contact="Daniel Koch @dgkoch" supported="disabled">
<require>
<enum value="0" name="VK_EXT_EXTENSION_167_SPEC_VERSION"/>
<enum value="&quot;VK_NV_extension_167&quot;" name="VK_EXT_EXTENSION_167_EXTENSION_NAME"/>
<enum bitpos="8" extends="VkShaderStageFlagBits" name="VK_SHADER_STAGE_RESERVED_8_BIT_NV"/>
<enum bitpos="9" extends="VkShaderStageFlagBits" name="VK_SHADER_STAGE_RESERVED_9_BIT_NV"/>
<enum bitpos="10" extends="VkShaderStageFlagBits" name="VK_SHADER_STAGE_RESERVED_10_BIT_NV"/>
@ -8730,6 +8786,12 @@ server.
<enum bitpos="5" extends="VkPipelineCreateFlagBits" name="VK_PIPELINE_CREATE_RESERVED_5_BIT_NV"/>
</require>
</extension>
<extension name="VK_NV_extension_167" number="167" author="NV" contact="Daniel Koch @dgkoch" supported="disabled">
<require>
<enum value="0" name="VK_EXT_EXTENSION_167_SPEC_VERSION"/>
<enum value="&quot;VK_NV_extension_167&quot;" name="VK_EXT_EXTENSION_167_EXTENSION_NAME"/>
</require>
</extension>
<extension name="VK_NV_extension_168" number="168" author="NV" contact="Daniel Koch @dgkoch" supported="disabled">
<require>
<enum value="0" name="VK_EXT_EXTENSION_168_SPEC_VERSION"/>
@ -8897,13 +8959,15 @@ server.
</extension>
<extension name="VK_EXT_vertex_attribute_divisor" number="191" type="device" requires="VK_KHR_get_physical_device_properties2" author="NV" contact="Vikram Kushwaha @vkushwaha" supported="vulkan">
<require>
<enum value="2" name="VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION"/>
<enum value="3" name="VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION"/>
<enum value="&quot;VK_EXT_vertex_attribute_divisor&quot;" name="VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME"/>
<enum offset="0" extends="VkStructureType" name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT"/>
<enum offset="1" extends="VkStructureType" name="VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT"/>
<enum offset="2" extends="VkStructureType" name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT"/>
<type name="VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT"/>
<type name="VkVertexInputBindingDivisorDescriptionEXT"/>
<type name="VkPipelineVertexInputDivisorStateCreateInfoEXT"/>
<type name="VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT"/>
</require>
</extension>
<extension name="VK_GOOGLE_extension_192" number="192" author="GOOGLE" contact="Jean-Francois Roy @jfroy" supported="disabled">
@ -9037,10 +9101,12 @@ server.
<enum value="&quot;VK_KHR_extension_211&quot;" name="VK_KHR_EXTENSION_211_EXTENSION_NAME"/>
</require>
</extension>
<extension name="VK_KHR_extension_212" number="212" type="device" author="KHR" contact="Jeff Bolz @jeffbolznv" supported="disabled">
<extension name="VK_KHR_vulkan_memory_model" number="212" type="device" author="KHR" contact="Jeff Bolz @jeffbolznv" provisional="true" supported="vulkan">
<require>
<enum value="0" name="VK_KHR_EXTENSION_212_SPEC_VERSION"/>
<enum value="&quot;VK_KHR_extension_212&quot;" name="VK_KHR_EXTENSION_212_EXTENSION_NAME"/>
<enum value="2" name="VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION"/>
<enum value="&quot;VK_KHR_vulkan_memory_model&quot;" name="VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME"/>
<enum offset="0" extends="VkStructureType" name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR"/>
<type name="VkPhysicalDeviceVulkanMemoryModelFeaturesKHR"/>
</require>
</extension>
<extension name="VK_AMD_extension_213" number="213" author="AMD" contact="Neil Henning @sheredom" supported="disabled">
@ -9073,5 +9139,28 @@ server.
<enum value="&quot;VK_KHR_extension_217&quot;" name="VK_KHR_EXTENSION_217_EXTENSION_NAME"/>
</require>
</extension>
<extension name="VK_EXT_macos_ios_window" number="218" author="EXT" contact="Dzmitry Malyshau @kvark" supported="disabled">
<require>
<enum value="0" name="VK_EXT_MACOS_IOS_WINDOW_SPEC_VERSION"/>
<enum value="&quot;VK_EXT_macos_ios_window&quot;" name="VK_EXT_MACOS_IOS_WINDOW_EXTENSION_NAME"/>
</require>
</extension>
<extension name="VK_EXT_extension_219" number="219" type="device" author="EXT" contact="Matthew Netsch @mnetsch" supported="disabled">
<require>
<enum value="0" name="VK_EXT_EXTENSION_219_SPEC_VERSION"/>
<enum value="&quot;VK_EXT_extension_219&quot;" name="VK_EXT_EXTENSION_219_EXTENSION_NAME"/>
<enum bitpos="14" extends="VkImageCreateFlagBits" name="VK_IMAGE_CREATE_RESERVED_14_BIT_EXT"/>
<enum bitpos="24" extends="VkAccessFlagBits" name="VK_ACCESS_RESERVED_24_BIT_EXT"/>
<enum bitpos="24" extends="VkFormatFeatureFlagBits" name="VK_FORMAT_FEATURE_RESERVED_24_BIT_EXT"/>
<enum bitpos="9" extends="VkImageUsageFlagBits" name="VK_IMAGE_USAGE_RESERVED_9_BIT_EXT"/>
<enum bitpos="23" extends="VkPipelineStageFlagBits" name="VK_PIPELINE_STAGE_RESERVED_23_BIT_EXT"/>
</require>
</extension>
<extension name="VK_EXT_extension_220" number="220" author="EXT" contact="Dzmitry Malyshau @kvark" supported="disabled">
<require>
<enum value="0" name="VK_EXT_EXTENSION_220_SPEC_VERSION"/>
<enum value="&quot;VK_EXT_extension_220&quot;" name="VK_EXT_EXTENSION_220_EXTENSION_NAME"/>
</require>
</extension>
</extensions>
</registry>