Copyright 2016-2023 The Khronos Group Inc.
SPDX-License-Identifier: CC-BY-4.0

Update Log for the Vulkan-Docs repository on GitHub. Updates are in reverse
chronological order starting with the latest public release.

This summarizes the periodic public updates, not individual commits. Updates
on GitHub are done as single large patches at the release point, collecting
together the resolution of many Khronos internal issues, along with any
public pull requests that have been accepted.

"`VU`" as used below is an abbreviation for "`valid usage statement`", which
appears frequently in the change log.

-----------------------------------------------------

Change log for October 20, 2023 Vulkan 1.3.269 spec update:

Github Issues

  * Add and correct a couple of `optional` attributes in the XML (public
    pull request 2252).

Internal Issues

  * Add flink:vkGetQueryPoolResults and flink:vkCmdCopyQueryPoolResults VUs
    requiring that queries be initialized (internal issue 3638).
  * Harmonize shader object state VUs with spec language in common draw,
    common draw vertex binding, slink:VkShaderCreateInfoEXT, and the
    <<shaders-objects-state, Setting State>> section (internal MR 6128).
  * Consolidate VUs in many files (internal MRs 6136, 6137, 6140, 6154,
    6155, 6157).
  * Fix common blit image, copy image, and resolve image VUs for
    interactions with ename:VK_REMAINING_ARRAY_LAYERS when built without
    apiext:VK_KHR_maintenance5 (internal MR 6204).
  * Remove slink:VkClearAttachment VU 00021 for "`validating`" a union type
    (internal MR 6222).
  * Disallow image creation with
    ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT and any
    etext:VK_IMAGE_CREATE_SPARSE_*_BIT flags (internal MR 6223).
  * Combine slink:VkGraphicsPipelineCreateInfo VUs 06575 and 06603 (internal
    MR 6225).
  * Markup fixes for apiext:VK_NV_low_latency2 (internal MR 6228).
  * Add a VU for the
    slink:VkDecompressMemoryRegionNV::pname:decompressedSize limit, and fix
    language describing parameters in slink:VkCopyMemoryIndirectCommandNV
    (internal MR 6230).

New Extensions

  * apiext:VK_ARM_scheduling_controls
  * apiext:VK_NV_cuda_kernel_launch

-----------------------------------------------------

Change log for October 13, 2023 Vulkan 1.3.268 spec update:

Github Issues

  * Restrict flink:vkCmdSetEvent2 ptext:*stageMask parameters to not include
    ename:VK_PIPELINE_STAGE_2_HOST_BIT (public issue 1996).
  * Fix <<formats-non-packed, byte mapping table>> for
    ename:VK_FORMAT_A8_UNORM_KHR (public issue 2234).
  * Assign VUIDs to new VUs that were overlooked in the previous spec update
    (public issue 2244).
  * Add a spec build test and refactor Makefile to allow using a different
    repository root directory path, for use with the tests (public PR 2248).

Internal Issues

  * Add VUs to slink:VkCopyMemoryToImageInfoEXT and
    slink:VkCopyImageToMemoryInfoEXT requiring zero row-length /
    image-height when doing a host copy with
    ename:VK_HOST_IMAGE_COPY_MEMCPY_EXT (internal issue 3619).
  * Clarify that fragment shading rate attachments cannot be cleared in VU
    for slink:VkRenderPassCreateInfo2 and language for
    slink:VkAttachmentDescription2KHR (internal issue 3634).
  * Add VUs to slink:VkSparseImageMemoryBind requiring a non-zero extent
    (internal issue 3635).
  * Consolidate VUs in many files (internal MRs 6138, 6141. 6142, 6147,
    6149, 6153, 6161, 6162, 6167, 6170, 6194, and 6197).
  * Use title case consistently for chapter and section titles, and add it
    to the style guide (internal MR 6201).

-----------------------------------------------------

Change log for October 6, 2023 Vulkan 1.3.267 spec update:

Internal Issues

  * Detect old wording of boilerplate pname:pNext description in CI
    (internal issue 2186).
  * Clarify ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT with regard
    to queue submission (internal issue 3627).
  * Update apiext:VK_NV_low_latency2 pname:pInfo pointers to be `const`
    (internal issue 3637).
  * Add slink:VkDescriptorSetLayoutBindingFlagsCreateInfo and
    slink:VkDescriptorSetAllocateInfo VUs for
    ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT (internal MR
    6127).
  * Consolidate VUs in `access_mask_2_common.adoc` (internal MR 6166).
  * Fix
    slink:VkGraphicsPipelineCreateInfo::pname:pColorBlendState->attachmentCount
    VU to apply only when the blend state is not dynamic (internal MR 6171).
  * Add missing object types to the <<debugging-object-types, VkObjectType
    and Vulkan Handle Relationship>> table (internal MR 6175).
  * Fix typo ("`Non-private`" -> "`Private`") in the description of
    <<memory-model-non-private, private memory operations obeying program
    order>> (internal MR 6176).
  * Add reflow test for list continuation in VUs (internal MR 6177).
  * Correct type of flink:vkQueueNotifyOutOfBandNV::pname:pQueueTypeInfo
    (internal MR 6179).
  * Add XML `len` attribute for slink:VkFrameBoundaryEXT::pname:pTag order>>
    (internal MR 6180).
  * Consolidate VUs for apiext:VK_ANDROID_external_format_resolve (internal
    MR 6183).
  * Upstream Vulkan SC 1.0.13 changes to this repository (internal vulkansc
    issue 179).

New Extensions

  * apiext:VK_EXT_nested_command_buffer
  * apiext:VK_NV_extended_sparse_address_space


-----------------------------------------------------

Change log for September 29, 2023 Vulkan 1.3.266 spec update:

Github Issues

  * Fix slink:VkGraphicsPipelineCreateInfo VU to say a valid pipeline layout
    is always needed without a graphics pipeline library (public issue
    2168).
  * Add missing "`not`" to <<spirvenv-module-validation-standalone,
    Standalone SPIR-V Validation>> VU 04917 (public PR 2229).
  * Add riscv64 64-bit platform to `vk_platform.h` (public PR 2238).
  * Add driver ID for AGXV (Asahi) (public PR 2238).

Internal Issues

  * Fix common draw dynamic state VUs to check for pname:stencilTestEnable
    and pname:depthBoundsTestEnable (internal issue 3486)
  * Fix stride passed to flink:vkGetQueryPoolResults in example code in
    apiext:VK_KHR_performance_query appendix (internal MR 6148).

New Extensions

  * apiext:VK_ANDROID_external_format_resolve
  * apiext:VK_NV_low_latency2

-----------------------------------------------------

Change log for September 22, 2023 Vulkan 1.3.265 spec update:

Github Issues

  * Remove misplaced
    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR
    description from elink:VkPipelineStageFlagBits context (public PR 2210).
  * Swap NV pipeline stage with promoted KHR stage in XML `syncequivalent`
    tag (public issue 2211).
  * Remove redundant slink:VkPipelineShaderStageCreateInfo pname:stage VUs
    (public issue 2222).
  * Remove duplicate definition in apiext:VK_AMD_shader_enqueue proposal
    document (public issue 2225).

Internal Issues

  * Add a common copy image VU to require compressed image-to-image copies
    to have formats with matching texel block extents (internal issue 3610).
  * Add `page` field to `validusage.json` for eventual use with Antora
    (internal issue 3617).
  * Add missing VUs to flink:vkGetCalibratedTimestampsEXT (internal MR
    5974).
  * Attempt to clarify apiext:VK_KHR_fragment_shader_barycentric
    pname:triStripVertexOrderIndependentOfProvokingVertex description
    (internal MR 6048).
  * Add a slink:VkGraphicsPipelineCreateInfo VU restricting
    ename:VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT
    (internal MR 6119).
  * Reword several places to clarify that code:PrimitiveId is reset to `0`
    between each draw in a multi-draw command (internal issue 3564 ).
  * Consolidate and simplify VUs in the <<copies, Copy Commands>> chapter
    (internal MR 6124).
  * Remove inconsistent `KHR` suffix in
    slink:VkDeviceImageMemoryRequirements VUIDs (internal MR 6124).


-----------------------------------------------------

Change log for September 8, 2023 Vulkan 1.3.264 spec update:

Github Issues

  * Create Roadmap Feedback issue template (github PR 2207).

Internal Issues

  * Fix ename:VK_GEOMETRY_OPAQUE_BIT_KHR flag reference for
    <<ray-opacity-micromap, Ray Opacity Micromap>> (internal issue 3337).
  * Clarify slink:VkImageMemoryBarrier color format VU (internal issue
    3606).
  * Collapse apiext:VK_EXT_shader_tile_image pipeline barrier common VUs
    08718 and 06191 (internal MR 6065).
  * Use consistent language to describe multi-planar aspect masks for some
    existing VUs (internal MR 6072).
  * Consolidate VUs in the <<commandbuffers, Command Buffers>> chapter
    (internal MR 6114).

New Extensions

  * apiext:VK_EXT_frame_boundary
  * apiext:VK_MSFT_layered_driver

-----------------------------------------------------

Change log for September 2, 2023 Vulkan 1.3.263 spec update:

Github Issues

  * Clarify H.264 / H.265 level indicator values by reference to the ITU-T
    specifications (public issue 2193).
  * Explicitly state that VkDeviceOrHostAddressConstKHR is also ignored
    (public PR 2205).
  * Fix parameter typo "`cordinates`" and correct markup (public PR 2206).
  * Cleanup slink:VkGraphicspipelineCreateInfo VUs for code:PointSize in the
    context of apiext:VK_KHR_maintenance5 (public Vulkan-ValidationLayers
    issue 6382).

Internal Issues

  * Clarifications for <<framebuffer-dsb, Dual-Source Blending>> in common
    draw VUs (internal issue 3549).
  * Ensure slink:VkHostImageLayoutTransitionInfoEXT::pname:oldLayout is the
    current layout (internal issue 3580).
  * Link to promoted-from extension proposal docs in extension appendices if
    no proposal exists for the extension itself (internal issue 3601).
  * Note that pname:storageInputOutput16 is needed for 16-bit vertex input
    in the <<fxvertex-attrib-location>> and <<interfaces-iointerfaces-user,
    User-defined Variable Interface>> sections (internal MR 5989).
  * Provisional video encode API updates (internal MR 6010).
  * Move requirement that elements of
    slink:VkPresentInfoKHR::pname:pSwapchains must be unique to a VU
    (internal MR 6054).
  * Fix and add missing shader object VUs in common draw VUs and the
    <<shaders-objects-state, Setting State>> section (internal MR 6077).
  * Define slink:VkPipelineColorBlendStateCreateInfo::pname:attachmentCount
    to ignore explicit, not implicit state settings in the context of
    apiext:VK_EXT_extended_dynamic_state3 (internal MR 6079).
  * Fix duplicate VUIDs for apiext:VK_EXT_host_image_copy (internal MR
    6100).
  * Use language for
    slink:VkPipelineColorBlendStateCreateInfo::pname:pAttachments consistent
    with related parts of the specification (internal MR 6103).

New Extensions

  * apiext:VK_NV_descriptor_pool_overallocation

-----------------------------------------------------

Change log for August 25, 2023 Vulkan 1.3.262 spec update:

Github Issues

  * Remove ename:VK_ACCESS_2_UNIFORM_READ_BIT from
    ename:VK_ACCESS_SHADER_READ_BIT (public issue 2169).
  * Fix typo in description of slink:VkPerformanceCounterResultKHR (public
    issue 2186).
  * Fix missing vkQueue* row in command properties tables (public PR 2189).
  * Specify that some <<spirvenv-module-validation-runtime, Runtime SPIR-V
    Validation>> VUs apply only to compute shaders (public PR 2199).
  * Misc. markup fixes (public pull request 2200).
  * Specify when compute pipeline metadata must be saved in language
    following slink:VkPipelineShaderStageModuleIdentifierCreateInfoEXT
    (https://github.com/HansKristian-Work/vkd3d-proton/pull/1639, internal
    MR 6058).

Internal Issues

  * Fix MSRTSS + dynamic sample count + single sampling interactions in
    common draw VUs (internal issue 3474).
  * Fixes to block processing and attribute handling when generating
    `validusage.json` (internal issue 3576).
  * Generate implicit `-parent` VUs for more distant ancestor relationships
    if the immediate parent type is not present (internal issue 3582).
  * Fix ename:VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT interaction with
    apiext:VK_EXT_extended_dynamic_state3 in VUs for
    slink:VkGraphicsPipelineCreateInfo (internal issue 3587).
  * Clarify that synchronization commands do not execute pipeline stages in
    the <<synchronization-pipeline-stages, Pipeline Stages>> section
    (internal issue 3592).
  * VU fixes for apiext:VK_KHR_maintenance5 (internal MR 6032).
  * Update apiext:VK_KHR_dynamic_rendering proposal document to remove a
    sentence that should not have been there (internal MR 6047).
  * Add ray tracing VUs for core synchronization access flags to match the
    64-bit versions (internal MR 6047).
  * Add a CI test to check for include:: paths not starting with a
    recognized path attribute (internal MR 6063).
  * Make slink:VkBufferCreateInfo::pname:usage `noautovalidity` in XML and
    allow for elink:VkBufferUsageFlags2KHR flags (internal MR 6066).
  * Expand CI test checking for missing asciidoctor attributes to the
    refpage build, catching additional cases (internal MR 6071).
  * Remove explicit VU for slink:VkImageFormatProperties2 requiring the
    <<fetaures-hostImageCopy, pname:hostImageCopy>> feature to be enabled if
    slink:VkHostImageCopyDevicePerformanceQueryEXT is included in a
    pname:pNext chain (internal MR 6074).

New Extensions

  * apiext:VK_QCOM_filter_cubic_clamp
  * apiext:VK_QCOM_filter_cubic_weights
  * apiext:VK_QCOM_image_processing2
  * apiext:VK_QCOM_ycbcr_degamma

-----------------------------------------------------

Change log for August 4, 2023 Vulkan 1.3.261 spec update:

Github Issues

  * Disallow mixing multi-present-mode swapchains in slink:VkPresentInfoKHR
    (public issue 2151).
  * Clarify mapping between wait semaphores and fences for
    slink:VkSwapchainPresentFenceInfoEXT (public pull request 2152).
  * Fix incorrect link to `GLSL_EXT_shader_tile_image` extension
    specification (public pull request 2178).
  * Fix formatting issues in apiext:VK_KHR_maintenance5 (public pull request
    2180).
  * Fix bad explanation of
    slink:VkBufferUsageFlags2CreateInfoKHR::pname:usage (public pull request
    2182).
  * Fix markup to improve short descriptions for some
    apiext:VK_NV_device_generated_commands_compute command and structure
    refpages (public issue 2184).
  * Fix VUs for flink:vkGetQueryPoolResults and
    flink:vkCmdCopyQueryPoolResults to disallow
    ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR for performance queries
    (public issue 2185).

Internal Issues

  * Add some VUs for bind buffer and image commands to require that buffers
    created with the
    ename:VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT flag
    must only be bound to device memory that was likewise allocated
    (internal merge request 5993).
  * Add slink:VkGraphicsPipelineCreateInfo and common draw vertex binding
    VUs for 64-bit input component count matching (internal merge request
    6008).
  * Remove duplicate mesh shading apiext:VK_EXT_shader_object VUs (internal
    merge request 6031).
  * Add missing apiext:SPV_AMDX_shader_enqueue <spirvextension> tag
    (internal merge request 6043).
  * Add CI check to `xml_consistency.py` for `_RESERVED_` enums in
    non-disabled extensions (internal merge request 6044).
  * Consolidate VUs in the <<clears, Clear Commands>> chapter (internal
    merge request 6043).
  * Fix suffixes of incorrectly named flags for apiext:VK_KHR_maintenance5,
    and update XML extension dependencies for those flags (internal merge
    request 6050).
  * Add missing <<features-cooperativeMatrix, cooperativeMatrix>>
    requirement for apiext:VK_KHR_cooperative_matrix (internal merge request
    6051).

-----------------------------------------------------

Change log for July 28, 2023 Vulkan 1.3.260 spec update:

Internal Issues

  * Refactor `parse_dependency.py:dependencyLanguage()` into a more useful
    form for downstream components such as the validation layers (internal
    issue 3555).
  * Add CI check to `xml_consistency.py` for API names added by extensions
    which have suffix inconsistencies (internal issue 3568).
  * Add notes to flink:vkCreateAccelerationStructureKHR and
    flink:vkCreateMicromapEXT about data capture/replay (internal merge
    request 6015).
  * Add missing explicit common parent VUs for flink:vkCreateImageView and
    flink:vkGetMicromapBuildSizesEXT (internal merge request 6016).
  * Add VU to slink:VkCommandBufferBeginInfo requiring the
    pname:commandBuffer support graphics operations (internal merge request
    6025).
  * Unify unavailable query VUs for flink:vkCmdWriteTimestamp and
    flink:vkCmdWriteTimestamp2 (internal merge request 6027).
  * Make slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:pNext a `const`
    pointer (internal merge request 6028).

New Extensions

  * apiext:VK_KHR_maintenance5
  * apiext:VK_AMDX_shader_enqueue

-----------------------------------------------------

Change log for July 21, 2023 Vulkan 1.3.259 spec update:

Internal Issues

  * Remove dangling reference to nonexistent
    `StdVideoH265ShortTermRefPicsSps` in `video.xml` (internal issue 3565).
  * Rename ftext:vkCmdUpdatePipelineIndirectBuffer to
    flink:vkCmdUpdatePipelineIndirectBufferNV in the just-released
    apiext:VK_NV_device_generated_commands_compute extension (internal issue
    3568).
  * Add a CI check for undefined attributes in the spec build (internal
    issue 3567).

-----------------------------------------------------

Change log for July 21, 2023 Vulkan 1.3.258 spec update:

Github Issues

  * Add a note explaining subgroup vs. dynamically uniform to the
    <<shaders-scope-device, Device>> section (public pull request 2118).
  * Fix video std headers  to respect VK_NO_STDINT_H,
    involving minor changes to dependencies in `video.xml` as well as the
    header generator script (public issue 2155).

Internal Issues

  * Add spec language and VUs to allow applications to set various members
    of slink:VkGraphicsPipelineCreateInfo to be NULL if all the members of
    the structs they point to are set as dynamic (internal issue 3263).
  * Ban attachment aliasing and color masks with RGB9E5 format. Changes
    affect common draw VUs, flink:vkCmdSetColorWriteMaskEXT,
    slink:VkGraphicsPipelineCreateInfo, slink:VkRenderingInfo,
    flink:vkCmdBeginRenderPass, and flink:vkCmdBeginRenderPass2 (internal
    issues 3338, 3538).
  * Fix typo in structure name for slink:VkSubpassDescription2 VU 06251
    (internal issue 3483).
  * Condense buffer memory barrier VUs, pipeline VUs, and a few
    miscellaneous VUs now that embedded asciidoc conditional markup is
    allowed within a VU statement (internal issue 3543).
  * Use explicit structure member initializer syntax instead of comments
    with the member name consistently in code samples (internal issue 3550).
  * Fix misuse of etext:VK_API_VERSION* in XML `<spirvcapabilities>` tags,
    and add a CI test to prevent recurrence (internal issue 3559).
  * Add VU for slink:VkDescriptorSetLayout sets used by
    flink:vkCmdSetDescriptorBufferOffsetsEXT (internal issue 3560).
  * Explicitly say that flink:vkCreateAccelerationStructure does not write
    to the buffers in the introduction to the <<resources, Resource
    Creation>> chapter and for flink:vkCreateAccelerationStructureNV,
    flink:vkCreateAccelerationStructureKHR, and flink:vkCreateMicromapEXT
    (internal merge request 5914).
  * Add a NOTE regarding ename:VK_IMAGE_LAYOUT_UNDEFINED to the
    <<synchronization-image-layout-transitions, Image Layout Transitions>>
    section (internal merge request 5962).
  * Fix interpretation of variable descriptor count zero in
    slink:VkDescriptorSetVariableDescriptorCountLayoutSupport (internal
    merge request 5983).
  * Fix slink:VkRenderPassBeginInfo VU to include a clause for
    slink:VkMultisampledRenderToSingleSampledInfoEXT (internal merge request
    5996).
  * Add HLSL spirv-intrinsics mapping for
    apiext:VK_NV_ray_tracing_invocation_reorder appendix and for the
    `VK_KHR_ray_tracing_position_fetch` proposal document (internal merge
    requests 6002, 6005).

New Extensions

  * apiext:VK_EXT_host_image_copy
  * apiext:VK_NV_device_generated_commands_compute

-----------------------------------------------------

Change log for July 7, 2023 Vulkan 1.3.257 spec update:

Github Issues

  * Clarify flink:vkGetQueryPoolResults with
    ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT and interactions with
    ename:VK_QUERY_RESULT_64_BIT affecting size of the returned values
    (public issue 1086).
  * Fix link markup in one of the proposal documents (public merge request
    2160).

Internal Issues

  * Attempt to tidy up feedback loop guarantees in common draw VUs,
    elink:VkPipelineDepthStencilStateCreateFlagBits,
    elink:VkPipelineColorBlendStateCreateFlagBits,
    slink:VkRenderingAttachmentInfo, and by reference to the new
    <<renderpass-load-operations, Render Pass Load Operations>>,
    <<renderpass-store-operations, Render Pass Store Operations>>, and
    <<renderpass-resolve-operations, Render Pass Multisample Resolve
    Operations>> sections (internal issues 3375, 3403, 3517).
  * Modify boilerplate language for pname:sType structure members to refer
    to them as elink:VkStructureType values (internal issue 3493).
  * Describe that the <<interfaces-iointerfaces-builtin, mesh shader output
    interface>> can have two built-in interface blocks (internal issue
    3509).
  * Add slink:VkDeviceGroupRenderPassBeginInfo and slink:VkRenderingInfo VUs
    for zero-sized pname:renderArea (internal issue 3535).
  * Generate a warning comment for preprocessor guard definitions in the
    generated C headers. This will show up in some IDEs and may help prevent
    e.g. use of `VK_VERSION_1_3` as a parameter to API calls (internal issue
    3537).
  * Remove check in reflow.py that did not allow embedded conditionals in VU
    statement markup (internal issue 3545).
  * Reduce duplication of spec language in the <<Cooperative Matrices>>
    section, where the apiext:VK_KHR_cooperative_matrix interfaces are
    similar to, but not promoted from the apiext:VK_NV_cooperative_matrix
    interfaces (internal issue 3547).
  * Fix shader tile image access for depth/stencil images in
    elink:VkAccessFlagBits2 and elink:VkAccessFlagsBits (internal merge
    request 5912)
  * Fix missing VUs for apiext:VK_EXT_depth_bias_control (internal merge
    request 5967).
  * Update slink:VkPipelineShaderStageCreateInfo VU 02756 with task and mesh
    shader interactions (internal merge request 5977).
  * Add test cases to CI for nested lists and math blocks in VU statements,
    which are now allowed (internal merge request 5984).
  * Remove code:CrossWorkgroup from the allowed storage classes in
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    (internal merge request 5987).
  * Add missing `<spirvextension>` XML tags for
    apiext:VK_ARM_shader_core_builtins (internal merge request 5988).
  * Add more CI checks for preferred orthography and fix problems identified
    by them (internal merge request 5991).

-----------------------------------------------------

Change log for June 30, 2023 Vulkan 1.3.256 spec update:

GitHub Issues

  * Fix minor typos (public pull requests 2154 and 2157).
  * Fix XML `<format>` metadata for etext:VK_FORMAT_R64G64* and
    ename:VK_FORMAT_BC*_SNORM_BLOCK (public pull request 2156).

Internal Issues

  * Specify fragment stage when accessing color attachment via shader tile
    image reads for ename:VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT and
    ename:VK_ACCESS_COLOR_ATTACHMENT_READ_BIT (internal merge request 5918).
  * Clarify in which stages subgroup control flags
    ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT
    and ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT, as
    well as their apiext:VK_EXT_shader_object variants, are allowed to be
    set (internal issue 3529).
  * Fix typo to pname:depth in flink:vkCmdBindInvocationMaskHUAWEI VUID
    04983 (internal merge request 5958).
  * Rename ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_HUAWEI to
    ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADER_HUAWEI (internal merge request
    5959).
  * Modify the VU extraction script to correctly handle content that is not
    plain text, such as nested bullets or blocks (internal merge request
    5964).
  * Add a NOTE to the <<pipelines-cache-header, Pipeline Cache Header>>
    section and move one related VU statement. Fix handling of queue types
    with dependencies in generator scripts (internal merge request 5965).
  * Remove explicit `optional="false"` syntax from the XML schema for
    command `param` and structure `member` tags (internal merge request
    5970).
  * Refactor README.adoc to move Vulkan and VulkanSC-specific language into
    READMEVK.adoc and READMESC.adoc, respectively (internal merge request
    5971).
  * Update registry schema document with a current example of `externsync`
    for arrays (internal merge request 5975).

-----------------------------------------------------

Change log for June 23, 2023 Vulkan 1.3.255 spec update:

GitHub Issues

  * Fix XML `<format>` metadata for ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32
    and ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16 (public pull requests 2145,
    2147).

Internal Issues

  * Only extract VU statements for the currently built specification,
    allowing placing conditional markup inside VU statements and the
    simplification or elimination of many VUs that previously had to be
    replicated for extension-dependent behavior (internal issue 3387).
  * Add missing Description section to the
    apiext:VK_EXT_swapchain_colorspace extension appendix (internal issue
    3463).
  * Add VU to disable ftext:vkCmdBeginQuery* with micromap queries (internal
    issue 3511).
  * Add apiext:VK_EXT_calibrated_timestamps proposal document, and update
    some of the specification language and notes for
    flink:vkCmdWriteTimestamp2KHR and flink:vkCmdWriteTimestamp (internal
    issue 3521).

New Extensions

  * apiext:VK_KHR_cooperative_matrix

-----------------------------------------------------

Change log for June 16, 2023 Vulkan 1.3.254 spec update:

GitHub Issues

  * Clarify discard behavior of dynamic rendering with unused attachments
    (public issue 2125).

Internal Issues

  * Fix typos in execution modes for fragment depth and stencil writes in
    the <<fragops, Fragment Operations>> chapter (internal issue 3519).
  * Add slink:VkDescriptorAddressInfo VUs disallowing descriptors with zero
    range unless pname:nullDescriptor is enabled (internal merge request
    5929).
  * Add asciidoctor conditional mismatch check to spec build (internal merge
    request 5948).
  * Remove unused `start` and `end` attributes from `enum` tags in the
    registry documentation and schema (internal merge request 5951).
  * Clarify flink:vkEndCommandBuffer error behavior (internal vulkansc issue
    184).

New Extensions

  * apiext:VK_EXT_depth_bias_control
  * apiext:VK_QNX_external_memory_screen_buffer

-----------------------------------------------------

Change log for June 9, 2023 Vulkan 1.3.253 spec update:

GitHub Issues

  * Require the pname:accelerationStructure feature for acceleration
    structure commands (public issue 2134).
  * Fix slink:VkAccelerationStructureCreateInfoKHR::pname:flags typo to
    pname:createFlags (public pull request 2140).

Internal Issues

  * Various fixes to the provisional video encode APIs for rate control,
    capabilities, and other improvements (internal issues 2213, 3013, 3137,
    3138, 3139, 3386, 3440).
  * Add XML representation of pipeline stage ordering relationships and use
    it to generate markup artifacts including stage flag definitions,
    ordering, and the <<synchronization-pipeline-stages-supported, Supported
    pipeline stage flags>> table (internal issue 3260).
  * Clarify <<vkGetPhysicalDeviceVideoFormatPropertiesKHR, video format
    query interactions>> by reference to a new
    <<format-feature-dependent-usage-flags, Format Feature Dependent Usage
    Flags>> section (internal issue 3491).
  * Add slink:VkGraphicsPipelineCreateInfo and common draw vertex binding
    VUs for 64-bit input components (internal merge request 5869).
  * Improve slink:VkImageViewCreateInfo VUs for
    apiext:VK_NV_linear_color_attachment (internal merge request 5884).
  * Update precision for code:normalize() instruction in the <<Precision of
    GLSL.std.450 Instructions>> table (internal merge request 5923).


-----------------------------------------------------

Change log for June 1, 2023 Vulkan 1.3.252 spec update:

Internal Issues

  * Merge Vulkan SC build and support scripts into Vulkan repository. This
    will ease keeping the two repositories closely synchronized (internal
    merge request 5930).
  * Update precision for code:degrees() and code:radians() instructions
    in the <<Precision of GLSL.std.450 Instructions>> table
    (internal merge request 5922).
  * Fix definition of code:ulp() in the
    <<spirvenv-op-prec, Precision of Individual Operations>>
    section to limit the definition to finite numbers
    (internal merge request 5924).
  * Add view mask VU to slink:VkFramebufferCreateInfo for
    apiext:VK_KHR_fragment_shading_rate (internal merge request 5932).

New Extensions

  * apiext:VK_EXT_external_memory_acquire_unmodified

-----------------------------------------------------

Change log for May 28, 2023 Vulkan 1.3.251 spec update:

GitHub Issues:

  * VUs for graphics pipelines have been reworked regarding state subsets,
    along with the sections describing those state subsets. VUs that
    previously ambiguously stated "`If the pipeline is _created with_ <state
    subset>...`" now instead state "`If the pipeline _requires_ <state
    subset>...`" Those VUs link to the state subset descriptions, which
    previously did not actually indicate anything about when they were
    required, which was instead left to the section on complete subsets. The
    subset sections now document their own independent requirements for when
    they are needed, so that the VUs explicitly point to relevant text.
    Additional VUs have also been added to mirror these updated sections,
    uncovering a handful of incorrect edge cases and clarifying them.
    Previous VUs that required a complete pipeline were now redundant, so
    have been removed. (public issue 1793).
  * Add missing code:SPV_EXT_opacity_micromap to XML (public pull request
    2131).
  * Fix typo in code:SPV_INTEL_shader_integer_functions2 XML (public pull
    request 2132).

Internal Issues

  * Use "`commands are called *in* a command buffer`" rather than "`*on* a
    command buffer`", and add this case to the style guide (internal issue
    3480).
  * Fix common draw dispatch VU 07753 for the
    slink:VkImageView::pname:format to match the code:OpTypeImage
    code:Sampled code:Type (internal issue 3481).
  * Create common draw and slink:VkGraphicsPipelineCreateInfo VUs for
    pname:alphaToCoverageEnable (internal merge request 5811).
  * Add elink:VkDynamicState entry for
    ename:VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT (internal
    merge request 5894).
  * Use consistent wording for VUs referring to external memory handles
    (internal merge request 5895).
  * Remove redundant <<spirvenv-module-validation-standalone, Standalone
    SPIR-V Validation>> VU 04662 (internal merge request 5898).
  * Revert common draw VU 07620, which was accidentally removed by
    apiext:VK_EXT_shader_object (internal merge request 5899).
  * Allow slink:VkVideoDecodeInfoKhr::pname:pReferenceSlots to be `NULL` in
    its description (internal merge request 5900).
  * Fix slink:VkGraphicsPipelineCreateInfo pipeline topology VUs when
    pname:dynamicPrimitiveTopologyUnrestricted is set and the dynamic state
    is enabled (internal merge request 5916).

New Extensions

  * apiext:VK_EXT_dynamic_rendering_unused_attachments

-----------------------------------------------------

Change log for May 4, 2023 Vulkan 1.3.250 spec update:

GitHub Issues:

  * Fix common image subresource VUs for fname:vkGetImageSubresourceLayout*
    with planar images (public issue 2109).
  * Fix URL in BUILD.adoc (public merge request 2116).
  * Split up ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT VU for
    slink:VkImageCreateInfo (public issue 2117)

Internal Issues

  * Add some missing VUs for apiext:VK_EXT_shader_object (internal issue
    3449).
  * Add a <<shaders-binding, Binding Shaders>> section and refer to it from
    some apiext:VK_EXT_shader_object VUs, collapsing and simplifying them
    (internal issue 3425).
  * Fix flink:vkGetImageSubresourceLayout2EXT to refer to the output
    structure as undefined for ename:VK_IMAGE_TILING_OPTIMAL, rather than
    the input structure (merge request 5870).
  * Add ename:VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT to the
    slink:VkPipelineColorBlendStateCreateInfo::pname:pAttachments
    description (merge request 5873).
  * Clarify how to get slink:VkExternalBufferProperties in
    slink:VkMemoryAllocateInfo VU 00639 (merge request 5873).
  * Replace `~~~~` delimiter for nested open/source blocks with `----`,
    using a custom extension to treat the listing block as an open block
    where needed for continuations (merge request 5886).
  * Fix common stage mask VUIDs 07946, 07947, 07949, and 07950 to
    incorporate the stage mask name and avoid duplication (internal merge
    request 5886).

New Extensions

  * apiext:VK_EXT_attachment_feedback_loop_dynamic_state


-----------------------------------------------------

Change log for April 27, 2023 Vulkan 1.3.249 spec update:

GitHub Issues:

  * Add a non-normative NOTE on variability in
    <<textures-texel-anisotropic-filtering, Texel Anisotropic Filtering>>
    implementations, and move the theoretical implementation described in
    that section into the NOTE (public issue 1361).
  * Fix XML attributes of slink:VkMicromapEXT structure members to allow
    `NULL` handles (public issue 2114).

Internal Issues

  * Clarify common draw VUs for attachment read feedback loops (internal
    issue 3439).
  * Add flink:vkCmdCopyQueryPoolResults VU requiring queries to have been
    made available by prior executed commands (internal issue 3451).
  * Relax ptext:*DescriptorSize limits to 256 bytes max in the
    <<limits-required, Required Limits>> table (internal issue 3456).
  * Mention shader objects in definitions of code:SubgroupLocalInvocationId
    and code:SubgroupSize built-ins (internal issue 3459).
  * Use numeric format (e.g. etext:*SFLOAT), numeric type (e.g. "`float`"),
    and SPIR-V type (e.g. code:OpTypeFloat, width, sign) consistently in the
    specification, rather than mixing and matching by accident (internal
    merge request 5627).
  * Add <<spirvenv-module-validation-runtime,
    Runtime SPIR-V Validation>> VUs for Mesh and Task
    code:max*Size using the same wording as for
    code:maxComputeSharedMemorySize (internal merge request 5804).
  * Add missing `const` to
    slink:VkVideoDecodeH265PictureInfoKHR::pname:pStdPictureInfo (internal
    merge request 5859).
  * Convert `scripts/genanchorlinks.py` script into an asciidoctor
    extension.

New Extensions

  * apiext:VK_KHR_ray_tracing_position_fetch

-----------------------------------------------------

Change log for April 20, 2023 Vulkan 1.3.248 spec update:

GitHub Issues:

  * Clarify when <<deferred-host-operations-requesting, parameter access for
    deferred commands>> can be done (public issue 2092).
  * Clarify <<fundamentals-objectmodel-lifetime, object lifetimes for
    deferred commands>> (public issue 2100).
  * Add missing :refpage: markup to pages that use commonvalidity VUs, so
    the API portion of the VUID is rendered correctly (public issue 2104).

Internal Issues

  * Update slink:VkFragmentShadingRateCombinerOpKHR language to address
    differences between Fragment Shading Rate clamping and DX Variable
    Shading Rate input sanitization (internal issue 3339).
  * Add common VU for slink:VkAttachmentDescription2 and
    slink:VkAttachmentReference2KHR, and VU to
    slink:VkGraphicsPipelineCreateInfo, to ensure render pass and pipeline
    sample counts are valid, and related specification language in
    <<renderpass-noattachments>> (internal issue 3422).
  * Clarify that <<textures-texel-mipmap-filtering, minmax filtering applies
    between mip levels>> (internal issue 3450).
  * Add ename:VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT to
    slink:VkPipelineColorBlendStateCreateInfo attachment VUs 07353 and 07608
    (internal issue 3455).
  * Fix "`fragment output interface`" -> "`fragment shader state`" typo in
    slink:VkGraphicsPipelineCreateInfo VUs 06485 and 06486 (internal MR
    5824).
  * Collapse redundancies in dynamic state VUs for
    slink:VkGraphicsPipelineCreateInfo and
    slink:VkPipelineViewportStateCreateInfo (internal MR 5838).
  * Collapse redundancies in dynamic state VUs for
    slink:VkGraphicsPipelineCreateInfo and
    slink:VkGraphicsPipelineCreateInfo (internal MR 5853).
  * Clarify source of the custom border color in a NOTE to
    slink:VkSamplerCustomBorderColorCreateInfoEXT and a footnote to the
    <<textures-border-replacement-table, Border Texel Components After
    Replacement>> table (internal MR 5855).
  * Update registry scripts to enable using combined Vulkan and Vulkan SC
    registry entries to generate combined headers for use with SC ecosystem
    tooling (internal MR 5858).
  * Add <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>> VU
    to require decorations to match between shader stages (internal MR
    5861).

-----------------------------------------------------

Change log for April 12, 2023 Vulkan 1.3.247 spec update:

GitHub Issues:

  * Fix typo in apiext:VK_EXT_shader_object sample code (public PR 2094).
  * Experimental Antora site generator code for Vulkan Documentation Project
    demo - see https://github.com/KhronosGroup/Vulkan-Site/ for more
    information and links to the live site demo (public PR 2097).
  * Fix typo to code:StdVideoDecodeH265ReferenceInfo <<decode-h265, H.265
    Decode Operations>> (public PR 2098).

Internal Issues

  * Improve wording for code:Location VUs 04917 and 04919 (internal issue
    2737).
  * Add wording about host write guarantees and non-temporal instructions
    for flink:vkDeviceWaitIdle (internal issue 3404).
  * Clarify undefined values in the <<interfaces-fragmentoutput, Fragment
    Output Interface>> section, and improve the explanation of how fragment
    shader interfaces work (internal issue 3416).
  * Add `ratification` status attribute to <extension> XML and reflect it in
    the extension appendix metadata. Add new '-spec ratified' option to
    `makeSpec` script (internal issue 3417).
  * Add a commonvalidity file `shader_create_spv_common.adoc` for creating
    SPIR-V shaders and use it for slink:VkShaderCreateInfoEXT and
    slink:VkShaderModuleCreateInfo (internal issue 3426).
  * Errata and wording improvements to apiext:VK_EXT_shader_object (internal
    issue 3435).
  * Restore two missing members that were inadvertently removed from the XML
    definition of slink:VkDeviceFaultVendorBinaryHeaderVersionOneEXT. This
    is not a functional change to the specification, and is approved by the
    implementations of the apiext:VK_EXT_device_fault extension (internal
    issue 3443).
  * Add VUs for common draw vertex binding and
    slink:VkGraphicsPipelineCreateInfo so the vertex input has matching
    signed int / unsigned int / float type in both the shader and the
    pipeline (internal MR 5627).
  * Mention <<pipelines-graphics-subsets-vertex-input, vertex input state>>
    in slink:VkGraphicsPipelineCreateInfo VUs 00736 and 00737 (internal MR
    5783).
  * Cleanup <<spirvenv, SPIR-V Environment>> appendix to use code: markup
    consistently on SPIR-V keywords (internal MR 5823).
  * Grammar, markup, and typo fixes for the
    apiext:VK_HUAWEI_cluster_culling_shader extension (internal MR 5827).
  * Use host networking in `scripts/runDocker` (internal MR 5834).
  * Clean up apiext:VK_EXT_shader_object language and extension dependencies
    when building a spec with just this extension included (internal MR
    5837).
  * Add <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>> VU
    to ensure there is a shader output for every shader input slot (internal
    MR 5843).
  * Fix code:OutputVertices language for apiext:VK_EXT_shader_object in the
    <<tessellation, Tessellator>> section to refer to the control stage, not
    the evaluation stage (internal MR 5846).

-----------------------------------------------------

Change log for March 31, 2023 Vulkan 1.3.246 spec update:

GitHub Issues:

  * Remove redundant "`input attachment`" wording in descriptions of
    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT and
    ename:VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT (public issue
    2083).
  * Add a NOTE describing state of buffers passed in
    flink:vkBindBufferMemory2::pname:pBindInfos if the command fails (public
    issue 2086).

Internal Issues

  * Add new <<spirvenv-module-validation-runtime, Runtime SPIR-V VUs>>
    restricting code:OpTypeImage multisampling to be consistent the
    slink:VkImageCreateInfo::pname:samples its bound image was created with
    (internal issue 2426).
  * Clarify that <<primsrast-sampleshading, sample interpolation>> enables
    sample shading (internal issue 2872).
  * Add <<spirvenv-module-validation-standalone, Standalone SPIR-V VUs>> for
    multiple code:OpVariable for one code:Location, and use code:Location
    and code:Component terminology consistently in related parts of the
    specification, rather than informal equivalent terms (internal MR 5630).
  * Add a new <<spirvenv-module-validation-runtime, Runtime SPIR-V VUs>>
    preventing code:InputAttachmentIndex overlaps (internal MR 5759).
  * Move apiext:VK_NV_displacement_micromap interfaces to the provisional
    `vulkan_beta.h` header (internal MR 5812).
  * Remove redundant common validity VU 07977 for buffer alignment in buffer
    <-> image copies (internal MR 5814).
  * Remove redundant slink:VkWriteDescriptorSet VU 07729 (internal MR 5815).
  * Describe multi-planar aspect masks consistently in VU statements
    (internal MR 5816).
  * Fix ptext:width -> pname:height typo in slink:VkRenderingInfo VU 07816
    (internal MR 5817).

New Extensions:

  * apiext:VK_EXT_shader_object
  * apiext:VK_EXT_shader_tile_image

-----------------------------------------------------

Change log for March 24, 2023 Vulkan 1.3.245 spec update:

GitHub Issues:

  * Tighten wording for <<descriptorsets-compatibility, Pipeline Layout
    Compatibility>> (public issue 1853).
  * Attempt to clarify "`supported`" vs. "`enabled`" in the
    <<extendingvulkan-device-extensions, Device Extensions>>,
    <<fundamentals-validusage-extensions, Valid Usage for Extensions>>, and
    <<extendingvulkan-instanceanddevicefunctionality, Instance and Device
    Functionality>> sections (public issue 2035).
  * Fix markup typo (public issue 2089).


Internal Issues

  * Fix slink:VkRayTracingPipelineCreateInfoKHR VU interactions in the
    presence of stages and groups (internal issue 3104).
  * Fix standalone SPIR-V VU 04924 to clarify components can also be arrays
    of scalars or vectors (internal issue 3411).
  * Add anchors for all <<interfaces-builtin-variables, Built-In Variables>>
    (internal issue 3418).
  * Add common image layout transition VUs to prevent inconsistent image
    barrier with separate depth/stencil (internal MR 5634).
  * Add NOTE of intended use cases for slink:VkDirectDriverLoadingListLUNARG
    to the description of slink:VkInstanceCreateInfo (internal MR 5692).
  * Update Khronos specification license terms to the latest version
    (internal MR 5717).
  * Fix slink:VkGraphicsPipelineCreateInfo VU 07725 requirement that
    code:PointSize be written to for every vertex emitted (internal MR
    5790).
  * Set missing `refpage` attribute when including some pipeline common
    VUIDs (internal MR 5795).
  * Add missing VUs to flink:vkCmdPushDescriptorSetWithTemplateKHR (internal
    MR 5798).
  * Fix style guide word choice table markup problem that resulted in
    off-by-one column errors (internal MR 5808).
  * Use style guide preferred form of "`depth/stencil format`" (internal MR
    5810).

New Extensions:

  * apiext:VK_NV_displacement_micromap

-----------------------------------------------------

Change log for March 17, 2023 Vulkan 1.3.244 spec update:

GitHub Issues:

  * Fix typo in
    slink:VkDeviceGroupRenderPassBeginInfo::pname:deviceRenderAreaCount
    (public issue 2078).

Internal Issues

  * Move copy attribute's pname: to commonvalidity attributes to aid with
    VUID generation (internal MR 5781).
  * Add a .mailmap file (internal MR 5786).
  * Refactor pipeline layout consistency VUs for
    slink:VkComputePipelineCreateInfo, slink:VkGraphicsPipelineCreateInfo,
    and slink:VkRayTracingPipelineCreateInfoNV into common validity
    statements (internal MR 5750).
  * Make VUID tag generation prioritize attributes, helping ensure tags are
    unique when the same common validity file is included twice in the same
    VU block (internal MR 5791).

New Extensions:

  * apiext:VK_KHR_map_memory2

-----------------------------------------------------

Change log for March 12, 2023 Vulkan 1.3.243 spec update:

GitHub Issues:

  * Clarify descriptions of
    ename:VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT and
    ename:VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT to include missing
    operations and properly refer to advanced blend operations (public issue
    2047).
  * Add specification language for ename:VK_REMAINING_3D_SLICES_EXT (public
    issue 2063).
  * Fix some out of date cross-references and citations. Update normative
    reference sections and cite them appropriately in the specification,
    registry schema, and style guide documents (public issue 2069).
  * Reverse aliasing of ename:VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT to a
    reserved bit for Vulkan SC (public issue 2070).
  * Add Mobileye vendor ID reservation (public pull request 2076).

Internal Issues

  * Updates to provisional video encode extensions including minor API
    changes - see change logs in the apiext:VK_EXT_video_encode_h264,
    apiext:VK_EXT_video_encode_h265, and apiext:VK_KHR_video_encode_queue
    extension appendices for more details (internal issue 3329).
  * Add VU logic for ename:VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT to
    common draw, flink:vkCmdBindPipeline, and
    slink:VkGraphicsPipelineCreateInfo (internal issue 3355).
  * Add to the NOTE in the <<queries-occlusion, Occlusion Queries>> section
    describing possible differences in query results between implementations
    even when ename:VK_QUERY_CONTROL_PRECISE_BIT is specified (internal
    issue 3364).
  * Fix a few pname:pNext pointer input-only structure members defined by
    apiext:VK_EXT_swapchain_maintenance1 to add `const` qualifiers in XML
    (internal issue 3367).
  * Clarify why setting the stride with flink:vkCmdBindVertexBuffers2 has
    additional restrictions relative to setting the static state, and add a
    corresponding issue to the apiext:VK_EXT_extended_dynamic_state appendix
    (internal issue 3391).
  * Fix reflow script so VUID tag generation / duplicate checking can be
    performed independently of text reflowing (internal issue 3394).
  * Fix some incorrectly rewritten text that looks like a link, but is not,
    in refpage source code blocks (internal issue 3401).
  * Add code:Vertex code:Location restrictions when dynamic vertex input
    state is enabled to common draw vertex binding and
    slink:VkGraphicsPipelineCreateInfo VUs (internal merge request 5541).
  * Refactor some common image copy VUs (internal merge request 5659).
  * Refactor common image copy VUs not affected by
    apiext:VK_QCOM_rotated_copy (internal merge request 5660).
  * Update XML `<extension>` dependencies for VulkanSC in cases where an
    extension has been promoted to core in that API, but the extension
    itself is not supported (internal merge request 5723).
  * Call out extension and feature dependencies explicitly in some VUs
    (internal merge request 5737).
  * Fix typo in asciidoctor conditional markup for
    slink:VkPipelineShaderStageCreateInfo VU 06716. (internal merge request
    5726).
  * Update wording of slink:VkImageViewSlicedCreateInfoEXT specifying when
    this structure is ignored (internal merge request 5734).
  * Fix wording of slink:VkD3D12FenceSubmitInfoKHR VUs 00079 and 00080
    (internal merge request 5742).
  * Use "`component`" consistently when referring to pname:format arguments,
    replacing "`aspect`" (internal merge request 5746).
  * Add missing slink:VkImageViewSlicedCreateInfoEXT VU for pname:viewType
    (internal merge request 5749).
  * Remove redundant slink:vkCmdClearAttachments dynamic rendering VUs 07882
    and 07883 (internal merge request 5751).
  * Remove redundant slink:VkGraphicsPipelineCreateInfo code:InputAttachment
    dynamic rendering VU 06056 (internal merge request 5752).
  * Fix description of mesh shader execution modes in the
    apiext:VK_EXT_mesh_shader proposal document (internal merge request
    5756).
  * Minor updates to apiext:VK_HUAWEI_cluster_culling_shader extension APIs.
    These are incompatible changes but the vendor driver release with this
    extension has not been published, so there should be no user impact
    (internal merge request 5767).
  * Restructure <<fundamentals-validusage-enums, Valid Usage for Enumerated
    Types>> and <<fundamentals-validusage-flags, Valid Usage for Flags>>
    sections to make clear that the rules for enums and flag bits follow the
    same formula, and be more precise in defining interactions with
    extensions and core versions (internal merge request 5769).
  * Make normative text and NOTE in the
    <<synchronization-pipeline-stages-masks>> section consistent (internal
    merge request 5772).
  * Refactor single-sampled requirement of copy commands into common VU
    statements (internal merge request 5776).

-----------------------------------------------------

Change log for February 26, 2023 Vulkan 1.3.242 spec update:

GitHub Issues:

  * Separate reflow document traversal and internal logic (public pull
    request 2042).
  * Specify operator evaluation in XML `depends` expressions must be
    left-to-right for operators of the same precedence (public pull request
    2066).
  * Revert to only parenthesizizing formal arguments of VK_DEFINE*HANDLE
    macros in the `vulkansc` api, to work around a bug in MSVC (public issue
    2067).

Internal Issues

  * Clarify <<ray-intersection-candidate-determination, ray transform
    invariance>> with respect to intersection with multiple instances
    (internal issue 3371).
  * Fix extraneous `+` sign appearing in dependency section of extension
    refpages (internal issue 3382).
  * Add draw dispatch common VU for
    ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT and new
    <<resources-buffer-view-format-features, Buffer View Format Features>>
    section (internal merge request 5597).
  * Move subpass self-dependency language into slink:VkSubpassDependency and
    pipeline barrier common VUs (internal merge request 5687).
  * Typo fix for double words ("`the the`") (internal merge request 5739).
  * Clarify Vulkan memory model requirements in the <<memory-model, Memory
    Model>> appendix (internal cross-api/memory-model issue 157).
  * Remove `update_valid_usage_ids.sh` script, which has not worked for a
    long time.

New Extensions:

  * apiext:VK_NV_low_latency

-----------------------------------------------------

Change log for February 16, 2023 Vulkan 1.3.241 spec update:

GitHub Issues:

  * Clarify apiext:VK_EXT_debug_utils object support (public issue 1668,
    public pull request 2034).
  * Fix capitalization typos in a few VUs (public pull request 2050).
  * Parameterize asciidoc includes of asciidoc files from `vkspec.adoc`
    using `{chapters}` attribute (public pull request 2051).

Internal XML Schema Issues:

Several needed XML schema changes are introduced in this update which may
impact downstream XML users who are doing their own parsing. Users of our
Python generator framework are unlikely to be impacted. If you have
difficulty adapting to these changes, please open an issue on the
Vulkan-Docs GitHub repository.

  * Introduce a new `depends` attribute to the XML schema, replacing the
    `requires` and `requiresCore` attributes of `<extension>` tags, and the
    `features` and `extension` attributes of `<require>` tags. This is an
    intentional and unavoidable breaking change, allowing us to correctly
    express more complex dependencies. XML users doing their own XML parsing
    and needing this information must treat the `depends` attribute as a
    boolean expression. This change also adds a description of the different
    interpretation of device and instance extension dependencies in a single
    place in the new <<extensions, "`Extension Dependencies`">> section at
    the start of the extensions appendix, rather than including a
    boilerplate comment about "`device-level extensions`" with each relevant
    extension dependency described later in the appendix (internal issue
    2883).
  * Import XML, script, and config file changes from the Vulkan SC spec
    repository. This change uses the `api` XML attribute to specialize some
    tags for the Vulkan and Vulkan SC APIs. While this is not a new
    attribute, it has not been extensively used in this fashion previously
    in this repository. XML users doing their own XML parsing must now
    filter out tags with `api` attributes not matching the API they are
    generating, and must also filter out `<extension>` tags whose
    `supported` attribute does not include that API (internal issue 3348).
  * Remove some redundancies from refactored XML dependencies (internal
    merge request 5713).
  * Express correct XML dependencies of apiext:VK_KHR_buffer_device_address,
    now that the new `depends` schema supports that (internal merge request
    5721).
  * Add a new `deprecated` attribute to several tags in XML schema which
    provides some guidance as to why an API was deprecated. Remove `comment`
    text which some downstream XML parsers were using to infer deprecation,
    which was never an intended or supported purpose of the comments (public
    ash-rs/ash issue 670, internal merge request 5537).

Other Internal Issues

  * Expand the definition of <<fundamentals-validusage-enums, "`valid
    enumerant value`">> to include whether the extension or core version
    defining that enumerant is enabled or supported. This has a global
    effect on corresponding VU statements, and the Vulkan Validation Layer
    is being updated accordingly (internal issue 2912).
  * Update the <<synchronization>> chapter in several places to clarify that
    pipeline barriers work only within a single queue (internal issue 3365).
  * Add ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR in a
    few places it was missing, and update description for copy commands to
    specify where it should be used with apiextVK_KHR_synchronization2
    rather than
    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR (internal
    merge request 5604).
  * Fix typos in `proposals/VK_KHR_video_decode_queue.adoc` (internal merge
    request 5646).
  * Add dynamic state to apiext:VK_EXT_discard_rectangles
    (ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT and
    ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT) and for
    apiext:VK_NV_scissor_exclusive
    (ename:VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV) that was overlooked
    in apiext:VK_EXT_extended_dynamic_state3. While this is adding
    functionality to existing extensions, the implementers of these
    extensions have all signed off on this change (internal merge request
    5671).
  * Disallow ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK in
    slink:VkDescriptorGetInfoEXT VU 08018 (internal merge request 5681).
  * Rearrange some language in flink:vkGetRayTracingShaderGroupHandlesKHR
    and flink:vkGetRayTracingCaptureReplayShaderGroupHandlesKHR to follow
    the style guide (internal merge request 5683).
  * Update to new Docker image SHA for CI and building specs (internal merge
    request 5688).
  * Add `SPV_EXT_fragment_fully_covered` to XML `<spirvextensions>` section
    (internal merge request 5689).
  * Add missing pname:pNext description to
    slink:VkVideoDecodeH264DpbSlotInfoKHR (internal merge request 5701).
  * Add missing internal links for the term
    <<pipelines-graphics-subsets-fragment-shader, fragment shader state>>
    (internal merge request 5704).
  * Move ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY VU common draw vertex
    binding VUs, and word VUs 03420 and 07500 the same, minus the reference
    to pname:dynamicPrimitiveTopologyUnrestricted (internal merge request
    5708).
  * Ban some advanced blend modes from slink:VkColorBlendEquationEXT that
    must be set using a different mechanism (internal merge request 5705).
  * Update copyright dates to 2023, and add CI check for Khronos-copyright
    files (internal merge request 5716).
  * Add clarifying NOTE and typo fixes for
    apiext:VK_HUAWEI_cluster_culling_shader (internal merge request 5718).
  * Add missing XML dependencies on
    apiext:VK_KHR_get_physical_device_properties2 to several extensions
    (internal merge request 5719).
  * Remove flink:vkCmdResolveImage VUs where pname:srcImage is of type
    ename:VK_IMAGE_TYPE_3D (internal vulkansc issue 178).

New Extensions:

  * apiext:VK_EXT_image_sliced_view_of_3d
  * apiext:VK_ARM_shader_core_properties
  * apiext:VK_QCOM_multiview_per_view_render_areas

-----------------------------------------------------

Change log for January 26, 2023 Vulkan 1.3.240 spec update:

GitHub Issues:

  * Fix <<limits-maxPushDescriptors, pname:maxPushDescriptors>> description
    (public pull request 2038).

Internal Issues:

  * Finish banning NULL pipeline layouts in
    slink:VkGraphicsPipelineCreateInfo VUs (internal merge request 5673).
  * Fix flink:vkCmdDrawIndirectByteCountEXT VU 02289 to refer to the correct
    structure name (internal merge request 5674).
  * Clarify how to define an inactive acceleration structure instance in the
    <<acceleration-structure-update, Acceleration Structure Update Rules>>
    (internal merge request 5677).
  * Add missing common draw and draw dispatch VUs when setting dynamic state
    at draw time (internal merge request 5679).
  * Add more information about pname:texelBufferAlignment promotion to core
    in the apiext:VK_EXT_texel_buffer_alignment and <<versions-1.3, Version
    1.3>> appendix language (internal merge request 5680).

New Extensions:

  * apiext:VK_EXT_pipeline_library_group_handles

-----------------------------------------------------

Change log for January 19, 2023 Vulkan 1.3.239 spec update:

GitHub Issues:

  * Clarify semaphore/fence behavior of flink:vkAcquireNextImageKHR so that
    if successful, both semaphore and fence will be signaled (whichever
    provided), and if not successful, both are unaffected (public issues
    1533, 1776, 2009).
  * Update common draw VU 07751 to require that
    flink:vkCmdSetDiscardRectangleEXT was called for each discard rectangle
    when the corresponding dynamic state is enabled (public issue 1657).
  * Add ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR to
    access masks VUs (public pull request 1997).
  * Fix a typo in flink:vkCmdSetCoverageToColorLocationNV (public pull
    request 2000).
  * Clarify interpretation of H.265 reference indices
    code:RefPicSetStCurrBefore, code:RefPicSetStCurrAfter, and
    code:RefPicSetLtCurr (public issue 2010).
  * Add missing dimension VUs for slink:VkRenderingInfo (public issue 2015).
  * Fix <<formats-mandatory-features-32bit, Mandatory format support: 32-bit
    components>> table to support ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
    for ename:VK_FORMAT_R32_SFLOAT without apiext:VK_EXT_shader_atomic_float
    (public pull request 2011).
  * Fix incorrect link in apiext:VK_KHR_create_renderpass2 appendix (public
    pull request 2037).

Internal Issues:

  * Add `scripts/stripAPI.py` to transform the XML by removing non-matching
    `api` elements (internal issue 3281).
  * Update introduction of the <<fragops, Fragment Operations>> chapter to
    allow the <<fragops-samplemask, sample mask test>> to be performed after
    <<fragops-samplecount, sample counting>> (internal issue 3330).
  * Add slink:VkImageViewCreateInfo VU to disallow creating image views with
    multiple plane bits (internal issue 3332)
  * Add a new VU to slink:VkGraphicsPipelineCreateInfo requiring pipeline
    layout compatibility in the graphics pipeline library link step
    (internal issue 3334).
  * Report an error message from generator scripts when an unknown name is
    referenced, rather than just failing (internal merge request 5614).
  * Document in elink:VkPipelineCreateFlagBits that
    ename:VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
    and
    ename:VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT
    are only needed when combining fragment shading rate or fragment density
    maps with dynamic rendering (internal merge request 5616).
  * Moved a VU for index offsets when pname:robustBufferAccess2 is not
    enabled from flink:vkCmdDrawIndexed to become a common VU for all the
    index buffer draw calls (internal merge request 5623).
  * Add VUs to slink:VkWriteDescriptorSet and slink:VkDescriptorImageInfo
    restricting use of other descriptor types from being a 2D view of a 3D
    image (internal merge request 5626).
  * Clarify that the tlink:PFN_vkReallocationFunction callback may return
    `NULL` (internal merge request 5637).
  * Clarify that apiext:VK_KHR_format_feature_flags2 only has to be
    supported, not enabled, in the <<resources-image-view-format-features,
    Image View Format Features>> section (internal merge request 5651).
  * Factor some VUs out of the `copy_bufferimage_to_imagebuffer_common`
    common VU file into a new
    `copy_bufferimage_to_imagebuffer_buffer_alignment_common` file (internal
    merge request 5657).
  * Add new driver id ename:VK_DRIVER_ID_IMAGINATION_OPEN_SC (internal merge
    request 5658).
  * Factor some VUs out of the `image_memory_barrier_common` common VU file
    into a new `image_layout_transition_common` file (internal merge request
    5662).
  * Clarify that format-less buffer views only apply to storage texel
    buffers in the <<features-shaderStorageImageReadWithoutFormat>>,
    <<features-shaderStorageImageWriteWithoutFormat>>, and
    <<formats-without-shader-storage-format, Formats without shader storage
    format>>, sections and for elink:VkFormatFeatureFlagBits2 (internal
    merge request 5668).

New Extensions:

  * apiext:VK_HUAWEI_cluster_culling_shader

-----------------------------------------------------

Change log for December 19, 2022 Vulkan 1.3.238 spec update:

Internal Issues:

  * Do not require in-bounds index buffers for flink:vkCmdDrawIndexed if
    pname:robustBufferAccess2 is enabled (internal issue 3311).
  * Only download needed parts of VK-GL-CTS repository for CI test (internal
    issue 3315).
  * Add a NOTE that etext:FORMAT_FEATURE_*_ATOMIC_BIT
    are only advertised for single-component formats
    (internal issue 3318).
  * Add a common acceleration structure copy VU disallowing src/dst overlap
    (internal merge request 5587).
  * Add common VUs for EXT mesh draw calls (internal merge request 5588).
  * Change validation of flink:vkGetImageSubresourceLayout2EXT to allow
    queries of images with ename:VK_IMAGE_TILING_OPTIMAL tiling (internal
    merge request 5590).
  * Add VUs to flink:vkCmdBuildAccelerationStructureNV and common
    acceleration structure copy VUs to require pname:dst to be bound
    completely and contiguously (internal merge request 5602).
  * Fix typo in member name ptext:presentScaling -> pname:scalingBehavior
    for slink:VkSwapchainPresentScalingCreateInfoEXT (internal merge request
    5603).
  * Remove common copy image sample count VU 07745, which duplicates VU
    00136 (internal merge request 5605).
  * Fix common image memory barrier layout VU to refer to correct members
    instead of nonexist pname:layout (internal merge request 5608).

New Extensions:

  * Add final (non-provisional) versions of the Vulkan Video Core and Decode
    extensions (internal merge request 5351):
  ** apiext:VK_KHR_video_queue
  ** apiext:VK_KHR_video_decode_queue
  ** apiext:VK_KHR_video_decode_h264 (promoted from EXT)
  ** apiext:VK_KHR_video_decode_h265 (promoted from EXT)

-----------------------------------------------------

Change log for December 8, 2022 Vulkan 1.3.237 spec update:

Public Issues:

  * Fix multiple function pointer type definition problem introduced by
    apiext:VK_LUNARG_direct_driver_loading and update CI tests to catch this
    type of issue going forward (public issue 1998).
  * Fix typo in flink:vkCmdCopyImageToBuffer (public issue 1999).
  * Do not require ename:VK_STENCIL_OP_KEEP in
    flink:vkCmdSetStencilWriteMask and
    slink:VkPipelineDepthStencilStateCreateInfo if both front and back
    pname:writeMask values are zero (public Vulkan-ValidationLayers issue
    4921).

Internal Issues:

  * Run Vulkan CTS framework tests as part of CI (internal issue 3274).
  * Clarify that <<spirvenv-evaluation-expressions, denorm ops can reorder
    without code:NoContract (internal issue 3303).
  * Add the <<resources-memory-overlap, Resource Memory Overlap>> section to
    clarify that there is no cache line hazard (internal issue 3306).
  * Restrict ename:VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT to
    three-dimensional images in slink:VkImageCreateInfo and
    elink:VkImageCreateFlagBits (internal merge request 5589).

New Extensions:

  * apiext:VK_EXT_surface_maintenance1
  * apiext:VK_EXT_swapchain_maintenance1

-----------------------------------------------------

Change log for December 1, 2022 Vulkan 1.3.236 spec update:

Public Issues:

  * Fix Roadmap 2022 JSON by moving pname:lineWidthGranularity and
    pname:pointSizeGranularity to the optionals section of the profile
    (public Vulkan-Profiles issue 321).
  * Expand description of <<devsandqueues-lost-device, Lost Device>> to
    describe how to determine which commands may be affected and return
    ename:VK_ERROR_DEVICE_LOST (public issue 1968).
  * Clarify that input attachment descriptors follow static use rules in the
    <<compatibility-inputattachment, Fragment Input Attachment
    Compatibility>> section and common drawing VUs (public issue 1979).
  * Move WinRT extensions into `vulkan_win32.h` header (public issue 1980).
  * Remove `returnedonly` attribute from slink:VkSubresourceLayout in XML
    (public issue 1988).

Internal Issues:

  * Do not use basetype: for external API types without definitions in the
    Specification, and make basetype: link to the corresponding API
    (internal issue 2703, fixes one sub-issue of public issue 1984).
  * Clarify treatment of shared depth/stencil images in depth-only or
    stencil-only resolve attachments for slink:VkRenderingAttachmentInfo
    (internal issue 3243).
  * Clarify language for acceleration structure and micromap scratch access
    bits (internal issue 3244).
  * Clarify that code:Output variable writes have an effect in
    <<shaders-helper-invocations, Helper Invocations>> (internal issue
    3270).
  * Add missing apiext:VK_EXT_discard_rectangles common drawing VU (internal
    issue 3292).
  * Add VUs to slink:VkRenderingInfo preventing inconsistent layout usage
    (internal issue 3301).
  * Change parent of slink:VkSwapchainKHR to slink:VkDevice (internal merge
    request 5521).
  * Add and tidy up some shared common image copy VUs (internal merge
    request 5371).
  * Fix apiext:VK_EXT_color_write_enable common drawing VUs (internal merge
    request 5548).
  * Add missing apiext:VK_EXT_discard_rectangles common drawing VU (internal
    merge request 5549).
  * Rename slink:VkVideoDecodeH265PictureInfoEXT members ptext:sliceCount ->
    pname:sliceSegmentCount and ptext:sliceOffsets ->
    pname:sliceSegmentOffsets (internal merge request 5550).
  * Clarify <<ray-tracking-capture-replay, Ray Tracing Capture Replay>>
    section and related language for
    slink:VkRayTracingShaderGroupCreateInfoKHR::pname:pShaderGroupCaptureReplayHandle
    and flink:vkGetRayTracingCaptureReplayShaderGroupHandlesKHR (internal
    merge request 5555).
  * Add shader interface variable type and width constraint VU to
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    (internal merge request 5556).
  * Clarify that code:PointSize is not always needed for mesh shaders in
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    VU 07728 (internal merge request 5562).
  * Fix minor markup consistency typos in feature and limit xrefs (internal
    merge request 5563).
  * Fix typo in apiext:VK_QCOM_image_processing for required value of
    code:unnormalizedCooordinates for the input code:sampler (internal merge
    request 5564).
  * Fix typo in slink:VkDescriptorDataEXT language (internal merge request
    5568).
  * Add a NOTE to the apiext:VK_NV_optical_flow appendix and update the
    allowed command queues for flink:vkCmdResetQueryPool and
    flink:vkVmdWriteTimestamp in the XML to include the optical flow queue
    (internal merge request 5570).
  * Require Wayland WSI implementations to send code:wl_surface.commit in
    flink:vkQueuePresentKHR for all present modes (internal merge request
    5574).
  * Add missing slink:VkBindImageMemoryInfo VU for
    etext:VK_IMAGE_CREATE_DISJOINT_BIT images (internal merge request 5580).
  * Fix markup of some common stage mask VUs to prevent duplicate VUIDs
    being generated (internal merge request 5581).
  * Add a common draw/dispatch VU for image view shader mapping (internal
    merge request 5583).
  * Update the registry schema document to describe all allowed command
    queue types.

New Extensions:

  * apiext:VK_LUNARG_direct_driver_loading
  * apiext:VK_QCOM_multiview_per_view_viewports

-----------------------------------------------------

Change log for November 17, 2022 Vulkan 1.3.235 spec update:

Public Issues:

  * Require Vulkan 1.1 for apiext:VK_EXT_mesh_shader in XML (public issue
    1976).
  * Reserve driver ID for NVK (public pull request 1983).

Internal Issues:

  * Add VUs for code:PointSize with mesh shaders to
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    and slink:VkGraphicsPipelineCreateInfo (internal issues 681 and 2727).
  * Add the <<features-shadingRateImage, pname:shadingRateImage>> for a
    slink:VkImageCreateInfo VU (internal merge request 5552).

New Extensions:

  * apiext:VK_EXT_descriptor_buffer

-----------------------------------------------------

Change log for November 10, 2022 Vulkan 1.3.234 spec update:

Public Issues:

  * Add slink:VkGraphicsPipelineCreateInfo VUs for using code:ViewIndex and
    for shader interactions, and make phrasing of some other VUs for this
    structure consistent (public Vulkan-ValidationLayers issue 1749).

Internal Issues:

  * Reorder <<synchronization-pipeline-stages-supported, Supported pipeline
    stage flags>> table to more closely match the order in
    elink:VkPipelineStageFlagBits2, add some missing stages, and group flag
    bits representing multiple stages with the individual stages they
    represent (internal issue 3260).
  * Add an issue to the apiext:VK_KHR_fragment_shading_rate proposal
    document clarifying that the default fragment size participates in
    combination operations (internal issue 3266).
  * Clarify that references in entry point interface lists are not "`Static
    Use`" in its glossary definition (internal issue 3287).
  * Add VU for flink:vkGetPhysicalDeviceExternalImageFormatPropertiesNV
    restricting pname:externalHandleType to at most one bit set (internal
    merge request 5528).
  * Add missing code:SPV_NV_shader_invocation_reorder `spirvextension` tag
    in XML (internal merge request 5529).
  * Minor consistency edits to spec language for recently released NV
    extensions - array / bitmask / feature requirement wording, reorder
    sections so refpages are correctly formatted, remove un-needed
    asciidoctor attributes (internal merge request 5530).
  * Update Roadmap 2022 JSON to correct the `maxInlineUniformTotalSize`
    limit to 256 instead of 4, matching the specification text (internal
    merge request 5531).
  * Correct "`less than`" to "`less than or equal to`" in VU for mipmap
    levels in flink:vkCmdClearColorImage and
    flink:vkCmdClearDepthStencilImage (internal merge request 5533).
  * Properly conditionalize and markup language for required pipeline state
    interactions with apiext:VK_EXT_graphics_pipelin_library (internal merge
    request 5535).
  * Add a NOTE to flink:vkSetEvent clarifying when to signal events waited
    for in a command buffer (internal merge request 5536).
  * Add code:HitObjectAttributeNV to
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    VU 06672 (internal merge request 5538).
  * Use consistent wording for "`_handle_ is not dlink:VK_NULL_HANDLE`" and
    update style guide accordingly.

-----------------------------------------------------

Change log for November 3, 2022 Vulkan 1.3.233 spec update:

Internal Issues:

  * Tighten wording around <<descriptor-validity>> and in the
    <<descriptor-set-initial-state>> section (internal issue 3248).
  * Add VU for code:Component decoration on 64 bit types in
    <<spirvenv-module-validation-standalone Standalone SPIR-V Validation>>
    (internal merge request 5495).
  * Clarify the meaning of "`new image`" in flink:vkWaitForPresentKHR
    (internal merge request 5513).
  * Fix conditional markup around common VUs for
    flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR (internal merge request
    5514).
  * Unify some image usage VUs for slink:VkSwapchainCreateInfoKHR (internal
    merge request 5515).
  * Add some missing conditional markup around common draw VUs for
    apiext:VK_EXT_extended_dynamic_state3, add its features to the
    <<features-requirements, Feature Requirements>> section, and update the
    extension proposal document to fix some typos (internal merge request
    5517).
  * Fix slink:VkCommandBufferInheritanceRenderingInfoKHR VU 06492 along with
    minor markup fixes for an extension glossary term (internal merge
    request 5518).
  * Disallow input attachments being null for
    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT by refactoring
    slink:VkWriteDescriptorSet VUs (internal issue 3246).
  * Add `SPV_AMD_shader_early_and_late_fragment_tests` to `<spirvextension>`
    XML (internal issue 3276).
  * Fix Makefile dependencies to avoid rebuilding the HTML targets
    unnecessarily, and add a dependency to the `allchecks` Makefile target
    to validate links in the HTML specification output, building it if
    necessary. Note that the new check should be expected to fail unless
    building with `makeSpec -spec all` (internal merge request 5525).
  * Tag apiext:VK_IMG_format_pvrtc as deprecated in XML (internal merge
    request 5527).

New Extensions:

  * apiext:VK_NV_memory_decompression
  * apiext:VK_NV_ray_tracing_invocation_reorder
  * apiext:VK_NV_copy_memory_indirect

-----------------------------------------------------

Change log for October 27, 2022 Vulkan 1.3.232 spec update:

Public Issues:

  * Improve code:OpPtrAccessChain code:Base storage class VUs (public
    KhronosGroup/SPIRV-Tools pull request 4965).

Internal Issues:

  * Force applications to specify ename:VK_FORMAT_UNDEFINED for an unused
    attachment in both slink:VkPipelineRenderingCreateInfoKHR and
    slink:VkCommandBufferInheritanceRenderingInfoKHR. The previous behaviour
    of allowing unused attachments to have any format is not supported on
    some conformant implementations that have shipped and cannot be updated.
    This functionality is intended to be restored via a new extension in the
    near future (internal issue 3123).
  * Minor VU fixes for apiext:VK_EXT_extended_dynamic_state3 (internal issue
    3253).
  * Add missing VUs identified during validation layer work for
    apiext:VK_EXT_extended_dynamic_state3 (internal issue 3261).
  * Fix some minor markup and asciidoctor conditionalization errors causing
    dead internal links in some builds of the specification (internal issues
    3267, 3269).
  * Fix misleading warnings from refpage generation and add a couple of
    missing API descriptions it turned up (internal issue 3271).
  * Fix missing extension interaction in generated interfaces description
    for apiext:VK_EXT_legacy_dithering (internal merge request 5479).
  * Clarify how VUs on slink:VkBuffer aliasing for overlapping ranges of
    device memory work for flink:vkGetBufferDeviceAddressEXT (internal merge
    request 5489).
  * Update XML to fix generated VU for
    flink:vkCmdSetColorWriteMaskEXT::pname:pColorWriteMasks (internal merge
    request 5497).
  * Move VU for flink:vkCmdSetAlphaToOneEnableEXT to the right place
    (internal merge request 5500).
  * Add Khronos Roadmap 2022 JSON profile file under `xml/profiles/`, and
    export it to the Vulkan-Headers repository when updating the
    specification (internal merge request 5504).
  * Minor XML reorganization to work around a CTS code generation error
    (internal merge request 5509).
  * Add a new limit property to
    slink:VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM. The corresponding
    extension has not yet been implemented, so this shouldn't cause a
    compatibility break (internal merge request 5512).


-----------------------------------------------------

Change log for October 13, 2022 Vulkan 1.3.231 spec update:

Public Issues:

  * Add a NOTE about custom border color with combined depth/stencil formats
    and rewrite a corresponding valid usage statement (public issue 1950).
  * Clarify memory domain operation in slink:VkBufferMemoryBarrier for
    ename:VK_ACCESS_HOST_WRITE_BIT and ename:VK_ACCESS_HOST_READ_BIT (public
    issue 1958).
  * Fix slink:VkDescriptorSetLayoutBinding refpage layout (public issue
    1964).
  * Clarify apiext:VK_EXT_mesh_shader builtin execution modes in
    code:PrimitivePointIndicesEXT, code:PrimitiveLinIndicesEXT, and
    code:PrimitiveTriangleIndicesEXT valid usage statements (public pull
    request 1965).

Internal Issues:

  * Clarify behavior of return values when multiple pipelines fail to be
    created when using apiext:VK_EXT_pipeline_creation_cache_control
    (internal issue 3121).
  * Add valid usage statement for flink:vkCmdExecuteCommands clarifying that
    only occlusion and pipeline statistics queries can be inherited in
    slink:VkCommandBufferInheritanceInfo (internal issue 3142).
  * Remove `requiredbitmask` valid usage statement for
    slink:VkSubmitInfo::pname:pWaitDstStageMask by adding `optional`
    attribute to the corresponding XML (internal issue 3200).
  * Clarify <<deferred-host-operations-requesting, allocator expectations
    for deferred host operations>> (internal issue 3202).
  * Add missing SPIR-V capability code:FragmentFullyCovered for
    apiext:VK_EXT_conservative_rasterization in XML and the extension
    appendix (internal issue 3221).
  * Clarify interaction of apiext:VK_KHR_pipeline_robustness with
    apiext:VK_KHR_pipeline_library for
    slink:VkPipelineRobustnessCreateInfoEXT (internal issue 3227).
  * Clarify that code:OpTypeImage code:MS can be 1 for multisampled
    rendering to single samples (internal issue 3231).
  * Clarify behavior of
    ename:VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT in
    slink:VkPipelineRobustnessBufferBehaviorEXT and
    slink:VkPipelineRobustnessImageBehaviorEXT (internal issue 3237).
  * Fix incorrect structure reference for
    ename:VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT in elink:VkDynamicState
    (internal issue 3257).
  * Standardize definitions within the copies chapter - formal mathematical
    definitions for pseudocode buffer/image addressing, remove redundant
    YCbCr text, move apiext:VK_QCOM_rotated_copy_commands to the standard
    location for buffer/image copies (internal merge request 5372).
  * Fix SPV and GLSL links in the apiext:VK_EXT_opacity_micromap appendix
    (internal merge request 5461).
  * Use "`enabled *on* the device`" consistently in preference to "`enabled
    *in* the device`", and add a corresponding style guide rule (internal
    merge request 5475).
  * Update Docker instructions in `BUILD.adoc` and add a helper script
    `scripts/runDocker` to run Docker with the latest Khronos build image
    (internal merge request 5483).

New Extensions:

  * apiext:VK_ARM_shader_core_builtins

-----------------------------------------------------

Change log for September 29, 2022 Vulkan 1.3.230 spec update:

Public Issues:

  * Add common valid usage statements for bind buffer and bind image
    commands to prevent rebinding resources after slink:vkFreeMemory (public
    issue 1937).

Internal Issues:

  * Add common valid usage statements for drawing commands to prevent
    binding an input attachment descriptor with an image view that is not in
    the framebuffer (internal issue 3223).
  * Fix references to nonexistent 'fragmentShadingRate' feature (internal
    issue 3235).
  * Add valid usage statement to flink:vkCmdCopyQueryPoolResults disallowing
    usage on active queries (internal issue 3236).
  * Update structure layouts in `video.xml` for the provisional video
    extensions to address alignment issues (internal issue 3242).
  * Clarify that slink:VkGraphicsPipelineLibraryCreateInfoEXT::pname:flags
    excludes linked libraries (internal merge request 5447).
  * Change the type of slink:VkVideoReferenceSlotInfoKHR::pname:slotIndex to
    `int32_t` in the provisional video extensions (internal merge request
    5452).

New Extensions:

  * apiext:VK_EXT_device_address_binding_report
  * apiext:VK_EXT_device_fault
  * apiext:VK_EXT_extended_dynamic_state3
  * apiext:VK_EXT_pipeline_protected_access
  * apiext:VK_NV_optical_flow
  * apiext:VK_NV_present_barrier

-----------------------------------------------------

Change log for September 22, 2022 Vulkan 1.3.229 spec update:

Public Issues:

  * Add pname:maxMeshWorkGroup*Count limits when no task shader is used, and
    refactor some mesh shader valid usage statements for
    slink:VkDrawMeshTasksIndirectCommandEXT and flink:vkCmdDrawMeshTasksEXT
    into a common validity block (public merge request 1936).
  * Add SPIR-V valid usage statement for the mesh shader output count, and
    remove some redundant slink:VkPipelineShaderStageCreateInfo valid usage
    statements (public merge request 1938).
  * Add a comment to the <<versions-1.2-promotions, Differences relative to
    VK_EXT_shader_viewport_index_layer>> section describing how the
    code:ShaderViewportIndexLayerEXT capability was split into two
    capabilities in Vulkan 1.2 (internal merge request 1951).

Internal Issues:

  * Be more explicit about floating-point rules in the
    <<spirvenv-precision-operation, Precision and Operation of SPIR-V
    Instructions>> section (internal issues 2795, 2845).
  * Miscellaneous minor phrasing and XML fixes for the H.264 / H.265
    provisional video extensions (internal issue 3065).
  * Clarifications to the style guide to clarify terminology for EXT
    extension process and specify behavior more tightly than before
    (internal merge request 5268).
  * Add a CI script to check consistency of internal links in HTML output
    (internal merge request 5433).
  * Updates to provisional video extensions (internal merge request 5434)
    including:
  ** Remove H.264 MVC support from apiext:VK_EXT_video_decode_h264.
  ** Rename parameter set related fields in the provisional video extension
     APIs.
  ** Rename and clarify miscellaneous parameters in the provisional video
     extension APIs.
  ** Fix implicit valid usage related markup in `vk.xml` related to the core
     and decode video extension APIs.
  ** Add previously missing definitions and fix incorrect definitions in the
     Video Std headers.

-----------------------------------------------------

Change log for September 15, 2022 Vulkan 1.3.228 spec update:

Public Issues:

  * Specify that <<pipelines-graphics-subsets-dynamic-state, dynamic state
    for pipeline subsets>> is ignored (public issue 1902).
  * Remove un-needed `wayland-client.h` include from `vulkan.h` (public pull
    request 1905).
  * Add valid usage statement requiring an index buffer be bound for indexed
    drawing commands (public issue 1924).
  * Miscellaneous markup fixes (public pull request 1946).

Internal Issues:

  * Clarify that flink:vkCmdWaitEvents must: not execute before a
    flink:vkSetEvent it waits on (internal issue 2971).
  * Update valid usage statement in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V>> section to
    clarify the interaction of *Workgroup* *Scope* with code:ExecutionModel
    *TessellationControl* (internal issue 3071).
  * Fix
    slink:VkMemoryDedicatedRequirementsKHR::pname:requiresDedicatedAllocation
    for ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT (internal issue 3074).
  * Clarify in elink:VkFormatFeatureFlagBits that
    ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT and
    ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT are implied for unextended
    Vulkan 1.0 (internal issue 3099).
  * Add `tasks` attribute to XML `<command>` tags and tag core, KHR, and EXT
    commands (internal issue 3117).
  * Add more valid usage statements to prohibit feedback loop layouts when
    the pname:attachmentFeedbackLoopLayout feature is not enabled (internal
    issue 3189).
  * Clarify in the <<fundamentals-floatingpoint, Floating-Point
    Computation>> section that Inf and NaN inputs and outputs may: result in
    undefined values (internal issue 3208).
  * Update common valid usage statements for stage masks to properly
    interact with apiext:VK_NV_shading_rate_image and
    apiext:VK_KHR_fragment_shading_rate (internal issue 3228).
  * Disallow permanent semaphore/fence imports with copy transference in
    slink:VkImportFenceFdInfoKHR and slink:VkImportSemaphoreFdInfoKHR
    (internal merge request 4930).
  * Specify in flink:vkGetPhysicalDeviceSurfacePresentModesKHR and
    slink:VkSurfaceCapabilities2KHR that some surface properties are
    undefined when apiext:VK_GOOGLE_surfaceless_query is used (internal
    merge request 5157).
  * Add an Informative section describing the
    <<boilerplate-video-std-headers, Video Std Headers>> provided with the
    provisional video extensions (internal merge request 5384).
  * Clarify Boolean values vs. <<limits-maxComputeSharedMemorySize,
    pname:maxComputeSharedMemorySize>> (internal merge request 5386).
  * Update markup for the <<boilerplate-wsi-header-table, Window System
    Extensions and Headers>> table to render all header files no matter
    which extensions the spec is built with (internal merge request 5411).
  * Move timestamp example to the correct issue in the
    apiext:VK_EXT_calibrated_timestamps extension appendix (internal merge
    request 5420).
  * Add missing flink:vkCmdPushDescriptorSetWithTemplateKHR valid usage
    statements for pname:set (internal merge request 5428).

New Extensions:

  * apiext:VK_EXT_mutable_descriptor_type (promoted from `VALVE`).

-----------------------------------------------------

Change log for September 8, 2022 Vulkan 1.3.227 spec update:

Public Issues:

  * Add interactions for dynamic rendering in flink:vkCmdClearAttachments
    (public issue 1835).
  * Add code:MinLod clamping rules to <<textures-gather, Texel Gathering>>
    and update the <<features-minLod, pname:minLod>> feature and
    slink:VkImageViewMinLodCreateInfoEXT to reference that language
    (partially resolves public issue 1836).
  * Remove `ifdef` from <<spirvenv-module-validation-standalone, Standalone
    SPIR-V>> valid usage statement (public pull request 1926).
  * Assign VUID 07119 to a <<spirvenv-module-validation-standalone,
    Standalone SPIR-V>> valid usage statement that didn't get one in the
    last spec update (public issue 1928).
  * Add missing <<spirvenv-module-validation-runtime, Runtime SPIR-V>> valid
    usage statements for apiext:VK_EXT_mesh_shader (public pull request
    1931).
  * Fix duplicate
    slink:VkGraphicsPipelineCreateInfo::pname:pInputAssemblyState
    description (public issue 1934).

Internal Issues:

  * Add a valid usage statement for
    ename:VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR to the common
    validity statements for barriers (internal issue 3188).
  * A valid usage statements to performance query begin commands requiring
    matching queue family index (internal issue 3207).
  * Add a `stride` attribute to the XML to annotate arrays passed to
    commands where consecutive members are not tightly packed (internal
    issue 3205).
  * Fix the `limittype` attribute value for
    slink:VkPhysicalDeviceVulkan11Features::pname:subgroupSize and
    slink:VkPhysicalDeviceSubgroupProperties::pname:subgroupSize (internal
    issue 3209).
  * Eliminate Asciidoctor warnings about duplicate feature anchors in
    `validusage` build target (internal issue 3216).
  * Add the Vulkan logo to the specification PDF title page and HTML
    document header (internal issue 3217).
  * Markup fixes for VkPerformanceCounterResultKHR and
    VkPipelineRobustnessCreateInfoEXT (internal issue 3219).
  * Add a new section of the <<lexicon, Lexicon>> appendix for
    <<lexicon-video-abbreviations, video-specific abbreviations>> (internal
    merge request 5345).
  * Add <<formats-size-compatibility, size compatible>> definition to the
    <<formats, Formats>> chapter and use it to replace the old "`format size
    compatibility`" language in the <<copies, Copy Commands>> chapter
    (internal merge request 5369).
  * Remove the "`blocked image`" definition from and instead distinguish
    images with a 1x1x1 <<formats-compatibility-classes, texel block
    extent>> from other images. Use this language to simplify valid usage
    statements in the <<copies, Copy Commands>> chapter (internal merge
    request 5370).
  * Add valid usage statement to the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V>> section
    requiring code:Boolean values to be code:BuiltIn values for code:Input /
    code:Output (internal merge request 5387).
  * Add and update valid usage statements for drawing commands with
    multisampled pipelines and single-sampled attachments when
    apiext:VK_EXT_multisampled_render_to_single_sampled is enabled (internal
    merge request 5392).
  * Remove pname:apiVersion loading requirements for implicit layers from
    slink:VkApplicationInfo (internal merge request 5393).
  * Minor markup fixes for slink:VkPipelineRobustnessCreateInfoEXT (internal
    merge request 5399).
  * Refactor style guide markup and use consistent anchor naming scheme
    (internal merge request 5400).
  * Require apiext:VK_KHR_spirv_1_4 for apiext:VK_EXT_mesh_shader in
    `vk.xml` (internal merge request 5401).
  * Add the <<shaders-termination, Shader Termination>> section and a
    corresponding valid usage statement for draw dispatch commands
    (cross-api/memory-model issue #145).

New Extensions:

  * apiext:VK_EXT_legacy_dithering (internal merge request 5042).

-----------------------------------------------------

Change log for September 1, 2022 Vulkan 1.3.226 spec update:

Public Issues:

  * Add missing SPV_KHR_ray_tracing storage class valid usage statement for
    code:ShaderRecordBufferKHR (public merge request 1895).
  * Add a NOTE to slink:VkAccelerationStructureCreateInfoKHR about
    ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR (public issue 1904).
  * Add a standalone SPIR-V valid usage statement for code:OpImageWrite
    component mismatch (public merge request 1916).
  * Generate the "`SPIRV Image Format`" and "`Plane Compatibility Format`"
    tables from `vk.xml` (public merge request 1922).
  * Add a NOTE to dlink:VK_USE_64_BIT_PTR_DEFINES to define its availability
    Vulkan headers starting with VK_HEADER_VERSION 174 (public merge request
    1918).

Internal Issues:

  * Update issue #2 in the apiext:VK_EXT_depth_range_unrestricted appendix
    to match core spec text (internal issue 2445).
  * Clarify <<shaders-interpolation-decorations, Interpolation decorations>>
    in pre-rasterization (internal issue 2721).
  * Relax implicit layer disabling requirements in slink:VkApplicationInfo
    (internal issue 2856).
  * Update <requires> `extension` attribute in XML to support multiple
    extensions with AND/OR connectives (internal issue 2922).
  * Update provisional video API queries for usage hint and optimized
    implementation settings (internal issue 2986).
  * Relax slink:VkImageViewCreateInfo valid usage statement 01584 to allow
    layers/levels for compressed format views of compressed format images
    (internal issue 3063).
  * Remove slink:VkImageViewCreateInfo valid usage statement 04739 (internal
    issue 3164).
  * Specify that addresses returned by flink:vkGetBufferDeviceAddress must
    satisfy the alignment requirements of the device (internal issue 3176).
  * Update makeSpec script to properly clean OUTDIR when it's explicitly
    specified (internal issue 3194).
  * Ensure that a mutable type list is provided in
    slink:VkDescriptorSetLayoutCreateInfo when required (internal issue
    3198).
  * Update clarity of the Khronos specification copyright statement
    regarding normative references to external specifications and the
    Khronos Intellectual Property Rights Policy (internal issue 3203).
  * Rename '.txt' -> '.adoc' for all Asciidoctor markup files in the
    repository, and update scripts and tools to match (internal issue 3204)
  * Tag apiext:VK_ARM_rasterization_order_attachment_access as promoted to
    EXT in XML (internal merge request 5364)
  * Fix a typo in the "` Color Sample Coverage`" section (internal merge
    request 5367)
  * Fix apiext:VK_EXT_fragment_density_map2 appendix to include the correct
    extension interface information (internal merge request 5368)
  * Remove unwieldy and unnecessary list of copy functions from the
    introduction of the <<copies, Copy Commands>> chapter (merge request
    5373).
  * Move Asciidoctor attributes enabling version and extension attributes
    into a generated file `specattribs.adoc` (internal merge request 5396).

New Extensions

  * apiext:VK_EXT_depth_clamp_01
  * apiext:VK_EXT_mesh_shader

-----------------------------------------------------

Change log for August 18, 2022 Vulkan 1.3.225 spec update:

  * Update release number to 225 for this update.

Public Issues:

  * Remove unused code from `spirvcapgenerator.py` (public merge request
    1912).
  * Remove redundant ftext:vkCmdDraw*Indirect valid usage statements 00478
    and 00530, which are already covered by valid usage statements for the
    corresponding stext:VkDraw*IndirectCommand (public merge request 1913).

Internal Issues:

  * Clarify <<renderpass-attachment-contents, attachment preserve behavior>>
    when multiview is enabled (internal issue 3031).
  * Update apiext:VK_KHR_format_feature_flags2 to version 2, ensuring that
    implementations report
    slink:VkFormatProperties3KHR::pname:bufferFeatures correctly for storage
    reads/writes without format, and replace old valid usage statements
    06423 and 06424 for draw dispatch commands with new statements
    expressing the constraints accurately (internal issue 3091).
  * Make provisional video APIs follow Vulkan API conventions more closely
    (internal issue 3141).
  * Move valid usage statement 06879 for
    slink:VkMultisampledRenderToSingleSampledInfoEXT to the
    slink:VkFramebufferCreateInfo and slink:VkRenderPassAttachmentBeginInfo
    valid usage blocks, where the information needed to evaluate it is known
    (internal issue 3169).
  * Change www.khronos.org/registry/ URLs to registry.khronos.org/ following
    a recent change to Khronos webservers (internal issue 3175).
  * Allow applications to not provide fragment shader via clarifying edits
    in the introduction to the <<fragops, Fragment Operations>> chapter and
    in valid usage statement 06896 for slink:VkGraphicsPipelineCreateInfo
    (internal issue 3178).
  * Fix slink:VkRayTracingPipelineCreateInfoKHR valid usage statement 03590
    to correctly refer to pname:pLibraryInterface (internal merge request
    5333).
  * Fix typo in slink:VkPipelineRasterizationLineStateCreateInfoEXT valid
    usage statement 02770 to correctly refer to the pname:smoothLines
    feature (internal merge request 5349).
  * Fix normative language in the conservative rasterization section to use
    `may:` instead of `will` (internal merge request 5354).

New Extensions:

  * apiext:VK_EXT_rasterization_order_attachment_access

-----------------------------------------------------

Change log for August 4, 2022 Vulkan 1.3.224 spec update:

  * Update release number to 224 for this update.

Public Issues:

  * Add issues to the apiext:VK_KHR_dynamic_rendering proposal document
    discussing render area granularity (public issue 1899).

Internal Issues:

  * Add missing video `queues` attribute values to commands (internal issue
    1593).
  * Add valid usage statements to enforce render pass scope restrictions on
    flink:vkBeginQuery and flink:vkEndQuery pairs (internal issue 3119).
  * Remove overly restrictive valid usage statements for Y'CbCr layered
    image creation from slink:VkImageViewCreateInfo (internal issue 3180).
  * Enable `codespell` tool in CI to prevent many typos. Switch to pulling
    the updated `asciidoctor-spec` Docker container image by SHA256 instead
    of name, to work around cache pollution problems in Gitlab and GitHub
    Actions CI (internal merge request 5318).
  * Add "`Description`" sections to the provisional video extension
    appendices (internal merge request 5310).
  * Fix codec-specific stext:VkVideo{De,En}code*CapabilitiesEXT structure
    chaining in XML to refer to the root slink:VkVideoCapabilitiesKHR
    structure that is extended (internal merge request 5323).
  * Update slink:VkImageViewCreateInfo valid usage statement to not require
    a slink:VkSamplerYcbcrConversionInfo structure for non-sampleable image
    views requiring sampler Y'CbCr conversion (internal merge request 5324).

New Extensions

  * apiext:VK_EXT_attachment_feedback_loop_layout
    (internal merge request 4469).
  * apiext:VK_SEC_amigo_profiling - internal extension used within ANGLE, no
    actual spec language exists yet (internal merge request 5332).

-----------------------------------------------------

Change log for July 28, 2022 Vulkan 1.3.223 spec update:

  * Update release number to 223 for this update.

Public Issues:

  * Clarify external synchronization requirements for
    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT and
    ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT
    elink:VkDescriptorBindingFlagBits and flink:vkUpdateDescriptorSets
    (public issue 1713).
  * Add Vulkan 1.0 valid usage statement for *Subgroup* memory scope to
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    (public merge request 1900).
  * Move "`Hit Kind`" valid usage statement from standalone to runtime
    SPIR-V validation statements (public merge request 1903).

Internal Issues:

  * Add the `videocoding` attribute to XML tag:command tags to specify if
    commands can be issued only inside a video coding scope, only outside,
    or both. Update the validity generator script to add a new column to the
    "`Command Properties`" table reflecting this attribute (internal issue
    2593).
  * Terminology improvements and glossary additions for the provisional
    video extensions (internal issue 2609).
  * Add valid usage statement disallowing Android hardware buffers for
    flink:vkGetDeviceImageMemoryRequirements (internal issue 3107).
  * Document why some video and ray tracing bits are defined for
    elink:VkPipelineStageFlagBits2 but not for
    elink:VkPipelineStageFlagBits, and reserve those bits in `vk.xml`
    (internal issue 3120).
  * Fix minor typos and markup issues in apiext:VK_QCOM_image_processing
    (internal issues 3171, 3172).
  * Add interaction with apiext:VK_QCOM_tile_properties to
    apiext:VK_QCOM_render_pass_transform appendix (internal merge request
    5309).
  * Partial sync with OpenXR scripts (internal merge request 5312).
  * Clarify that flink:vkGetQueryPoolResults may return ename:VK_NOT_READY
    (internal merge request 5313).
  * Fix typos identified by the "`codespell`" tool (internal merge request
    5316).
  * Fix XML `limittype` attributes for pname:*subgroupSize members from
    `"exact"` to `"min,pot"`
    (https://github.com/KhronosGroup/Vulkan-Profiles/issues/226).


-----------------------------------------------------

Change log for July 21, 2022 Vulkan 1.3.222 spec update:

  * Update release number to 222 for this update.

Public Issues:

  * Use correct feature in
    ename:VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT
    description (public pull request 1892).
  * GitHub CI: Regenerate and build-test Rust Vulkan bindings (Ash crate)
    (public pull request 1894).

Internal Issues:

  * Clarify that flink:vkCmdClearAttachments can only clear layers in the
    current render pass instance. (internal issue 3157).
  * Clarify that access to code:Function and code:Private memory works in
    <<shaders-helper-invocations, Helper Invocations>> (internal issue
    3158).
  * Add CI check for bullet list items not preceded by exactly two spaces
    (internal issue 3162).
  * Remove slink:VkGraphicsPipelineCreateInfo valid usage statement 00726,
    superseded by 06897 (internal merge request 5295).
  * Update CI to cache Rust crates and build intermediates. (internal merge
    request 5297).
  * Use `noauto` `limittype` attribute values for values that are
    identifiers and cannot be compared, such as PCI bus IDs, driver
    versions, UUIDs, descriptions, etc. (internal merge request 5299).
  * Specify that slink:VkGeneratedCommandsInfoNV::pname:preprocessBuffer
    should not be copied for reuse (internal merge request 5301).
  * Update contact and contributor information for some vendor extensions
    (internal merge request 5304).
  * Partial sync with OpenXR scripts (internal merge request 5308).

New Extensions:

  * `apiext:VK_QCOM_image_processing`
  * `apiext:VK_QCOM_tile_properties`

-----------------------------------------------------

Change log for July 14, 2022 Vulkan 1.3.221 spec update:

  * Update release number to 221 for this update.

Public Issues:

  * Add dependency of apiext:VK_EXT_blend_operation_advanced on
    apiext:VK_KHR_get_physical_device_properties2. (public merge request
    1887).
  * Update xrefs to features so the feature name is used as the link text,
    and marked up consistently. Added a section to the style guide on markup
    of feature xrefs (public issue 1889).

Internal Issues:

  * Consolidate and clarify interpolation of fragment inputs in the
    <<primsrast-multisampling, Multisampling>>, <<primsrast-lines-basic,
    Basic Line Segment Rasterization>>, <<primsrast-polygons-basic, Basic
    Polygon Rasterization>>, and <<shaders-interpolation-decorations,
    Interpolation Decorations>> sections (internal issue 3108).
  * Add gitlab CI step to regenerate and test the Rust "`Ash`" Vulkan
    bindings (internal merge request 5216).
  * Note that the result of a <<queries-primitives-generated, Primitives
    Generated Query>> is similar to
    ename:VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT, but not
    affected by hardware details (internal issue 3131).
  * Swap direction of aliasing of enums shared by
    apiext:VK_EXT_filter_cubic and apiext:VK_IMG_filter_cubic to be
    consistent with other enums aliased by promotion, and add a note to the
    registry schema document to help clarify how the `alias` XML attribute
    is used (internal merge request 5276).
  * Update XML SPIR-V capabilities section so that
    code:RayTraversalPrimitiveCullingKHR is also enabled by
    apiext:VK_KHR_ray_query (internal issue 3156).
  * Remove reference to adding
    <<features-vulkanMemoryModelAvailabilityVisibilityChains,
    pname:vulkanMemoryModelAvailabilityVisibilityChains>> as a
    <<versions-1.3-new-features, new Vulkan 1.3 feature>>, which did not
    happen (merge request 5286).

New Extensions:

  * apiext:VK_EXT_pipeline_robustness

-----------------------------------------------------

Change log for July 7, 2022 Vulkan 1.3.220 spec update:

  * Update release number to 220 for this update.

Public Issues:

  * Add a note to elink:VkColorSpaceKHR regarding use of
    elink:VK_COLOR_SPACE_PASS_THROUGH_EXT for a linear or non-gamma transfer
    function color space (public merge request 1729).
  * Fix clamp expression for d_{lo} in the
    <<textures-level-of-detail-operation, Level-of-Detail Operation>>
    section (partial fix for public issue 1836).
  * Update <<spirvenv-module-validation-standalone, Standalone SPIR-V
    Validation>> to add explicit valid usage statements for code:Uniform
    objects being read only, and for code:Block decorations (public merge
    request 1879).
  * Add an issue to apiext:VK_KHR_fragment_shader_barycentric for
    interactions with MSAA (public merge request 1881).
  * Fix XML tagging of slink:VkShaderModuleCreateInfo and add an explicit
    valid usage statement so this structure can be validated both as an
    explicit parameter, and as part of the pname:pNext chain of
    slink:VkPipelineShaderStageCreateInfo (public issue 1883, but a broader
    fix in the validation scripts for this case will eventually be
    required).

Internal Issues:

  * Refactor and update descriptor / render pass valid usage statements for
    slink:VkAttachmentDescription, slink:VkAttachmentDescription2,
    slink:VkAttachmentReference, slink:VkAttachmentReference2
    slink:VkRenderPassCreateInfo2, slink:VkSubpassDescription, and
    slink:VkSubpassDescription2 (internal issue 2559).
  * Modify all of the query commands to use synchronization scope language,
    in order to better describe how the commands synchronize with each other
    (internal issue 3089).
  * Add valid usage statements to slink:VkGraphicsPipelineCreateInfo
    slink:VkRayTracingPipelineCreateInfoKHR, and
    slink:VkRayTracingPipelineCreateInfoNV restricting the allowed shader
    stages (internal issue 3132).
  * Remove over-constrained list of data types that can be used together
    with code:PerVertexKHR in the
    <<shaders-interpolation-decorations-pervertexkhr>> section (internal
    issue 3134).
  * Document for flink:vkGetAccelerationStructureBuildSizesKHR that
    slink:VkAccelerationStructureGeometryKHR::pname:flags must be invariant
    between the size query and the build (internal issue 3147).
  * Update slink:VkShaderModuleValidationCacheCreateInfoEXT XML to mark that
    it extends VkPipelineShaderStageCreateInfo (internal merge request
    5210).
  * Fix <<resources-image-format-features, Image Format Features>> section
    discussion of DRM format modifiers, and some related miscellaneous typos
    (internal merge request 5255).
  * Clarify that code:RelaxedPrecision does not need to match in the
    <<interfaces-iointerfaces-matching, Interface Matching>> rules (internal
    issue 3053).

-----------------------------------------------------

Change log for June 30, 2022 Vulkan 1.3.219 spec update:

  * Update release number to 219 for this update.

Public Issues:

  * Update pipeline image to move push constants outside of descriptor sets
    (public issue 1867).
  * Correct code:StencilRefLessFrontEXT to code:DepthLess in the early depth
    test portion of the <<fragops, Fragment Operations>> chapter (public
    pull request 1876).
  * Add new driver id ename:VK_DRIVER_ID_MESA_DOZEN (public pull request
    1877).
  * Relax slink:VkRenderPassCreateInfo valid usage statements 02517 and
    02518 to allow ename:VK_SUBPASS_EXTERNAL (public pull request 1878).

Internal Issues:

  * Move validation of read-only depth/stencil layout with respect to
    depth/stencil write from slink:VkGraphicsPipelineCreateInfo to draw time
    validation (internal issue 3110).
  * Clarify buffer view format features by replacing the undefined term
    "`formatted load`" (internal issue 3124).
  * Clean up markup of feature structures, and add missing boilerplate
    pname:sType / pname:pNext member descriptions where still missing
    (internal issue 3128).
  * Add new XML `limittype` attribute values to better express constraints,
    update which structure type's members are allowed to have the attribute,
    and update attributes accordingly (internal merge request 5172).
  * Disallow more combinations of ray flags in the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section and corresponding text in the <<ray-traversal, Ray Traversal>>,
    chapter as well as better documenting already disallowed cases (internal
    merge request 5220).
  * Add <<descriptorsets-updates-consecutive, wording for extrapolated
    descriptor updates>> on ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE (internal
    merge request 5251).
  * Clarify alignment requirements for device generated commands. in
    slink:VkIndirectCommandsLayoutCreateInfoNV and
    slink:VkIndirectCommandsLayoutTokenNV (internal merge request 5252).
  * Add `validstructs` attribute to XML `param` tags to specify actual valid
    structures allowed in cases where an abstract formal parameter type
    (slink:VkBaseInStructure or slink:VkBaseOutStructure) is passed,
    primarily to support the Ash Rust binding generator (internal merge
    request 5253).
  * Add guidance on defining feature structures for WSI extensions in the
    "`Feature Structures`" section of the style guide (internal merge
    request 5266).

New Extensions:

  * apiext:VK_EXT_multisampled_render_to_single_sampled
  * apiext:VK_EXT_shader_module_identifier

-----------------------------------------------------

Change log for June 16, 2022 Vulkan 1.3.218 spec update:

  * Update release number to 218 for this update.

Public Issues:

  * Add apiext:VK_KHR_maintenance4 relaxed interface valid usage statement
    to the <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section (public pull request 1860).
  * Fix field name in slink:VkRenderingAttachmentInfo valid usage statement
    (public pull request 1861).
  * Fix typo in slink:VkFramebufferCreateInfo valid usage statements 04533 /
    04544 (public pull request 1873).
  * Remove duplicate valid usage statement 06060 (public pull request 1874).
  * Rework <<fxvertex-input-address-calculation, Vertex Input Address
    Calculation>> section (public pull request 1869).
  * Split GitHub CI script into individual jobs to decrease run time (public
    pull request 1870).

Internal Issues:

  * Refactor some valid usage statements for drawing commands that depend on
    apiext:VK_EXT_color_write_enable (internal issue 2868).
  * Refactor description of
    flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR and add
    video-profile-specific error codes (internal issues 2965 and 2995).
  * Add NOTEs regarding Android layer discovery to
    flink:vkEnumerateDeviceLayerProperties and
    flink:vkEnumerateDeviceExtensionProperties (internal issue 3070).
  * Update slink:VkSubpassDependency valid usage statements based on
    language in synchronization chapter (internal issue 3075).
  * Rename slink:VkQueueFamilyQueryResultStatusProperties2KHR member from
    ptext:supported to pname:queryResultStatusSupport for a provisional
    video extension (internal issue 3092).
  * Expand allowed use of `limittype` XML attribute to additional limit and
    property structures, and validate its use (internal issue 3101).
  * Update registry schema and the extension metadocumentation generator
    script to interpret extension 'requires' attributes as requiring such
    extensions be enabled for device level functionality, rather than just
    supported (internal issue 3116).
  * Replace XML dependency of apiext:VK_KHR_video_queue on
    apiext:VK_KHR_sampler_ycbcr_conversion with a dependency on
    apiext:VK_KHR_synchronization2 plus Vulkan 1.1 (internal merge request
    5217).
  * Fix typo in anchor text in the <<clears-inside, Clearing Images Inside A
    Render Pass Instance>> section (internal merge request 5241).
  * Use feature template include markup for
    slink:VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM
    (internal merge request 5242).


-----------------------------------------------------

Change log for June 9, 2022 Vulkan 1.3.217 spec update:

  * Update release number to 217 for this update.

Public Issues:

  * Clarify meaning of "`private data slot`" for apiext:VK_EXT_private_data
    (public issue 1675)
  * Minor markup fix in the <<spirvenv-module-validation-standalone>>
    section (public merge request 1864).

Internal Issues:

  * Clarify that <<primsrast-sampleshading, Sample Shading>> affects the
    number of times the fragment shader is evaluated, rather than dictating
    fragment data (internal issue 3003).
  * Clarify interaction of the
    slink:VkPhysicalDeviceLimits::pname:strictLines limit with
    apiext:VK_EXT_line_rasterization in
    slink:VkPhysicalDeviceLineRasterizationFeaturesEXT and the
    <<line_linear_interpolation>> section (internal issue 3042).
  * Clarify that code:EarlyFragmentTests allows for sample counting after
    fragment shading and multisample coverage in the introduction to the
    <<fragops, Fragment Operations>> chapter (internal issue 3085).
  * Update description of ray tracing <<features-requirements, Feature
    Requirements>> for consistency and to remove redundancy. Add an issue to
    apiext:VK_KHR_ray_tracing_pipeline explaining why
    apiext:VK_KHR_pipeline_library is an interaction, rather than a required
    dependency. (internal issue 3103).
  * Define alignment requirements for matrices in terms of arrays.
    in the <<interfaces-alignment-requirements,
    Alignment Requirements>> section
    (internal issue 3105).
  * Add valid usage statements for code:StorageBuffer and code:Uniform
    code:PushConstant types to the <<spirvenv-module-validation-standalone,
    Standalone SPIR-V Validation>> section (internal merge request 5080).
  * Fix conditional markup interaction for
    apiext:VK_KHR_depth_stencil_resolve and apiext:VK_KHR_dynamic_rendering
    in slink:VkRenderingInfo and slink:VkRenderingAttachmentInfo valid usage
    statements, now that apiext:VK_KHR_dynamic_rendering requires
    apiext:VK_KHR_depth_stencil_resolve (internal merge request 5224).
  * Clarify dependencies and fix broken chapter links for
    apiext:VK_ARM_rasterization_order (internal merge request 5229).
  * Add a valid usage statement to flink:vkCmdEndRendering to disallow
    calling it when transform feedback is active (internal merge request
    5230).
  * Update reference to a style guide chapter (internal merge request 5231).
  * Clarify that slink:VkExportMemoryAllocateInfo::pname:handleTypes can be
    zero in spec description, matching XML and other pname:handleType
    members (internal merge request 5234).

New Extensions:

  * apiext:VK_EXT_metal_objects
  * apiext:VK_EXT_non_seamless_cube_map

-----------------------------------------------------

Change log for June 2, 2022 Vulkan 1.3.216 spec update:

  * Update release number to 216 for this update.
  * Note: most spec updates will occur on Thursdays going forward, not
    Tuesdays.

Public Issues:

  * Make formal names in the <<synchronization-dependencies-execution>>
    section more memorable (public pull request 1837).
  * Refactor slink:VkPipelinenfoKHR / slink:VkPipelineInfoEXT markup (public
    issue 1857).
  * Fix conditional markup in the <<shaders-ray-generation-execution Ray
    Generation Shader Execution>> section for references to shader binding
    tables (public issue 1858).
  * Fix "`a`" -> "`an`" typo (public pull request 1865).

Internal Issues:

  * Clarify that flink:vkCmdClearAttachments is not a drawing command
    (internal issue 3055).
  * Remove requirements that the boolean
    slink:VkPhysicalDeviceTexelBufferAlignmentProperties::pnamestorageTexelBufferOffsetSingleTexelAlignment
    and pname:uniformTexelBufferOffsetSingleTexelAlignment limits must: be a
    power of two (internal issue 3081).
  * Fix the structextends and constness issues in
    apiext:VK_EXT_subpass_merge_feedback (this is a breaking API change, but
    there is only one known implementation at present) (internal issue
    3095).
  * Update to latest asciidoctor-chunker.js so links to undefined anchors in
    the chunked HTML outputs are rendered with the undefined anchor and CSS
    class `"target-missing"`, instead of as `href="undefined"` (internal
    merge request 5170).


-----------------------------------------------------

Change log for May 24, 2022 Vulkan 1.3.215 spec update:

  * Update release number to 215 for this update.

Public Issues:

  * Fix markup error to make slink:VkImageResolve2 appear right after
    slink:VkImageResolve, rather than appearing in the next section (public
    pull request 1856).

Internal Issues:

  * Allow slink:VkDescriptorPoolCreateInfo::pname:poolSizeCount to be `0` in
    `vk.xml` (internal issue #2974).
  * Add valid usage statements to flink:vkCmdExecuteCommands requiring that
    the depth or stencil format in
    slink:VkCommandBufferInheritanceRenderingInfo must be
    ename:VK_FORMAT_UNDEFINED if a `NULL` attachment is used
    (internal issue 3016).
  * Remove (incomplete) list of SPIR-V decorations from intro of interface
    matching chapter (internal issue 3043).
  * Add valid usage statement disallowing
    VkImageDrmFormatModifierExplicitCreateInfoEXT in the pname:pNext chain
    of slink:VkDeviceImageMemoryRequirementsKHR (internal issue #3051).
  * Add missing references to flink:vkQueueSubmit2 in the
    <<synchronization-fences-signaling>> and
    <<synchronization-semaphores-signaling, Semaphore Signaling>> sections
    (internal issue #3077).
  * Clarify that pipeline libraries can link against other libraries
    following the description of slink:VkPipelineLibraryCreateInfoKHR
    (internal issue #3083).
  * Fix suffix of some SPIR-V tokens to `AMD` for
    apiext:VK_AMD_shader_early_and_late_fragment_tests (internal merge
    request #5199).

New Extensions:

  * apiext:VK_KHR_fragment_shader_barycentric

-----------------------------------------------------

Change log for May 17, 2022 Vulkan 1.3.214 spec update:

  * Update release number to 214 for this update.

Public Issues:

  * Clarify protected queue creation language for slink:VkDeviceCreateInfo,
    slink:VkDeviceQueueCreateInfo,
    slink:VkDeviceQueueGlobalPriorityCreateInfoKHR, and
    slink:VkDeviceQueueInfo2 (public issue 1761, internal issue 2978).
  * Add valid usage statements for usage and format features bits for
    resolve image commands (public pull request 1826).
  * Add apiext:VK_KHR_depth_stencil_resolve dependency to
    apiext:VK_KHR_dynamic_rendering (public pull request 1831).
  * Make some missing API dependencies explicit in XML (public issue 1840).
  * Mark slink:VkSubresourceLayout2EXT as `returnedonly` in XML (public pull
    request 1848).
  * Replace manual links in VK_KHR_ray_tracing_maintenance1 appendix (public
    pull request 1849).
  * Add valid usage statement for pname:pipelinePropertiesIdentifier
    feature, and change a valid usage statement to refer to the
    pname:imageCompressionControlSwapchain feature rather than the related
    extension (public pull request 1852).

Internal Issues:

  * Fix description of parameters defined by
    apiext:VK_EXT_depth_clip_control for slink:VkViewport (internal issue
    3044)
  * Add valid usage statements to slink:VkGraphicsPipelineCreateInfo banning
    graphics pipeline libraries having descriptors for other libraries
    (internal issue 3080).
  * Add valid usage statements to slink:VkGraphicsPipelineCreateInfo and
    flink:vkCmdBindDescriptorSets allowing `NULL` set layouts with
    non-independent sets (internal issue 3082).
  * Set `noautovalidity` attribute in XML for
    flink:vkGetPipelinePropertiesEXT::pname:pPipelineProperties (internal
    issue 3088).
  * Update apiext:VK_NV_device_diagnostics_config to add a new config bit
    (internal merge request 5160).
  * Clarify unsupported conservative point/line rasterization in
    slink:VkPipelineRasterizationConservativeStateCreateInfoEXT and in valid
    usage statements for slink:VkGraphicsPipelineCreateInfo (internal merge
    request 5169).
  * Add missing `limittype` attributes to XML for
    slink:VkQueueFamilyProperties* and slink:VkFormatProperties* members
    (internal merge requests 5171 and 5175).
  * Improve XML `limittype` attribute of
    slink:VkPhysicalDeviceFragmentShadingRatePropertiesKHR::pname:maxFragmentShadingRateCoverageSamples
    for tool chain usage (internal merge request 5177).
  * Change description of slink:VkPipelineLayoutCreateInfo::pname:flags now
    that there are flag bits reserved for the underlying type (internal
    merge request 5180).
  * Fix typos in slink:VkGraphicsPipelineCreateInfo valid usage statements
    (internal merge request 5191).
  * Move attribute settings used in commonvalidity includes inside valid
    usage blocks to generate correct validusage.json text (internal merge
    request 5195).

New Extensions:

  * apiext:VK_AMD_shader_early_and_late_fragment_tests

-----------------------------------------------------

Change log for May 10, 2022 Vulkan 1.3.213 spec update:

  * Update release number to 213 for this update.

Public Issues:

  * Replace the list of <<formats-packed, Packed Formats>> with a generated
    version, and update the format generator script to support conditionals
    (public pull request 1823).
  * Fix typo in apiext:VK_INTEL_performance_query (public issue 1845).

Internal Issues:

  * Add valid usage statement limiting
    slink:VkDisplaySurfaceCreateInfoKHR::pname:transform to a single,
    supported transformation (internal merge request 5166).
  * Update sample code for apiext:VK_KHR_ray_query in the extension appendix
    (internal issue 3066).
  * Fix some `limittype` attributes for
    slink:VkPhysicalDeviceTransformFeedbackPropertiesEXT and
    slink:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV members in
    `vk.xml` (internal merge requests 5173 and 5174).

New Extensions:

  * apiext:VK_EXT_image_compression_control
  * apiext:VK_EXT_pipeline_properties
  * apiext:VK_EXT_subpass_merge_feedback
  * apiext:VK_KHR_ray_tracing_maintenance1

-----------------------------------------------------

Change log for April 21, 2022 Vulkan 1.3.212 spec update:

  * Update release number to 212 for this update.

Public Issues:

  * Add <<attachment-type-imagelayout, layout requirements for resolve
    attachments>> (public issue 1777).
  * Improve description of and references to elink:VkCompareOp (public pull
    request 1805).
  * Fix typos in <<fundamentals-api-name-aliases, typo alias example>>
    (public pull request 1821).

Internal Issues:

  * Modify pipeline layout override for
    apiext:VK_EXT_graphics_pipeline_library (internal merge request 5164)
  * Include graphics pipelines in definition of
    ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR (internal issue 3068).
  * Add cap for B frame as L1 reference, and disable SPS
    direct_8x8_inference_flag in provisional apiext:VK_EXT_video_encode_h264
    extension (internal issue 3064).
  * Add implementor's note for memory type index ambiguity to
    slink:VkMemoryAllocateInfo for
    apiext:VK_ANDROID_external_memory_android_hardware_buffer (internal
    issue 2762).
  * Minor editorial fixes for the <<memory, Memory Allocation>> chapter.

-----------------------------------------------------

Change log for April 5, 2022 Vulkan 1.3.211 spec update:

  * Update release number to 211 for this update.

Public Issues:

  * Clarify dynamic offset with ename:VK_WHOLE_SIZE including new
    <<buffer-info-effective-range>> language (public issue 1546).
  * Relax depth copy requirement in common copy image valid usage statement
    00153 to ename:VK_IMAGE_TYPE_3D only and clarify copying depth slices
    for slink:VkImageCopy (public issue 1804).
  * Avoid a chain of enumerant aliases in `vk.xml` by aliasing
    ename:VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR directly to
    ename:VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT (public issue 1814).
  * Fix structure name containing pname:compareMask value in
    flink:vkCmdSetStencilCompareMask (public pull request 1806).
  * Fix miiscellaneous minor markup issues (public pull request 1810).
  * Simplify <<fundamentals-api-name-aliases, typo alias example>> to refer
    to aliases in the core API rather than extensions (public pull request
    1811).
  * Fix order of swapchain vs device destruction in
    flink:vkCreateSwapchainKHR (public pull request 1817).
  * Minor fix for VK_EXT_graphics_pipeline_library proposal vertex shader
    sample code (public pull request 1819).

Internal Issues:

  * Clarify timestamps write when the stage is done for
    flink:vkCmdWriteTimestamp and flink:vkCmdWriteTimestamp2 (internal issue
    2287).
  * Add pname:samplerFilterMinmax feature valid usage statement to
    slink:VkSamplerCreateInfo (internal issu 2747).
  * Add success and error codes to `vk.xml` for flink:vkWaitForPresentKHR
    (internal issue 2822).
  * Add footnote to flink:vkGetDeviceProcAddr suggesting, but not requiring
    returning `NULL` for core commands beyond the version supported by the
    implementation (internal issue 3002).
  * Fix valid usage statement for slink:VkImageFormatListCreateInfo when the
    image is created with
    ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT (internal issue
    3032).
  * Disallow binding ray tracing pipelines to protected command buffers in
    flink:vkCmdBindPipeline (internal issue 3034).
  * Update valid usage statements for interaction of
    flink:vkGetRayTracingShaderGroupHandlesKHR and
    flink:vkGetRayTracingCaptureReplayShaderGroupHandlesKHR with
    apiext:VK_KHR_pipeline_library (internal issue 3040).
  * Add capability flags to report support to disable transform skip and use
    B frame in L1 reference list for the provisional
    apiext:VK_EXT_video_encode_h265.txt extension (internal issue 3050).
  * Update description of
    slink:VkPipelineShaderStageCreateInfo::pname:module and add valid usage
    for modules being optional when apiext:VK_EXT_graphics_pipelin_library
    is supported (internal issue 3059).
  * Remove redundant slink:VkVideoEncodeInfoKHR and
    slink:VkVideoDecodeInfoKHR pname:codedOffset / pname:codedExtent
    parameters from the provisional video extensions (internal issue 3062).
  * Fix "`code:VkDescriptorSetLayout`" typo in
    flink:vkCmdBindDescriptorSets.

New Extensions:

  * apiext:VK_EXT_image_2d_view_of_3d


-----------------------------------------------------

Change log for March 29, 2022 Vulkan 1.3.210 spec update:

  * Update release number to 210 for this update.

Public Issues:

  * Clarify that descriptors are not referenced for unused
    ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT descriptors unless
    dynamically used (public issue 1794).
  * Remove "`If renderpass is NULL`" from slink:VkFramebufferCreateInfo
    valid usage statements (public issue 1800).

Internal Issues:

  * Add valid usage statements to slink:VkAttachmentDescription and
    slink:VkAttachmentDescription2 for the cases when pname:loadOp is or
    pname:stencilLoadOp is ename:VK_ATTACHMENT_LOAD_OP_LOAD and
    pname:initialLayout is ename:VK_IMAGE_LAYOUT_UNDEFINED, and when
    pname:format is ename:VK_FORMAT_UNDEFINED (internal issue 2349).
  * Add valid usage statements to slink:VkRenderPassMultiviewCreateInfo and
    slink:VkSubpassDescription2 to respect <<limits-maxMultiviewViewCount,
    pname:maxMultiviewViewCount>> (internal issue 2511).
  * Clarify definition of <<shaders-staticuse, static use instructions>>
    (internal issue 2639).
  * Fix typo pname:pRanges -> pname:pRegions in common validity statements
    for copy image commands (internal issue 3052).
  * Update valid usage statement for build acceleration structure common VUs
    to allow inactive instances (internal merge request 5116).
  * Require <<features-colorWriteEnable, pname:colorWriteEnable>> for
    apiext:VK_EXT_color_write_enable in the <<features-requirements, Feature
    Requirements>> section.
  * Better specify when depth/stencil must be written in
    slink:VkPipelineShaderStageCreateInfo valid usage statements.

New Extensions:

  * apiext:VK_EXT_graphics_pipeline_library
  * apiext:VK_EXT_primitives_generated_query

-----------------------------------------------------

Change log for March 23, 2022 Vulkan 1.3.209 spec update:

  * Update release number to 209 for this update.

Public Issues:

  * Add VU to slink:VkImageViewCreateInfo ensuring
    slink:VkImageViewCreateInfo::pname:format and
    slink:VkSamplerYcbcrConversionCreateInfo::pname:format are the same when
    used together (public issue 1752).
  * Add VU to slink:VkMemoryAllocateInfo to limit to one import operation at
    a time (public issue 1782).

Internal Issues:

  * Rephrase some VUs for apiext:VK_EXT_color_write_enable (internal issue
    2868).
  * Update code:Std* structures in provisional video extensions to remove
    SPS and VPS IDs from code:StdVideoDecode*PictureInfo. The implementation
    should obtain the IDs indirectly from the associated PPS picture
    parameters based on the picture parameter and slice header PPS IDs.
    Unify/add STD Encode h.264/265 weight tables (internal issue 2930).
  * Many minor updates to versioning and reporting for the provisional video
    extensions (internal issue 3019).
  * Add VU to slink:VkDeviceCreateInfo to require consistent global
    priorities for protected and unprotected queues created from the same
    queue family (internal issue 3021).
  * Fix some `ifndef::` conditional expression markup (internal issue 3038).
  * Remove the "`Common Operation`" section near the start of the <<copies>>
    chapter and refactor the bullet points into commonvalidity valid usage
    statements, if not already covered by VUs (internal issue 3039).
  * Add some valid usage statements to the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section that were already being checked by `spirv-val` (internal merge
    request 5081).
  * Make markup for code:OpImage*Dref* consistent (internal merge request
    5091).
  * Remove VU 04676, which replicates a statement in the SPIR-V
    specification, from <<spirvenv-module-validation-standalone, Standalone
    SPIR-V Validation>> (internal merge request 5094).
  * Clarify that the pname:finalLayout of an attachment is not ignored in
    the <<renderpass-load-store-ops>> section for
    slink:VkAttachmentDescription (internal merge request 5101).
  * Add VU for ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT dynamic state to
    the common validity statements for drawing commands (internal merge
    request 5103).

-----------------------------------------------------

Change log for March 15, 2022 Vulkan 1.3.208 spec update:

  * Update release number to 208 for this update.

Internal Issues:

  * Change definition of _inactive triangle_ in the
    <<acceleration-structure-inactive-prims, Inactive Primitives and
    Instances>> section to one for which the first (X) component of _any_
    vertex is NaN (internal issue 3026).
  * Add storage image equivalence for code:AHardwareBuffer-backed external
    memory in slink:VkMemoryAllocateInfo and the
    <<memory-external-android-hardware-buffer-usage, AHardwareBuffer Usage
    Equivalence>> table (internal issue 3004).

New Extensions:

  * apiext:VK_KHR_portability_enumeration

-----------------------------------------------------

Change log for March 8, 2022 Vulkan 1.3.207 spec update:

  * Update release number to 207 for this update.

GitHub Issues:

  * Rejoin part of flink:vkCreateSwapchainKHR language that had become
    dislocated from the start of the description (public pull request 1613).
  * Correct the `limittype` attribute for
    slink:VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV::pname:maxFragmentShadingRateInvocationCount
    (public issue 1767).
  * Fix markup typo in
    slink:VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR
    (public issue 1786).
  * Use consistent terminology for variable-sized descriptor bindings, and
    add a glossary entry for the term (public issue 1724).
  * Specify `optional` attribute correctly for the
    pname:pDrmFormatModifierProperties member of
    slink:VkDrmFormatModifierPropertiesListEXT and
    slink:VkDrmFormatModifierPropertiesList2EXT (public issue 1766).
  * Fix `limittype` attribute value for
    slink:VkPhysicalDeviceLimits::pname:maxColorAttachments (public issue
    1768).
  * Add valid usage statements to slink:VkRenderPassMultiviewCreateInfo and
    slink:VkSubpassDescription2 to constrain requirements for the
    <<features-multiview>> feature on render pass creation (public issue
    1774).
  * Fix typos in the apiext:VK_KHR_deferred_host_operations appendix (public
    issue 1784).
  * Fix typo "`unscaled`" -> "`scaled`" in filtering and conversion rules
    for flink:vkCmdBlitImage (public merge request 1792).

Internal Issues:

  * Clarify SPIR-V valid usage statement 04680, and remove 06273, by stating
    all possible uses of code:OpTypeRuntimeArray allowed and then removing
    the restriction at runtime if <<features-runtimeDescriptorArray,
    runtimeDescriptorArray>> is not enabled (internal issue 2408).
  * Update <<resources-image-inherited-usage>> and
    slink:VkImageViewCreateInfo to remove requirement for a YCbCr sampler
    for video image views (internal issue 2688).
  * Specify in the <<primsrast-depthbias-computation, Depth Bias
    Computation>> section that depth bias only works with polygon topologies
    with any polygon mode, but not line and point topologies (internal issue
    2793).
  * Add slink:VkVideoDecodeCapabilitiesKHR,
    elink:VkVideoDecodeCapabilityFlags, and
    elink:VkVideoDecodeCapabilityFlagBitsKHR to the provisional
    apiext:VK_KHR_video_decode_queue extension (internal issue 2964).
  * Clarify which layers of an attachment et automatic layout transitions in
    the <<renderpass-layout-transitions>> section (internal issue 3012).
  * Make slink:VkDeviceImageMemoryRequirements::pname:planeAspect `optional`
    in `vk.xml` (internal issue 3020).
  * Make it more obvious that an AS update cannot change active <-> inactive
    primitives and instances in the <<acceleration-structure-update,
    Acceleration Structure Update Rules>> section (internal issue 3025).
  * Clarify when the various ptext:p*State members of
    slink:VkGraphicsPipelineCreateInfo members are used (internal issue
    3028).
  * Fix resolution of issues 1 and 3 for apiext:VK_EXT_depth_clip_control
    (internal merge request 5057).
  * Add VUs to slink:VkAttachmentDescription2 to avoid specifying stencil
    layout twice with depth/stencil attachments.
  * Fix markup typo in slink:VkPhysicalDeviceMultiDrawPropertiesEXT that
    resulted in the wrong structure name being embedded in common valid
    usage statements.
  * Fix missing `len` attribute in `vk.xml` for
    slink:VkVideoProfilesKHR::pname:pProfiles.

New Extensions:

  * apiext:VK_VALVE_descriptor_set_host_mapping

-----------------------------------------------------

Change log for February 17, 2022 Vulkan 1.3.206 spec update:

  * Update release number to 206 for this update.

GitHub Issues:

  * Add valid usage statements common to draw dispatch commands restricting
    allowed instructions (public issue 1749).
  * Remove unused elink:VkPrivateDataSlotCreateFlagBits type from `vk.xml`
    (public issue 1754).
  * Clarify that flink:vkGetInstanceProcAddr should return a valid function
    pointer when the first argument is either NULL or a valid instance
    handle (public issue 1763).
  * Add `returnedonly="true"` attribute to
    slink:VkPhysicalDeviceShaderIntegerDotProductProperties in `vk.xml`
    (public issue 1771).
  * Add `objecttype` attribute to
    slink:VkDeviceMemoryReportCallbackDataEXT::pname:objectHandle in
    `vk.xml` (public issue 1772).

Internal Issues:

  * Update encoder capability APIs in the provisional video extensions to
    align with H.264/H.265 codecs and support a broader range of
    implementations (internal issues 1842 / 2842).
  * Add `spirvextension` tag to `vk.xml` expressing the relationship between
    apiext:VK_INTEL_shader_integer_functions2 and
    `SPV_INTEL_shader_integer_functions` (internal issue 2899)
  * Add a deprecation note for code:WorkgroupSize (internal issue 2908).
  * Align the provisional slink:VkVideoEncodeH264VclFrameInfoEXT structure
    to the similar one in apiext:VK_EXT_video_encode_h265 (internal issue
    2966).
  * Add valid usage statements making code:SkipTrianglesKHR and
    code:SkipAABBsKHR mutually exclusive (internal issue 2994).
  * Do not include valid usage statements requiring that the
    <<features-extendedDynamicState, extendedDynamicState>> feature be
    enabled when building Vulkan 1.3 specifications (internal issue 3005).
  * Update valid usage statements 06423 and 06424 common to draw dispatch
    commands to use "`image view format`" rather than "`image format`"
    (internal issue 3008).
  * Remove mistaken requirement of
    <<features-descriptorBindingUniformBufferUpdateAfterBind,
    pname:descriptorBindingUniformBufferUpdateAfterBind>> for the
    <<profile-features-roadmap-2022, Roadmap 2022>> profile (internal issue
    3017).
  * Remove mistaken requirement of
    <<features-vulkanMemoryModelAvailabilityVisibilityChains,
    pname:vulkanMemoryModelAvailabilityVisibilityChains>> for Vulkan 1.3 in
    the <<features-requirements, Feature Requirements>> section.
  * Add valid usage statements to
    sname:VkCommandBufferInheritanceRenderingInfo,
    sname:VkPipelineRenderingCreateInfo, and sname:VkRenderingInfo requiring
    that pname:depthAttachmentFormat and pname:stencilAttachmentFormat
    include the corresponding aspects.
  * Remove references to
    slink:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT when
    apiext:VK_EXT_buffer_device_address is not present.
  * Clarify that excess image write data is discarded in the
    <<textures-output-format-conversion, Texel Output Format Conversion>>
    section (internal merge request 5053).

-----------------------------------------------------

Change log for February 4, 2022 Vulkan 1.3.205 spec update:

  * Update release number to 205 for this update.

GitHub Issues:

  * Fix <<renderpass-attachment-nonattachment>> access language. Add related
    valid usage statements for flink:vkCmdExecuteCommands and common VUs for
    drawing commands, and update the glossary definition of "`Image
    Subresources`" to include "`a specific ... set of aspects of an image`"
    (public issues 1340, 1345, 1559; internal issues 2152, 2725).
  * Fix markup "If" and punctuation issues (public pull request 1725).
  * Fix link to incorrect structure for flink:vkCmdSetDepthBias command
    (public pull request 1726).
  * Improve wording of vkCmdBindDescriptorSets (public pull request 1732).
  * Fix mismatching struct member descriptions in
    slink:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV (public issue
    1735, 1736).
  * Clarify that slink:VkImageCreateInfo::pname:flags is referred to by
    slink:VkImageViewCreateInfo valid usage statement 04971 (public issue
    1740).
  * Add missing `SPV_KHR_device_group` `spirvextension` tag to `vk.xml`
    (public issue 1745).
  * Reference underlying type instead of promoted type alias in
    `structextends` attributes for slink:VkSampleLocationsInfoEXT and
    slink:VkCopyCommandTransformInfoQCOM (public pull request 1746).
  * Fix typo in <<features-storageBuffer8BitAccess,
    storageBuffer8BitAccess>> xref (public pull request 1750).
  * Fix formula markup in <<textures-texel-anisotropic-filtering, Texel
    Anisotropic Filtering>> section (public pull request 1753).
  * Fix typo in `.sType` member for
    `proposals/VK_KHR_dynamic_rendering.asciidoc` (public pull request
    1762).
  * Add missing `len` attribute for
    slink:VkImageFormatConstraintsInfoFUCHSIA::pname:pColorSpaces in
    `vk.xml` (https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=91104,
    internal merge request 5021).

Internal Issues:

  * Rename `slice` to 'sliceSegment` in several provisional video extension
    APIs (internal issue 2833).
  * Fix several valid usage statements for
    slink:VkDeviceImageMemoryRequirementsKHR (internal issue 2967).
  * XML fixes for slink:VkAttachmentSampleCountInfoAMD members
    pname:colorAttachmentCount and pname:pColorAttachmentSamples (internal
    issue 2968).
  * Remove `const` from pname:pNext member of
    slink:VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM
    (internal issue 2973).
  * Make definition of <<code:RayTminKHR>>, <<code:WorldRayDirectionKHR>>,
    and <<code:WorldRayOriginKHR>> values less vague (internal issue 2984).
  * Remove `externsync` attribute for slink:VkBuffer and slink:VkImage in
    flink:vkQueueBindSparse (internal issue 2989).
  * Move the <<roadmap, Vulkan Roadmap Milestones>> title markup up one
    level so that this section appears as a separate appendix rather than
    accidentally being merged into the previous appendix (internal issue
    2990).
  * Fix a few places where promotion of APIs to Vulkan 1.3 should have
    happened, but didn't, including defining ename:VK_IMAGE_ASPECT_NONE in
    `vk.xml` and aliasing ename:VK_IMAGE_ASPECT_NONE_KHR to it (internal
    issue 2999).
  * Fix link to pipeline dynamic state section (internal merge request
    4990).
  * Add video codec headers to dependencies in `xml/Makefile` so 'make test'
    works (internal merge request 4991).
  * Fix caption for <<img-innertri, Inner Triangle Tessellation figure>>
    (internal merge request 4994).
  * Fix implication of code:EarlyFragmentTests when representative fragment
    test is enabled in
    slink:VkPipelineRepresentativeFragmentTestStateCreateInfoNV (internal
    merge request 5006).
  * Set `noautovalidity` attribute for
    slink:VkVideoDecodeH264ProfileEXT::pname:pictureLayout to avoid
    conflicting valid usage statements (internal issue 2946).
  * Specify which structure is extended by
    slink:VkQueueFamilyGlobalPriorityPropertiesKHR (internal issue 2982).
  * Change a reference from sname:VkImageFormatProperties2 to
    slink:VkFormatProperties2 in the <<resources-image-creation-limits>>
    section (internal merge request 5016).
  * Specify that the <<features-dynamicRendering, pname:dynamicRendering>>
    feature is required by Vulkan 1.3 and the
    apiext:VK_KHR_dynamic_rendering extension (internal merge request 5017).
  * Fix typo in <<features-shaderZeroInitializeWorkgroupMemory,
    shaderZeroInitializeWorkgroupMemory>> xref (internal merge request
    5020).
  * Add `Promotion to Vulkan 1.3` language in the
    <<VK_KHR_buffer_device_address>> appendix to specify that
    code:bufferDeviceAddress feature support is mandatory, unlike Vulkan
    1.2.
  * Clarify that state is not inherited from static to dynamic pipelines in
    the <<pipelines-dynamic-state, Dynamic State>> section.

-----------------------------------------------------

Change log for January 25, 2022 Vulkan 1.3.204 spec update:

  * Vulkan 1.3 initial release. Update release number to 204 for this
    update. The patch number will be used for all Vulkan 1.x spec updates,
    and continue to increment continuously from the previous Vulkan 1.2.203
    update.

GitHub Issues:

  * Reserve driver ID ename:VK_DRIVER_ID_MESA_VENUS (public merge request
    1733).

Internal Issues:

  * Update scripts and registry schema document to support multiple API
    names in the `api` and `supported` attributes, to allow specializing API
    definitions (internal issue 2809).
  * Minor updates - update copyright dates to 2022, update release scripts
    to generate artifacts for 1.3 as well as earlier specification versions
    (internal issue 2969).

New Features:

  * apiext:VK_KHR_global_priority (internal merge request 4869).
  * <<roadmap-2022, `VK_KHR_roadmap_2022`>> ("`Roadmap 2022`") profile
    (internal merge request 4797).

-----------------------------------------------------

Change log for December 20, 2021 Vulkan 1.2.203 spec update:

  * Update release number to 203 for this update.

GitHub Issues:

  * Generate auxiliary `vk_video` headers containing definitions of
    `StdVideo*` types from new `xml/video.xml`, rather than including static
    copies in the repository (public issue 1505).
  * Clarify indexing of
    slink:VkPipelineColorBlendStateCreateInfo::pname:pAttachments (public
    issue 1656).
  * Relocate VUID-VkWriteDescriptorSet-descriptorType-00322 to the commands
    to which the structure is passed, and modify constraints in the VU for
    flink:vkCmdPushDescriptorSetKHR to account for its behavior with
    etext:SAMPLER and etext:COMBINED_IMAGE_SAMPLER descriptor types (public
    issue 1686).
  * Fix length inputs for optional array parameters in
    slink:VkCuLaunchInfoNVX to allow pname:paramCount and pname:extraCount
    to be set to zero. (public issue 1709).
  * Fix typo pname:ppEnabledExtensions -> pname:ppEnabledExtensionNames
    (public issue 1719).

Internal Issues:

  * Add slink:VkQueueFamilyQueryResultStatusProperties2KHR structure to the
    provisional apiext:VK_KHR_video_queue extension to report support (or
    lack thereof) for the ename:VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR query
    type ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR status bit (internal
    issue 2927).
  * Add language to slink:VkImageCreateInfo, elink:VkImageUsageFlagBits,
    tlink:VkImageUsageFlags, and slink:VkImageLayout for how to specify
    usage flags when creating images for Vulkan Video implementations
    requiring separate decode DPB and output (internal issue 2926).
  * Require that newly created video sessions be reset before use in
    slink:VkVideoCodingControlInfoKHR and
    elink:VkVideoCodingControlFlagBitsKHR (internal issue 2928).
  * Fix math <<textures-image-level-selection, describing image level
    selection>> with apiext:VK_EXT_image_view_min_lod (internal issue 2943).
  * Add temporal layer count field to
    slink:VkVideoEncodeH264RateControlInfoEXT and
    slink:VkVideoEncodeH265RateControlInfoEXT structures (internal issue
    2948).
  * Add a <<spirvenv-module-validation-runtime, Runtime SPIR-V valid usage
    statement>> to enforce the <<limits-maxComputeSharedMemorySize,
    pname:maxComputeSharedMemorySize limit>> (internal merge request 4846).
  * Correct etext:VK_FORMAT_ETC2_R8G8B8A8_*_BLOCK block sizes to 128 bits in
    the XML format tags (internal merge request 4975).
  * Script and schema updates to correctly filter out XML elements with
    non-matching 'api' attributes and support 'api' attributes on additional
    XML tags (internal merge request 4981).
  * Add apiext:VK_KHR_fragment_shading_rate proposal document to
    retroactively provide justification and design document overview
    (internal merge request 4983).
  * Update generator scripts to properly handle <remove> elements containing
    non-extending <enums>.
  * Restructure some structure descriptions for better adherence to the
    style guide and more detailed descriptions of their members.

New Extensions:

  * apiext:VK_GOOGLE_surfaceless_query (internal merge request 4927).
  * apiext:VK_NV_linear_color_attachment (internal merge request 4956).
  * apiext:VK_QCOM_fragment_density_map_offset (internal merge request 4824).

-----------------------------------------------------

Change log for December 7, 2021 Vulkan 1.2.202 spec update:

  * Update release number to 202 for this update.

GitHub Issues:

  * Split some valid usage statements for slink:VkAttachmentDescription
    so they can have appropriate conditional protection
    (public pull request 1698).
  * Clean up links to GLSL and SPIR-V extension documents (public pull
    request 1705).
  * Fix markup for <<primsrast-polygon-barycentrics, perspective
    interpolation>> math (public pull request 1711).

Internal Issues:

  * Clarify valid usage statements for
    flink:vkCmdWriteTimestamp2KHR::pname:stage to accommodate
    ename:VK_PIPELINE_STAGE_2_NONE_KHR (internal issue 2867).
  * Disallow descriptorset decorations on non-descriptor ray tracing
    variables in the <<spirvenv-module-validation-standalone, Standalone
    SPIR-V Validation>> section (internal issue 2881).
  * Fix sentence describing behavior when
    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT is not present in
    the slink:VkRenderingInfoKHR::pname:pNext chain (internal issue 2881).
  * Require that
    slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleAlignment
    be a power of two (internal merge request 4943).
  * Add a new ename:VK_IMAGE_ASPECT_NONE_KHR=0 enum to
    slink:VkImageAspectFlagBits in the apiext:VK_KHR_maintenance4 extension
    so that pname:planeAspect can be set to zero without having to use a
    cast, and fix some typos (internal merge request 4961).
  * Add "`must: be a power of two`" to all alignment limits (internal issue
    2939).
  * Make all limit anchors follow the `[[limit-NAME]]` style (internal merge
    request 4969).
  * Require render pass to be valid and add missing state subset
    dependencies to slink:VkGraphicsPipelineCreateInfo valid usage
    statements for apiext:VK_ARM_rasterization_order_attachment_access
    (internal merge request 4970).
  * Parameterize OpenGL and GLSL extension registry URLs via Asciidoctor
    attributes in `config/attribs.txt`, and move the existing SPIR-V
    extension registry URL from the Makefile into that file. Use `https:`
    prefixes on URLs instead of `http:` where possible.

-----------------------------------------------------

Change log for November 30, 2021 Vulkan 1.2.201 spec update:

  * Update release number to 201 for this update.

GitHub Issues:

  * Fix typo in refpage description of ename:VK_REMAINING_MIP_LEVELS
    (public pull request 1702).
  * Add missing structextends attribute for
    slink:VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM
    (public issue 1703).
  * Fixes and clarifications to valid usage statements for
    slink:VkRenderPassCreateInfo,
    slink:VkRenderPassFragmentDensityMapCreateInfoEXT, and
    slink:VkSubpassDescriptionDepthStencilResolve (matching changes in
    public Vulkan-ValidationLayers pull request 3571).

Internal Issues:

  * Changes to the provisional video extension encode rate control API,
    including changing some existing structures and adding new structures
    and flags (internal issue 1844).
  * Update valid usage statements for apiext:VK_NV_mesh_shader (internal
    issue 2880).
  * Remove valid usage statement IDs 02854 / 02855 / 06081 / 06082, which
    are duplicates of 06166 / 06167 (internal issue 2944).
  * Add a valid usage statement banning code:OpImage*Dref* instructions on
    non-depth views (internal merge request 3889).
  * Add CI test for disallowed contractions (internal merge request 4934).
  * Generate the <<formats-compatibility, Format Compatibility Class Table>>
    from XML tags (internal merge request 4936).
  * Clarify that dependent operations of quad-sensitive ops have helpers
    (internal merge request 4947).
  * Remove redundant valid usage statement for
    apiext:VK_QCOM_render_pass_shader_resolve (internal merge request 4950).
  * Support `api` attribute fully in XML and scripts (internal merge request
    4951).
  * Fix pname:planeIndex attribute in format XML for
    ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16 (internal
    merge request 4953).


-----------------------------------------------------

Change log for November 23, 2021 Vulkan 1.2.200 spec update:

  * Update release number to 200 for this update.

GitHub Issues:

  * Refer to flink:vkCmdPipelineBarrier2KHR::pname:pDependencyInfo as a
    pointer, not an array (public issue 1456).
  * Fix spelling and add backwards-compatibility aliases for some
    elink:VkPipelinCreateFlagBits values (public issue 1676).
  * Fix typo in apiext:VK_INTEL_shader_integer_functions2 (public issue
    1696).
  * Replace usage of {depth, color} buffer with {depth, color} attachment
    (public pull request 1701).
  * Add restriction to the <<formats-mandatory-features-depth-stencil,
    manadatory format support table>> for depth/stencil formats preventing
    implementations from advertising those bits in
    slink:VkFormatProperties::pname:bufferFeatures (public
    Vulkan-ValidationLayers issue 3225).

Internal Issues:

  * Add an additional guarantee for buffer memory requirements in
    slink:VkMemoryRequirements as a minor update to the
    apiext:VK_KHR_maintenance4 extension (internal issue 2885).
  * Add a <<fundamentals-api-name-aliases, section to the fundamentals
    chapter>> describing typo aliases (internal issue 2897).
  * Determine extensions dependencies directly from `vk.xml` in the build
    scripts, rather than generating an auxiliary `extDependency.py` target
    (internal issue 2923).
  * Remove redundant SPIR-V `RuntimeSpirv` valid usage statements 04830,
    06271, 06374, and 06375 (internal merge requests 4827, 4830).
  * Suppress file-not-found `include::` errors for validusage target, using
    an IncludeProcessor extension, due to the way in which the validusage
    extension processes conditionals. Make all include paths absolute and
    require this in the style guide (internal merge request 4925).
  * Add missing `optional="true"` attribute to
    slink:VkCommandBufferInheritanceRenderingInfoKHR::pname:colorAttachmentCount
    (internal merge request 4935).
  * Remove references to apiext:VK_KHR_synchronization2 enums when that
    extension is not enabled in the specification being built (internal
    merge request 4937).
  * Minor wording changes for style guide compliance and consistency
    (internal merge request 4938).
  * Ignore etext:*_EXTENSION_NAME and etext:*_SPEC_VERSION aliases in
    `makemanaliases.py` script since there are no corresponding refpages for
    these meta-enums.

New Extensions:

  * apiext:VK_ARM_rasterization_order_attachment_access (internal merge
    request 3856).
  * apiext:VK_EXT_depth_clip_control (public issues 986 and 1054).

-----------------------------------------------------

Change log for November 16, 2021 Vulkan 1.2.199 spec update:

  * Update release number to 199 for this update.

GitHub Issues:

  * Add upper bound for stext:AccelerationStructure geometry limits for
    slink:VkPhysicalDeviceRayTracingPropertiesNV and
    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR (public issue
    1670).
  * Trivial typos in proposal documents (public pull request 1682).
  * Add missing stage mask common valid usage statements to
    slink:VkSubmitInfo, slink:VkSubpassDependency, and
    slink:VkSubpassDependency2; remove unused common VU 4098; and add new
    stage mask VUs to flink:vkCmdBeginRenderPass,
    flink:vkCmdBeginRenderPass2, flink:vkCmdSetEvent, flink:vkCmdResetEvent,
    flink:vkCmdWaitEvents, and flink:vkCmdPipelineBarrier (public
    Vulkan-ValidationLayers pull request 3331).

Internal Issues:

  * Fix formatting of <<versions-1.0, Vulkan 1.0>> appendix section headers
    (internal issue 2921).
  * Fix location of bad conditional `endif::` in SPIR-V environment appendix
    VU 06271 (internal issue 2917).
  * Use etext:VK_VERSION_m_n instead of etext:VK_API_VERSION_m_n in
    `<spirvcapability>` and `<spirvextension>` XML tags for consistency with
    other version / extension reqiurements. Note that there is a possibility
    of this change affecting downstream consumers of the XML (internal issue
    2896).
  * Add refpage cross-reference from slink:VkSwapchainKHR to
    flink:vkQueuePresent (internal issue 2823).
  * Update apiext:VK_KHR_dynamic_rendering
    proposal document to use etext:STORE_OP_DONT_CARE
    (internal merge request 4924).
  * Fix most remaining dead links in the published specifications and
    refpages by adding missing API language for basetype:VkFlags64;
    stub reference pages for apiext:VK_NVX_binary_import; and
    tag refpage aliases for API constants which were promoted to core
    (internal merge request 4921).
  * Add description of elink:VkFormats in the new <formats>
    tag for `vk.xml`, and corresponding schema and script updates.
    (internal issues 1761, 2484, and 2811).

New Extensions:

  * apiext:VK_EXT_image_view_min_lod (internal merge request 4701).

-----------------------------------------------------

Change log for November 9, 2021 Vulkan 1.2.198 spec update:

  * Update release number to 198 for this update.

GitHub Issues:

  * Sort dependencies of "`Provided by`" comments in generated API includes,
    and remove duplicates (public issue 1483, internal issue 2620).
  * Remove max-width attribute from document headers, causing CSS to limit
    page width in wide windows (public pull request 1660).

Internal Issues:

  * Filter out `VK_VERSION_1_x` pages when generating refpage sources for a
    build that does not include the corresponding core version (internal
    issue 1971).
  * Adjust section header level for extension appendix refpages to match
    other refpages (internal issue 2151).
  * Add and fix protected memory valid usage statements to require queues be
    protected if any batch if a protected batch, and restrict indirect
    operations when pname:protectedNoFault is supported (internal issues
    2169, 2841)
  * Generate refpages to SPIR-V builtins, which were marked up in the spec
    source but not being extracted and built (internal issue 2395).
  * Clarify VUID 04918 regarding use of code:Location decorations (internal
    issue 2737).
  * Remove redundant nested VK_VERSION_1_1 conditional markup from the
    <<initialization>> chapter (internal issue 2851).
  * Add code:IdrPicFlag to code:StdVideoDecodeH264PictureInfoFlags for
    provisional video extensions (internal issue 2901).
  * Fix incorrect example code in apiext:VK_HUAWEI_subpass_shading appendix
    sample code (internal merge request 4889).
  * Promote ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT and
    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT in a few
    places where the etext:KHR suffixes had not been removed (internal merge
    request 4902).
  * Add missing format properties consistency checks for
    slink:VkDrmFormatModifierPropertiesList2EXT and
    slink:VkAndroidHardwareBufferFormatProperties2ANDROID.
  * Minor editorial markup fixes.

-----------------------------------------------------

Change log for November 2, 2021 Vulkan 1.2.197 spec update:

  * Update release number to 197 for this update.

GitHub Issues:

  * Align some of the provisional video standard headers enums and bitfields
    to have predictable sizes (public issue 1571).
  * Remove exporting of D3D memory handles from
    slink:VkExportMemoryWin32HandleInfoKHR (public pull request 1612).
  * Add language to slink:VkAccelerationStructureBuildGeometryInfoKHR
    explicitly stating that source and target acceleration structures are
    allowed to be the same or different during an update (public issue
    1641).
  * Fix typos (public pull request 1662).
  * Register remaining newly introduced `vk_video` types in `vk.xml` (public
    pull request 1663).

Internal Issues:

  * Clarify <<resources-external-sharing, ownership transfers on external
    resources>> (internal issue 2692).
  * Changes to (nearly) eliminate dead internal links and improve scripts:
  ** Correctly generate API dependencies on extensions and core versions in
     cases where "`spelling aliases`" were present
  ** Clean up a few incorrectly marked up links, anchors, and refpage block
     alias= attributes
  ** Use an API alias map to substitute promoted API names for promoted-to
     APIs when an older or restricted spec is being generated and the
     promoted-to API is not included
  * Tag sname:VkVideo{Encode,Decode}H26{4,5}ProfileEXT structures as
    extending slink:VkQueryPoolCreateInfo in `vk.xml` (internal issue 2861).
  * Grammar edits to slink:VkAccelerationStructureKHR (internal issue 2887).
  * Change the cited title of the <<LoaderInterfaceArchitecture>> document
    to "`Architecture of the Vulkan Loader Interfaces`" matching a recent
    change in https://github.com/KhronosGroup/Vulkan-Loader/pull/685
    (internal merge request 4823).
  * Re-remove etext:VkVideoEncodeH265CapabilityFlagBitsEXT, which was
    accidentally reintroduced but is still unused (internal merge request
    4885).
  * Update wording for
    ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR since it no
    longer contains `"update`" (internal merge request 4886).
  * Consistency edits to remove "`instance of`" when referring to a specific
    structure, and use "`render pass`" instead of "`renderpass`" as a noun
    (internal merge request 4896).
  * Add -version option to 'makeSpec' frontend build script.

New Extensions

  * `<<VK_KHR_dynamic_rendering>>`

-----------------------------------------------------

Change log for October 13, 2021 Vulkan 1.2.196 spec update:

  * Update release number to 196 for this update.

GitHub Issues:

  * Clarify normative language for
    ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT in
    elink:VkImageUsageFlagBits, allowing two styles of implementation
    (public issue 1616).
  * Fix typo in flink:vkCmdSetScissor (public pull request 1659).
  * Reorder attributes of elink:VkFormatFeatureFlags2KHR in `vk.xml` for
    consistency (public pull request 1653).

Internal Issues:

  * More cleanup of internal broken links in various builds of the specs.
    Fix typos on xrefs and anchors, add stub pages for missing Flags and
    FlagBits types, update `spirvcapgenerator.py` to put anchors with the
    same table row they belong to, validate `apiext:` macro targets at build
    time, and don't generate API requirements for `<type>` tags with no
    `category`, eliminating spurious warnings for external types (internal
    issues 2864, 2866).
  * Update `htmldiff` scripts for Python3.
  * Add subsection titles and anchors in the <<fxvertex, Fixed-Function
    Vertex Processing>> chapter to make thematic breaks more clear (internal
    merge request 4867).

New Extensions

  * `<<VK_EXT_border_color_swizzle>>`
  * `<<VK_EXT_video_encode_h265>>` *provisional* H.265 video encode codec extension

-----------------------------------------------------

Change log for October 5, 2021 Vulkan 1.2.195 spec update:

  * Update release number to 195 for this update.

GitHub Issues:

  * Add a NOTE to flink:vkDestroyQueryPool clarifying when a query pool can
    be destroyed (public issue 1647).

Internal Issues:

  * Begin cleanup of internal broken links in various builds of the specs,
    including generating a Ruby API map to be used by the Asciidoctor macros
    to validate their API name arguments; using "nofollow" on GitHub issue
    opening links to avoid link-checkers being interpreted as DOS attacks;
    improved checker scripts; minor markup fixes; and using the `apiext:`
    macro to replace `<<VK_KHR_extension_name>>`-style extension links
    everywhere (internal issue 2831).
  * Minor editorial cleanups to descriptions of
    apiext:VK_FUCHSIA_buffer_collection APIs (internal issue 2836).
  * Match `Cull Mask` SPIR-V name to pname:mask parameter name in the
    <<acceleration-structure, Acceleration Structures>> chapter (internal
    merge request 4844).
  * Add pname:minTexelOffset and pname:maxTexelOffset limit valid usage
    statements for code:OpImageSample* and code:OpImageFetch* in the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section (internal merge request 4845).
  * Add pname:maxFragmentDualSrcAttachments and
    pname:maxFragmentCombinedOutputResources limit valid usage statements
    for output and color attachments in the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section (internal merge request 4847).

New Extensions

  * `<<VK_KHR_format_feature_flags2>>`
  * `<<VK_KHR_maintenance4>>`
  * `<<VK_EXT_rgba10x6_formats>>`

-----------------------------------------------------

Change log for September 28, 2021 Vulkan 1.2.194 spec update:

  * Update release number to 194 for this update.

GitHub Issues:

  * Add missing `len` attribute to
    slink:VkCuModuleCreateInfoNVX::pname:pData (public merge request 1646).
  * Refer to dynamic state consistently from ftext:vkCmdSet* commands, and
    link to the definition of dynamic state (public issue 1428, but with
    expanded scope beyond the actual ask in that issue).

Internal Issues:

  * Fix incorrect member name in slink:VkRenderPassCreateInfo valid usage
    statement 02515 (internal issue 2824).
  * Fix XML dependency for `<<VK_NV_device_generated_commands>>` (internal
    issue 2818).
  * Add packed formats from `<<VK_KHR_sampler_ycbcr_conversion>>`` to the
    <<formats-packed, table of packed formats>> and improve description of
    packed format naming conventions (internal merge request 4798).

New Extensions

  * `<<VK_FUCHSIA_buffer_collection>>`

-----------------------------------------------------

Change log for September 21, 2021 Vulkan 1.2.193 spec update:

  * Update release number to 193 for this update.

GitHub Issues:

  * Use consistent `implicitexternsync` language in XML for
    flink:vkDestroyDevice (public issue 1482).
  * Clarify requirements of flink:vkGetInstanceProcAddr to match that of the
    Android loader when attempting to retrieve a global function with a
    non-NULL instance parameter (public issue 1605).
  * Add new elink:VK_DRIVER_ID reservations for upcoming Mesa drivers
    (public pull request 1642).

Internal Issues:

  * Fix flink:vkCmdEndDebugUtilsLabelEXT to clarify command buffer recording
    interactions with debug labels (internal issue 2777).
  * Improve NOTE for acceleration structure capture / replay in
    slink:VkAccelerationStructureCreateInfoKHR (internal issue 2769).
  * Add "`See Also`" crosslinks to extension refpages providing aliased APIs
    in API refpages (internal issue 2819).
  * Fix markup for core version (`VK_VERSION_1_0`, etc.) refpages -
    Asciidoctor doesn't allow section headers here and this affected the
    specification appendix rendering (internal issue 2826).
  * Use open range notation for slink:VkSamplerCreateInfo
    ptext:addressMode[UVW] descriptions (internal issue 2829).
  * Replace term "`channel`" with "`component`" when discussing formats, and
    update glossary to help clarify formats such as
    ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 and
    ename:VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 (internal merge
    request 4799).
  * Fix some primitive_topology_list_restart VUIDs to only apply if
    pname:primitiveRestartEnable is ename:VK_TRUE (internal merge request
    4818).
  * Fix slink:VkPhysicalDeviceShaderCorePropertiesAMD `limittype` attributes
    in XML (internal merge request 4819).
  * Fix accidentally duplicated VUIDs 06256 due to missing {accessMaskName}
    in VUID markup (internal merge request 4829).
  * Miscellaneous minor formatting and style fixes (internal merge requests
    4832, 4838).

-----------------------------------------------------

Change log for September 14, 2021 Vulkan 1.2.192 spec update:

  * Update release number to 192 for this update.

GitHub Issues:

  * Correctly describe slink:VkDeviceQueueInfo2::pname:pNext (public issue
    1622).
  * Improve behavior of contact links from extension metadata generator
    (public merge request 1635).
  * Require slink:VkDeviceAddress in 1.0 spec conditional markup, matching
    XML (public issue 1636).

Internal Issues:

  * Turn <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section into formal Valid Usage statements with assigned valid usage IDs
    (internal issue 1598).
  * Use `pass:[~~~~]` delimiters for `[source]` blocks inside reference page
    `[open]` blocks to bypass logic problem with VUID assignment script
    (internal issue 2040).
  * Update style guide to incorporate Khronos Inclusive Language document by
    reference. Followon changes will apply the suggestions as needed
    (internal issue 2293).
  * Add clarifications about ray tracing transform matrices to
    slink:VkAccelerationStructureGeometryTrianglesDataKHR,
    slink:VkAccelerationStructureBuildOffsetInfoKHR, and the
    <<ray-intersection-candidate-determination, Ray Intersection Candidate
    Determination>> section (internal issue 2709).
  * Clarify descriptor requirements for code:Buffer and code:Subpassdata in
    the <<interfaces-resources-correspondence, Shader Resource and
    Descriptor Type Correspondence>> table (internal issue 2751).
  * Add aliases for versioned extensions which don't treat the trailing
    version number as a separate word, such as
    ename:VK_KHR_MAINTENANCE1_SPEC_VERSION ->
    ename:VK_KHR_MAINTENANCE_1_SPEC_VERSION, and add a CI test in
    `scripts/xml_consistency.py` to try and detect future occurrences
    (internal issue 2810).
  * Add missing pname:sType and pname:pNext boilerplate descriptions to spec
    language for several elink:*Features structures that were missing it
    (though they did have them in the XML definition of the structures)
    (internal issue 2815).
  * Add extension and version crosslinks to generated reference pages,
    expressing the same information in the `Provided by` comments in
    generated API includes (internal issue 2816).
  * Move the old "`Fragment Shader Execution`" section from the <<shaders>>
    chapter to the <<fragops-shader, Fragment Shading>> section of the
    <<fragops>> chapter, change anchor names accordingly, and factor out
    common related language from several parts of the spec into this section
    (internal merge request 4765).
  * Allow access to the code:PrimitiveId builtin from shaders declared with
    the code:MeshShadingNV capability (internal merge request 4767).
  * Make the <<features-primitiveTopologyListRestart,
    pname:primitiveTopologyListRestart>> feature mandatory for
    `<<VK_EXT_primitive_topology_list_restart>>` (internal merge request
    4790).
  * Edit <<limits-types, Required Limit Types>> table to add Vulkan 1.2
    interactions for pname:filterMinmaxSingleComponentFormats and
    pname:filterMinmaxImageComponentMapping limits (internal merge request
    4802).
  * Add ename:VK_FORMAT_R10X6_UNORM_PACK16 and
    ename:VK_FORMAT_R12X4_UNORM_PACK16 to the list of 16-bit packed formats,
    and fix formatting of "`wildcard`" enums containing a placeholder _i_
    tag corresponding to supported integers (internal merge request 4803).
  * Refactor CI scripts to use the Makefile `allchecks` target as part of CI
    instead of multiple separate steps, allowing a quick local check
    equivalent to that part of CI, and update that target accordingly
    (internal merge request 4807).
  * Make slink:VkImageCreateInfo valid usage statement 01572 apply to all
    compressed formats (internal merge request 4812).


-----------------------------------------------------

Change log for September 7, 2021 Vulkan 1.2.191 spec update:

  * Update release number to 191 for this update.

Internal Issues:

  * Update checker scripts to detect extension number conflicts in `vk.xml`,
    and run the check in CI (internal issue 2612).
  * Minor cleanup for the provisional video extensions, including
    documenting a few undocumented enums and structure members and some
    language cleanup (internal issue 2705).
  * Add a NOTE to flink:vkAllocateMemory.txt about protected memory
    allocation count limits (internal issue 2791).
  * Use "`cube map`" spelling, and add this case to the style guide
    (internal merge request 4794).

New Extensions:

  * `<<VK_EXT_pageable_device_local_memory>>`

-----------------------------------------------------

Change log for August 29, 2021 Vulkan 1.2.190 spec update:

  * Update release number to 190 for this update.
  * Released a few days in advance of the usual Tuesday spec updates due to
    holiday meeting schedule.

GitHub Issues:

  * Make treatment of empty etext:Vk*FlagBits types consistent in `vk.xml`
    (public issue 1601 and merge request 1609)

Internal Issues:

  * Add more descriptive language for transforms in the
    <<ray-intersection-candidate-determination, Ray Intersection Candidate
    Determination>> section (internal issue 2709).
  * Update `-validate` logic in registry scripts to validate the `limittype`
    attribute presence and values where required (internal issue 2606).
  * Update common validity statements for access masks to allow shader
    pipeline bits to be use with ename:VK_ACCELERATION_STRUCTURE_READ_BIT
    (internal issue 2782).
  * Fix typo in the description of code:CullDistancePerViewNV (internal
    merge request 4769).
  * Various fixes and simplifications for
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>> valid
    usage statements:
  ** Flatten markup for VK_KHR_shader_subgroup_extended_types valid usage
     statements (internal issue 1598)
  ** Flatten markup for VK_EXT_shader_atomic_float valid usage statements
     (internal issue 1598).
  ** Remove Asciidoctor conditional check for
     `VK_KHR_storage_buffer_storage_class`, not needed because the SPIR-V
     specification is unified and `spirv-val` will throw an error if trying
     to use code:StorageBuffer without the proper extension / version being
     set (internal merge request 4779).

New Extensions:

  * `<<VK_KHR_shader_integer_dot_product>>`
  * `<<VK_EXT_primitive_topology_list_restart>>`

-----------------------------------------------------

Change log for August 17, 2021 Vulkan 1.2.189 spec update:

  * Update release number to 189 for this update.

GitHub Issues:

  * Add parent check valid usage statements to flink:vkUpdateDescriptors
    (public issue 1581).
  * Document the feature requirement for separate depth/stencil layouts in
    the <<resources-image-layouts, Image Layouts>> section (public issue
    1583).
  * Revert a valid usage statement constraining
    slink:VkMemoryAllocateInfo::pname:allocationSize (public issue 1595).
  * Remove misleading reference to `z` from the description of image
    coordinates for slink:VkSamplerCreateInfo::pname:unnormalizedCoordinates
    (public issue 1602).
  * Fix typo in <<fxvertex-input-extraction>> section (public pull request
    1604).
  * Fix comment in example for `<<VK_EXT_debug_utils>>` appendix to
    correctly reference pname:objectHandle, not ptext:object (public pull
    request 1606).
  * Revert `vk_platform.h` path change in `vk.xml` from public pull request
    1538, which was causing build issues for some projects. We will revisit
    this in the future but did not want to put a problematic change into the
    next SDK update (public pull request 1610).

Internal Issues:

  * Use `hexapdf` for PDF optimization, rather than Ghostscript. This
    improves overall PDF generation time about 15-20%, and final PDF size by
    about 1/3 (internal issue 2422).
  * Improve contrast for better accessibility of HTML outputs, based on
    feedback from the ANDI tool. This includes updating the specification
    CSS in `config/khronos.css`, switching to the rouge source code
    highlighter instead of coderay, and overriding some of the rouge theme
    CSS (internal issue 2784).
  * Clarify that transforms are consumed only if transformData is non-null
    for slink:VkAccelerationStructureBuildRangeInfoKHR.txt (internal issue
    2787).
  * Make spec language describing bitmasks consistent as 'Bits which can: be
    set' (internal merge request 4762).
  * Support `optional` attribute in the valid usage statement generator for
    union types (internal merge request 4772).

-----------------------------------------------------

Change log for August 10, 2021 Vulkan 1.2.188 spec update:

  * Update release number to 188 for this update.

GitHub Issues:

  * Add missing `optional="true"` attributes to pname:pNext members. Enable
    `scripts/xml_consistency.py` in CI, and add check for this case (public
    pull request 1597).
  * Add missing markup (setting `refpage` attributes where they were needed
    for commonvalidity statements) to fix some broken valid usage ID link
    names (public issue 1598).
  * Update valid usage statement 02650 to use "`potential format features`"
    consistently with other recent changes (discussion on public
    Vulkan-ValidationLayers pull request 3139).

Internal Issues:

  * Clarify the role of <<ray-traversal-culling-face, face winding>> in the
    context of ray intersection candidate determination and alias
    ename:VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR to
    ename:VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR, corresponding
    to the clarifications (internal issue 2780).
  * Add valid usage statement for flink:vkCmdBeginTransformFeedbackEXT
    requiring a valid graphics pipeline be bound (internal issue 2785).
  * Use the term <<acceleration-structure-def, "`constructed`">> to refer to
    an acceleration structure that was previously built or created by
    copying or deserialization of a built acceleration structure (internal
    merge request 4727).
  * Add explicit valid usage statements to flink:vkWaitForPresentKHR and
    slink:VkPresentInfoKHR requiring the corresponding features be enabled
    (internal merge request 4754).
  * Remove extraneous trailing periods from some valid usage statements
    (internal merge request 4759).

New Extensions:

  * `<<VK_EXT_load_store_op_none>>`

-----------------------------------------------------

Change log for August 3, 2021 Vulkan 1.2.187 spec update:

  * Update release number to 187 for this update.

GitHub Issues:

  * Add glossary terms for "`pipeline ray tracing instructions`" and "`ray
    tracing commands`" (public issue 1578).
  * Limit the code:OpTypeImage code:Unknown format restriction to storage
    images in the <<spirvenv-module-validation-runtime, Runtime SPIR-V
    Validation>> section (public issue 1588).
  * Fix slink:VkRect2D::pname:extent in a few places where it was
    misreferenced as pname:offset (public pull request 1590).

Internal Issues:

  * Clarify that depth values outside the range [0,1] become undefined
    following the depthClamp stage of the pipeline, by rearranging the
    <<fragops-depth, Depth Test>> section and adding a new "`Depth Clamping
    and Range Adjustment`" subsection (internal issues 2445, 2753).
  * Clarify valid usage statement 01843 for slink:VkDeviceQueueInfo2 to
    match similar statement for flink:vkGetDeviceQueue, and split off part
    of it into a new VU statement (internal issue 2645).
  * Fix a few enumerant and member names in the provisional video extensions
    to comply with the spec style guidelinse (internal issue 2710).
  * Update the descriptions of flink:vkCmdDrawMultiEXT and
    flink:vkCmdDrawMultiIndexedEXT to clarify how they are equivalent to
    calling underlying drawing commands multiple times with different
    parameters (internal issue 2757).
  * Renumber VUIDs which duplicated the numeric portion of another
    non-common VUID, and add a duplicate number detection test to CI to
    prevent recurrences (internal issue 2764).
  * Make code:SubgroupSize command scope uniform in compute dispatches
    (internal issue 2773).
  * Expand the list of valid image layouts for
    <<attachment-type-imagelayout, input attachments>>,
    <<descriptorsets-sampleimage, sampled images>>, and
    <<descriptorsets-combinedimagesampler, combined image samplers>> to
    include DEPTH_READ_ONLY_OPTIMAL and STENCIL_READ_ONLY_OPTIMAL (internal
    issue 2774).
  * Remove `flowRoot` SVG elements from a few recent image updates, as they
    are not supported by the current PDF toolchain (internal issue 2778).
  * Update to asciidoctor-chunker 1.0.4, adding support for `aria-label`
    accessibility tags on the chunked specification forward/back section
    navigation arrows (internal issue 2784).
  * Clean up description of flink:vkCmdClearAttachments and remove redundant
    information (internal merge request 4717).
  * Add a description of each of the
    flink:vkCmdWriteAccelerationStructuresPropertiesKHR::pname:queryPool
    query types (internal merge request 4728).
  * Add new valid usage statement to slink:VkMemoryAllocateInfo when
    allocating a memory object larger than the reported limit (internal
    merge request 4737).
  * Add missing description of pname:layerCount member of
    slink:VkFramebufferAttachmentImageInfo (internal merge request 4744).


-----------------------------------------------------

Change log for July 27, 2021 Vulkan 1.2.186 spec update:

  * Update release number to 186 for this update.

GitHub Issues:

  * Reduce size and increase clarity of some SVG images for the provisional
    video extensions (public issue 1537).
  * Use a consistent description of pname:stride as "`byte stride`" rather
    than "`distance in bytes`" in a few places (public issue 1575)
  * Clarify the equivalence of flink:vkQueueWaitIdle to
    fence submission (public issue 1579).
  * Fix XML capabilities for new code:*Float*Atomic* SPIR-V capabilities to
    require slink:VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT rather than
    slink:VkPhysicalDeviceShaderAtomicFloatFeaturesEXT (public pull request
    1587, although fixed internally first).

Internal Issues:

  * Refactor Asciidoctor conditionals imbedded within valid usage statements
    so they are extracted properly to `validusage.json`, and add a CI check
    to prevent this happening in the future (internal issues 1529, 2439).
  * Clarify that dynamic vertex buffer object stride of 0 is allowed in
    valid usage statement for flink:vkCmdBindVertexBuffers2EXT
    (internal issue 2742)
  * Add valid usage statement to
    ftext:vkGetPhysicalDeviceSurfaceCapabilities{KHR,2EXT,2KHR},
    ftext:vkGetPhysicalDeviceSurfacePresentModes{KHR,2EXT}, and
    ftext:vkGetDeviceGroupSurfacePresentModes{KHR,2EXT} requiring surface /
    device compatibility (internal issue 2744).
  * Clarify the requirements on code:OpTypeImage for input attachments in
    the <<spirvenv-module-validation, Validation Rules within a Module>> and
    <<interfaces-inputattachment, Fragment Input Attachment Interface>>
    sections (internal issue 2752)
  * Clarify that stipple parameters are ignored when line stipple is
    disabled in slink:VkPipelineRasterizationLineStateCreateInfoEXT
    (internal issue 2763)
  * Improve wording for the shader interface code:Location limit in the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section (internal merge request 4693)

-----------------------------------------------------

Change log for July 20, 2021 Vulkan 1.2.185 spec update:

  * Update release number to 185 for this update.
  * Going forward we will probably be moving the default day for spec
    updates to Tuesday (Pacific time) rather than Monday.

GitHub Issues:

  * Clarify that only *device* extensions are required to be specified in
    valid usage statement for flink:vkCreateDevice (public issue 1567).
  * Fix extension dependencies for `<<VK_EXT_calibrated_timestamps>>` to
    include `<<VK_KHR_get_physical_device_properties2>>` (public issue
    1568).
  * Conditionalize xref to VkPhysicalDeviceSubgroupProperties in
    `<<VK_KHR_spirv_1_4>>` appendix so it does not show up in a 1.0 spec
    build (public issue 1574).
  * Relax portability usage of the identity swizzle in
    slink:VkImageViewCreateInfo valid usage statement 04465 (public
    KhronosGroup/Vulkan-Portability issue 27).

Internal Issues:

  * Document in the <<extendingvulkan-extensions-extensiondependencies,
    Extension Dependencies>> section that instance extensions do not have
    dependencies on device extensions, and add a similar requirement to the
    description of the `requires` attribute of extension tags in the
    registry schema document (internal issue 2387).
  * Fix `optional` attribute in XML for
    flink:vkCmdBindVertexBuffers2EXT::pname:pBuffers (internal issue 2574).
  * Remove redundant valid usage statements from flink:vkCmdPipelineBarrier,
    flink:vkCmdSetEvent, and flink:vkCmdResetEvent. Add missing VUs for
    slink:VkSubpassDependency and slink:VkSubpassDependency2 (internal issue
    2583).
  * Clarify that
    ename:VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR
    must be supported in pname:bufferFeatures (internal issue 2686).
  * Clarify that a valid function pointer pname:fp returned from
    flink:vkGetInstanceProcAddr must not be `NULL` (internal issue 2720).
  * Relax code:Flat, code:NoPerspective, code:Sample, and code:Centroid
    storage class restriction in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section (internal issue 2721).
  * Clarify forward progress behavior of flink:vkAcquireNextImageKHR and
    flink:vkQueuePresentKHR (internal issue 2729).
  * Remove duplicated language describing queue submission in the
    <<fundamentals-execmodel, Execution Model>> and
    <<fundamentals-queueoperation, Queue Operation>> sections (internal
    issue 2736).
  * Describe the new pipeline stage
    ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI in several sections
    of the <<synchronization>> chapter where it was missing (internal issue
    2745).
  * Improve formatting in the <<limits>> chapter, add support for the
    missing optionally: normative word macro, and replace most use of
    (non-normative) "`optionally`" with normative "`can:`". Update style
    guide to add more contractions and remove contractions from the spec.
    add a better description of the pname:shaderDrawParameters feature
    (internal merge requests 4699, 4708).
  * Fix name of parameter
    flink:vkGetMemoryRemoteAddressNV::pname:pMemoryGetRemoteAddressInfo to
    follow Vulkan conventions (internal merge request 4704).
  * Minor fixes for the <<resources-image-views-compatibility, image view
    compatibility table>> and related minor spec language fixes elsewhere
    (internal merge request 4709).

New Extensions:

  * `<<VK_EXT_shader_atomic_float2>>`
  * `<<VK_HUAWEI_invocation_mask>>`
  * `<<VK_KHR_present_id>>`
  * `<<VK_KHR_present_wait>>`

Miscellany:

  * Happy Lunar Landing Day!

-----------------------------------------------------

Change log for July 5, 2021 Vulkan 1.2.184 spec update:

  * Update release number to 184 for this update.

GitHub Issues:

  * Make description of
    slink:VkSparseImageMemoryRequirements::pname:formatProperties.imageGranularity
    consistent by replacing the nested structure descriptions with a simple
    description of pname:formatProperties (public issue 1444).
  * Update `<<VK_HUAWEI_subpass_shading>>` extension to rename
    flink:vkGetSubpassShadingMaxWorkgroupSizeHUAWEI to
    flink:vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI and give it a
    dispatchable slink:VkDevice parameter (public issue 1564).
  * Fix labelling of "`Resource`" reference block in pipeline block
    diagrams (public issue 1582).

Internal Issues:

  * Replace the old <<resources-image-views-compatibility>> table with a
    simplified image type / image view type compatibility table, and move
    the parameter compatibility portions of the table into explicit valid
    usage statements (internal issue 2586).
  * Define the slink:VkPipelinCacheHeaderVersionOne structure in `vk.xml`
    instead of the previous "`Layout for pipeline cache header version one`"
    table (internal merge request 4011).
  * Make the `requires` attribute of the `spirvcapability` XML tag required
    when specifying a structure, even if what's required is
    `"VK_VERSION_1_0"`, to address a problem in the generated table from
    these tags (internal merge request 4689).

New Extensions:

  * `<<VK_NV_extermal_memory_rdma>>`

-----------------------------------------------------

Change log for June 28, 2021 Vulkan 1.2.183 spec update:

  * Update release number to 183 for this update.

GitHub Issues:

  * Rewrite and simplify the <<interfaces-iointerfaces-matching, Interface
    Matching>> section. Clarify that results are undefined if the size of a
    vector mismatches (public issue 666; internal issues 1269, 2059, 2323).
  * Remove inappropriate `const` from `void *pNext` members of
    `returnedonly` structures in `vk.xml` (public issue 1482, internal issue
    2644).
  * Add a NOTE to the <<interfaces, Shader Interfaces>> chapter that SPIR-V
    execution model keywords with extension suffixes will always be present
    in spec builds, even in a build not supporting any extensions, since
    these keywords appear in the unified SPIR-V specification without such
    qualifiers (public issue 1483, internal issue 2621).
  * Modify `vk.xml` to include the Vulkan platform header via the path
    `vulkan/vk_platform.h` rather than just `vk_platform.h`
    (public pull request 1538).
  * Add length annotations for slink:VkCuLaunchInfoNVX (public issue 1548).
  * Describe slink:VkSubpassDescription::pname:pDepthStencilAttachment
    correctly as a pointer to a structure, not a pointer to an array of
    structures (public issue 1561).
  * Fix `structextends` attribute of
    slink:VkPhysicalDeviceRayTracingMotionBlurFeaturesNV, declare its
    pname:pNext member correctly, and fix some typos in the related
    extension language (public issue 1565, internal issue 2724).

Internal Issues:

  * Add explicit valid usage statements for
    flink:vkCmdClearColorImage::slink:VkClearColorValue and
    slink:VkRenderPassBeginInfo::slink:VkClearValue (internal issue 2490).
  * Change the term "`vertex processing {shader} stage`" to
    "`pre-rasterization shader stage`" throughout the specification, link to
    a single definition, and add "`pre-rasterization`" to the glossary
    (internal issue 2634).
  * Add an `<implicitexternsync>` constraint for
    flink:vkResetCommandBuffers::pname:pool (internal issue 2646).
  * Fix typo `vkCmdResetEvent` -> `vkResetEvent` in flink:vkResetEvent valid
    usage statements (internal issue 2651).
  * Fix wording of scope dependencies for slink:VkMemoryBarrier2KHR,
    slink:VkBufferMemoryBarrier2KHR, and slink:VkImageMemoryBarrier2KHR
    members pname:srcAccessMask and pname:dstAccessMask (internal issue
    2654).
  * Require support for pname:shaderInt64 in the <<features-requirements,
    Feature Requirements>> section when pname:atomicInt64 features are
    supported (internal issue 2660).
  * Clarify ray tracing valid usage statements for cases where a parameter
    refers to an acceleration structure that must have been built (internal
    issue 2715).
  * Add a NOTE clarifying shader record buffer uniformity in the
    <<shader-binding-table, Shader Binding Table>> section (internal issue
    2719).
  * Minor clarifications and typo fixes to `<<VK_HUAWEI_subpass_shading>>`
    (internal issue 2722).
  * Add missing <spirvextension> entry in `vk.xml` to enable
    `SPV_KHR_subgroup_uniform_control_flow`
    (internal issue 2733).
  * Move SPIR-V valid usage statement from the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section to <<spirvenv-module-validation-standalone]] Standalone SPIR-V
    Validation>> (internal merge request 4637).
  * Add a new <<spirvenv-image-signedness, Signedness of SPIR-V Image
    Accesses>> section to allow the use of unsigned Sampled Types with
    code:SignExtend and signed code:Format decorations (internal merge
    request 4638).
  * Add missing slink:VkDeviceCreateInfo to `structextends` attribute of
    slink:VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT (internal merge
    request 4652).
  * Remove nonexistent pname:minFragmentSize from the <<limits-minmax, Limit
    Requirements>> table (internal merge request 4655).
  * Fix markup typo for `<<VK_NV_fragment_shader_barycentric>>` ifdef
    (internal merge request 4663).

-----------------------------------------------------

Change log for June 21, 2021 Vulkan 1.2.182 spec update:

  * Update release number to 182 for this update.

GitHub Issues:

  * Add XML attributes & schema updates to link untyped Vulkan object handle
    values to corresponding object types (public issue 1536).

Internal Issues:

  * Automatically generate links to extension proposal documents from
    extension appendices (internal issue 2713).
  * Clean up wording of flink:vkCmdWriteTimestamp and
    flink:vkCmdWriteTimestamp2KHR (internal issue 2425).
  * Fix hpp-compile CI stage after recent changes to Vulkan-Headers
    repository which generate additional header files.

New Extensions:

  * `<<VK_EXT_acquire_drm_display>>` (public pull request 1529).
  * `<<VK_EXT_multi_draw>>`
  * `<<VK_EXT_physical_device_drm>>` (public pull request 1356).
  * `<<VK_HUAWEI_subpass_shading>>`
  * `<<VK_NV_ray_tracing_motion_blur>>`

-----------------------------------------------------

Change log for June 14, 2021 Vulkan 1.2.181 spec update:

  * Update release number to 181 for this update.

GitHub Issues:

  * Add stub slink:VkPipelineLayoutCreateFlagBits <enum> type in `vk.xml` to
    reduce spurious warnings from XML processing scripts that don't respect
    the `supported="disabled"` attribute, and update the registry schema
    documentation to make more clear that `extension` tags with this
    attribute should not be processed (public issue 1549).

Internal Issues:

  * Clarify implicit conversions between the vertex input attribute
    description format and the shader vertex attribute input type in the
    <<fxvertex-attrib-location, Attribute Location and Component
    Assignment>> and <<fxvertex-input-extraction>> sections (internal issue
    902).
  * Add text about the <<interfaces-alignment-requirements, base alignment
    of empty structures>> (internal issue 2174).
  * Clarify the use of rasterization order <<primsrast-order,
    "`operations`">> (internal merge request 4582).
  * Allow any pipeline barrier command for queue transfers in the
    <<synchronization-queue-transfers, Queue Family Ownership Transfer>>
    section (internal merge request 4596).
  * Remove potentially confusing reference to
    ename:VK_ERROR_INVALID_SHADER_NV in the description of
    flink:vkCreateShaderModule (internal merge request 4602).
  * Improve visibility of instance creation callbacks by migrating some
    language from the `<<VK_EXT_debug_report>>` and `<<VK_EXT_debug_utils>>`
    appendix examples to the description of slink:VkInstanceCreateInfo
    (internal merge request 4614).
  * Fix markup for sparse image atomic requirements in the
    <<features-requirements, Feature Requirements>> section and for
    slink:VkDeviceCreateInfo valid usage statements (internal merge request
    4618).
  * Correct the definition of
    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT
    to constrain pname:chromaFilter, not pname:minFilter / pname:magFilter
    (internal merge request 4623).
  * Add level 3 headings in <<pipelines-cache, Pipeline Cache>> section
    (internal merge request 4627).
  * Clarify flink:vkCmdCopyAccelerationStructureKHR to add details on the
    copy command itself, as well as the etext:CLONE and etext:COMPACT copy
    modes (internal merge request 4631).
  * Remove `<mask>` tags from some SVG images in the provisional video
    extensions. These tags are not supported by components of the PDF
    toolchain. Removing them removes many warnings from the PDF build and is
    a workaround for editing the SVGs to use alternate constructs for the
    intended purpose, although it also make these images in the HTML output
    show the same artifacts as the PDF output.

-----------------------------------------------------

Change log for June 7, 2021 Vulkan 1.2.180 spec update:

  * Update release number to 180 for this update.

GitHub Issues:

  * Add more details about zero shader group handles and draw linkage to
    etext:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL* flags (public issue 1487).
  * Clarify that semaphore operations don't do work in a specific pipeline
    stage in slink:VkSemaphoreSubmitInfoKHR::pname:stageMask (public issue
    1501).
  * Fix markup in shared valid usage statements 03766 / 03767 (public issue
    1528).

Internal Issues:

  * Grammatical improvements for various ray tracing sections. Add statement
    that AABB intersections may be false-positives (internal issue 2597).
  * Disambiguate ASTC HDR block error handling in
    <<appendix-compressedtex-astc, ASTC Compressed Image Formats>> and the
    following "`ASTC decode mode`" section (internal issue 2603).
  * Fix some holes in `<<VK_EXT_vertex_input_dynamic_state>>`, including
    adding some missing common draw validity statements; an interaction
    with VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT; an interaction
    with code:nullDescriptor to flink:vkCmdBindVertexBuffers2EXT; and
    language to
    slink:VkGraphicsPipelineCreateInfo::pname:pVertexInputState (internal
    issue 2637, 2684).
  * Make elink:VkAccessFlagBits and elink:VkAccessFlagBits2KHR descriptions
    consistent and reorganize them in matching order (internal issue 2650).
  * Add slink:VkSpecializationInfo::pname:pMapEntries valid usage
    statement requiring the pname:constantID values be unique (internal
    issue 2668).
  * Clarify <<queries-wait-bit-not-set, the cases in which
    flink:vkGetQueryPoolResults returns VK_NOT_READY>> (internal issue
    2676).
  * Add spec language and refpages for API constants. With this change all
    APIs should be defined in the spec (internal issue 2698).
  * Move some restrictions in the <<interfaces, Shader Interfaces>> chapter
    into the <<spirvenv-module-validation-standalone, Standalone SPIR-V
    Validation>> section (internal merge request 4537).
  * Add missing member descriptions to slink:VkSurfaceCapabilities2EXT
    (internal merge request 4544).
  * Update glossary definition of "`Aspect`" to accommodate copy commands
    which can operate on multiple aspects (internal merge request 4586).
  * Add ename:VK_VALIDATION_FEATURE_DISABLE_SHADER_VALIDATION_CACHING_EXT
    enum to provide a standard way to disable caching of shader validation
    results (internal merge request 4589).
  * Remove the `pipeline` attribute from `vk.xml`, and the corresponding
    "`Pipeline Types`" column from the generated command properties tables.
    The `queues` attribute should be used instead (internal merge request
    4594).
  * Fix typos and improve consistency in the provisional video extension
    language (internal merge request 4598).
  * Use "`implementation-dependent`" spelling consistently, and update the
    style guide to match (internal merge request 4611).
  * Update <<ray-intersection-candidate-determination, ray tracing
    intersection equation>> for triangles to match other API. This cannot be
    distinguished in practice (internal vk-gl-cts issue 2846).

New Extensions:

  * `<<VK_KHR_shader_subgroup_uniform_control_flow>>`
  * `<<VK_EXT_global_priority_query>>`

-----------------------------------------------------

Change log for May 24, 2021 Vulkan 1.2.179 spec update:

  * Update release number to 179 for this update.

GitHub Issues:

  * Require that the queried
    slink:VkPhysicalDeviceExternalMemoryHostPropertiesEXT::pname:minImportedHostPointerAlignment
    is a power of two (public issue 1442).
  * Fix direction of enum aliasing for fragment shading rate extensions,
    so NV tokens don't show up in a KHR-only specification build
    (public issue 1482).
  * Split the new <<fundamentals-validusage, Valid Usage>> section off from
    its previous location within the <<fundamentals-errors, Errors>> section
    (public pull request 1503).
  * Correct some typos in stage parameter names (public pull request 1507).
  * Fix minor markup issues (public pull request 1508).
  * Add missing `optional` attribute to
    flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR::pname:pVideoFormatPropertyCount
    in `vk.xml` (public pull request 1514).
  * Add additional header dependencies for external code:Std* types in the
    provisional video extensions (public pull request 1515).
  * Tagged slink:VkCuModuleCreateInfoNVX::pname:pName as
    `len="null-terminated"` in `vk.xml` (public issue 1526).
  * Fix `:anchor-prefix:` markup showing up in spec outputs due to
    overzealous whitespace removal (public issue 1530).
  * Protect use of `__cplusplus` macro in a preprocessor test in the headers
    (public Vulkan-Headers issue 4).

Internal Issues:

  * Rephrase the language describing lifetime of EDID query results for
    slink:VkDisplayPropertiesKHR to be more precise (internal issue 695).
  * Clarify descriptor pool size aggregation behavior for
    slink:VkDescriptorPoolCreateInfo.txt (internal issue 2577).
  * Make valid usage statements for slink:VkImportMemoryFdInfoKHR and
    slink:VkMemoryGetFdInfoKHR properly enforce the relationship between
    pname:fd and pname:handleType (internal issue 2607).
  * Add missing common, non-indirect shared valid usage statements for
    flink:vkCmdDispatchBase (internal issue 2625).
  * Call out precision of pname:subPixelPrecisionBits clearly in the
    <<vertexpostproc-viewport, Controlling the Viewport>> section (internal
    issue 2635)
  * Do not allow code:RayPayloadKHR on any-hit shaders in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section (internal issue 2640).
  * Simplify specification language for sname:VkMemoryDedicatedRequirements
    (internal issue 2661).
  * Remove `optional="true"` attributes from XML for
    slink:VkSurfaceCapabilities* members pname:supportedTransforms,
    pname:supportedCompositeAlpha, and pname:supportedUsageFlags, matching
    descriptions in the specification (internal issue 2666).
  * Add a concurrent deferred host operation example to the
    `<<VK_KHR_deferred_host_operations>>` appendix (internal issue 2677).
  * Add a NOTE to slink:VkAccelerationStructureCompatibilityKHR encouraging
    host-cachable memory for host acceleration structure builds (internal
    issue 2682).
  * Remove redundant language in basetype:VkSampleMask duplicating valid
    usage statements for slink:VkGraphicsPipelineCreateInfo (internal issue
    2624).
  * Allow `<<VK_EXT_shader_image_atomic_int64>>` to enable the
    code:shaderImageInt64Atomics SPIR-V feature in `vk.xml` (internal SPIR-V
    issue 644).
  * Add valid usage statement to fname:vkCmdWriteTimestamp* for the
    pname:query index in pname:queryPool (internal merge request 4528).
  * Add valid usage statements to flink:vkQueueSubmit2KHR for pname:fence
    (internal merge request 4530).
  * Add *GlCompute* to the disallowed *Output* storage classes in shared valid
    usage statement 04644 for ray tracing functionality (internal merge
    request 4532).
  * Remove redundant code:Patch decoration shared valid usage statement 04671
    (internal merge request 4530).
  * Make the code:sparseImage*Atomics features a superset of the corresponding
    code:shaderImage*Atomics features, in the slink:VkDeviceCreateInfo valid
    usage statements and the <<features-requirements, Feature Requirements>>
    section (internal merge request 4561).
  * Add `specialuse="glemulation,d3demulation"` attribute to XML for
    `<<VK_EXT_custom_border_color>>` (internal merge request 4564).
  * Make array count and pointer-to-array parameter / member descriptions
    more consistent (internal merge request 4566).
  * Add third-level section headings to the <<memory-device, Device Memory>>
    section for clarity (internal merge request 4567).
  * Use the terminology "`drawing/dispatching command`" consistently, add it
    to the style guide, and remove occasional use of "`record`" or "`perform`"
    in refpage summaries of ftext:vkCmd* (internal merge request 4569).
  * Use Asciidoctor attributes to genericize more instances of header file
    names, to enable future variant APIs (internal merge request 4581).
  * Fix SVG for some images that render incorrectly in Chrome on MacOS
    (internal merge request 4583).
  * Move some valid usage statements for
    `<<VK_QCOM_render_pass_shader_resolve>>` into
    slink:VkGraphicsPipelineCreateInfo, slink:VkRenderPassCreateInfo2, and
    the <<spirvenv-module-validation-standalone, Standalone SPIR-V
    Validation>> section (internal merge request 4584).

-----------------------------------------------------

Change log for May 10, 2021 Vulkan 1.2.178 spec update:

  * Update release number to 178 for this update.

GitHub Issues:

  * Add `optional` attribute to pname:pFragmentShadingRateAttachment member
    of slink:VkFragmentShadingRateAttachmentInfoKHR, to match specification
    text (public issue 1482).
  * Lots of minor markup and phrasing fixes (public issue 1482).
  * Additional fixes specific to ray tracing extensions, including a few
    duplicate valid usage statements, incorrect descriptions of structure
    members, and incorrect SPIR-V opcodes (public issue 1483).
  * Fix formatting around "`Special Use`" sections in generated refpages
    (public issue 1518).

Internal Issues:

  * Language cleanup including removing contractions, and some wording in
    more egregious violation of the style guide.
  * Make parameter handling text in the
    <<deferred-host-operations-requesting, Requesting Deferral>> section
    consistent with the <<fundamentals>> chapter (internal issue 2018).
  * Relax slink:VkCopyDescriptorSet valid usage statements to remove some
    constraints on copying descriptors from sets residing in host memory
    other kinds of sets (internal issue 2610).
  * Clarify the definition of "`intersection`" in the
    <<ray-intersection-candidate-determination, Ray Intersection Candidate
    Determination>> section (internal issue 2623).
  * Allow pname:stride to equal buffer size in
    slink:VkStridedDeviceAddressRegionKHR (internal issue 2631).
  * Fix the ray tracing shader interface table in the
    <<interfaces-raypipeline, Ray Tracing Pipeline Interface>> section
    (internal issue 2640).
  * Try to use consistently-phrased descriptions of etext:*FlagBits* members
    and parameters everywhere (internal issue 2656).
  * Replace "`optional pointer`" terminology with "`NULL or a pointer`" (and
    similar uses), and update the style guide accordingly (internal issue
    2662).
  * Modify wording of some pipeline creation valid usage statements to tidy
    up cases where certain state isn't required (internal merge request
    4496).
  * Clarify consistent <<descriptorsets-updates-consecutive, consecutive
    binding updates>> (internal merge request 4500).
  * Clarify that code:scalarBlockLayout is supported on the
    code:ShaderRecordBufferKHR storage class in the
    <<interfaces-resources-standard-layout, Standard Buffer Layout>> section
    (internal merge request 4525).
  * Hide boilerplate Features and Properties text where it incorrectly
    appeared outside the descriptions of feature and property structures,
    respectively (internal merge request 4541).
  * Add missing section headers to the
    `<<VK_KHR_zero_initialize_workgroup_memory>> appendix (internal merge
    request 4553).
  * Add missing `R64ui` and `R64i` entries to the SPIR-V
    <<spirvenv-format-type-matching tables, image format matching tables>>
    for `<<VK_EXT_shader_image_atomic_int64>>` (internal
    Tracker/vk-gl-cts#2885).

New Extensions:

  * `<<VK_NVX_binary_import>>` (only appendix and XML - no spec language
    yet).

-----------------------------------------------------

Change log for April 26, 2021 Vulkan 1.2.177 spec update:

  * Update release number to 177 for this update.

GitHub Issues:

  * Add valid usage statement to flink:vkDestroyImage to prevent destruction
    of presentable images acquired from flink:vkGetSwapchainImagesKHR
    (public Vulkan-ValidationLayers issue 2718).

Internal Issues:

  * Add proposal template for new feature development (internal issue 2529).
  * Remove valid usage statement 03361 from flink:vkCmdBindVertexBuffers2EXT
    (internal issue 2600).
  * Finish fixing refpage formatting issues for the new video extensions
    (internal issue 2611).
  * Invert direction of ray space matrix to correct the
    <<ray-intersection-candidate-determination, ray/triangle sidedness
    test>> (internal merge request 4480).
  * Fix capitalization of etext:*_EXTENSION_NAME and etext:*_SPEC_VERSION
    tokens for `<<VK_QCOM_render_pass_store_ops>>` (internal merge request
    4490).
  * Don't generate etext:*_MAX_ENUM tokens for 64-bit flag types. Note that
    these tokens are *explicitly* not part of the Vulkan API and are not
    included in the Specification, only in generated headers. They are added
    to enumerated types to ensure padding to 32 bits, but are completely
    pointless for the 64-bit flag types, which are defined as integer
    constants rather than enumerants (internal merge request 4493).
  * Remove empty VK_ENABLE_BETA_EXTENSION guards from headers when disabling
    extensions (internal merge request 4498).
  * Reproduce valid usage statement constraining pname:query from
    flink:vkCmdBeginQuery to
    flink:vkCmdWriteAccelerationStructuresPropertiesKHR (internal merge
    request 4520).

New Extensions:

  * `<<VK_EXT_provoking_vertex>>`

-----------------------------------------------------

Change log for April 19, 2021 Vulkan 1.2.176 spec update:

  * Update release number to 176 for this update.

GitHub Issues:

  * Fix many typos (based on public issues 1483 & 1484).
  * Fix an error in the definition of dname:VK_NULL_HANDLE which caused a
    compilation error with one version of MSVC (public issue 1502).
  * Remove duplicate requirement for elink:VkStructureType from
    dname:VK_VERSION_1_0 block of `vk.xml` (public merge request 1504).

Internal Issues:

  * Modify extension metadoc generator to include Contact information in
    extension reference pages (internal issue 2611).
  * Fix XML consistency checker script to add exceptions to naming patterns
    for new extensions (internal merge request 4491).
  * Clean up latest revision numbers in some video extension appendices to
    be integers, for compatibility with the consistency checker script
    (internal merge request 4492).
  * Mark slink:VkIndirectCommandsLayoutCreateInfoNV pname:flags member as
    `optional` in `vk.xml` (internal merge request 4501).

New Extensions:

  * `<<VK_EXT_extended_dynamic_state2>>`

-----------------------------------------------------

Change log for April 13, 2021 Vulkan 1.2.175 spec update:

  * Update release number to 175 for this update.

GitHub Issues:

  * Specify that fragment shader invocations in the same quad scope are also
    in the same primitive scope (public issue 1465).
  * Fix an incorrect reference to ename:VK_SHARING_MODE_CONCURRENT to the
    correct ename:VK_SHARING_MODE_EXCLUSIVE in the queue transfer wording
    for slink:VkBufferMemoryBarrier2KHR (public issue 1479).
  * Fix description of <<vertexpostproc-clipping, Primitive Clipping>>
    (public issues 1480 and 1481).

Internal Issues:

  * Use consistent language in describing <<features, feature>> and
    <<limits, property (limit)>> queries. In particular, a few structures
    were described as being usable to query feature support, but not to set
    it. This was incorrect. All feature structures which can appear in the
    pname:pNext chain of slink:VkPhysicalDeviceFeatures2 can be used to both
    query and set (internal issue 2310).
  * Add `limittype` attributes to the XML schema and to `vk.xml` for
    structure members which are part of physical device property queries, to
    annotate how the resulting properties are interpreted and replace some
    manual interpretation of these properties (internal issue 2427).
  * Improve slink:VkAttachmentDescription2 wording around the use of
    slink:VkAttachmentDescriptionStencilLayout for specifying the stencil
    aspect layout (internal issue 2496).
  * Split the <<extendingvulkan-coreversions-versionnumbers, major version
    field>> of a packed pname:apiVersion value, introducing a new `variant`
    field. This field allows identification of APIs based on Vulkan, but not
    fully compatible with Vulkan applications. Vulkan is variant 0, making
    the change backwards compatible with the previous definition of
    pname:apiVersion. This change was introduced to enable variants of the
    Vulkan API that Khronos may release in the future, in particular the
    in-development Vulkan SC API. It is purely a future-proofing measure and
    no near-term further use is planned. To support this split, a set of new
    macros is introduced: dname:VK_API_VERSION_VARIANT,
    dname:VK_API_VERSION_MAJOR, dname:VK_API_VERSION_MINOR, and
    dname:VK_API_VERSION_PATCH (internal issue 2531).
  * Clarify that the slink:VkRectLayerKHR members of a
    slink:VkPresentRegionKHR structure must not be transformed to align with
    the swapchain's pname:pTransform. The presentation engine must do this
    transform (internal issue 2571).
  * Fix minor issues with exposed Asciidoctor markup in spec outputs
    (internal issue 2576).
  * Tighten up wording around pool entries of mutable descriptor types. for
    slink:VkDescriptorPoolCreateInfo (internal issue 2578).
  * Expand on wording of code:FPRoundingMode valid usage statement in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section (internal merge request 4298).
  * Document interaction with `<<VK_KHR_fragment_shading_rate>>` for
    `<<VK_QCOM_render_pass_transform>>` (internal merge request 4221).
  * Require compile time constants be explicitly tagged as unsigned or float
    in `vk.xml`. Modify the generator scripts and schema documentation to
    require `type` attributes for such constants. This allows generating
    headers compliant with MISRA section 10.4 requirements, where needed
    (internal merge request 4451).
  * Minor editorial fixes (internal merge request 4454).
  * Disallow code:*Offset* decorations on storage images
    in the <<spirvenv-module-validation-standalone, Standalone SPIR-V
    Validation>> section (internal merge request 4465).
  * Improve the code: macro used in spec markup to allow imbedded wildcards
    separating words and a trailing wildcard (internal merge request 4466).
  * Modify `vk.xml` `requires` attributes to reorder definitions of
    dname:VK_DEFINE_NON_DISPATCHABLE_HANDLE and dname:VK_NULL_HANDLE. This
    prevents a corner case where the app overriding the first macro
    explicitly would prevent definition of dname:VK_NULL_HANDLE (internal
    merge request 4476).

New Extensions:

  * `<<VK_EXT_color_write_enable>>`
  * `<<VK_EXT_vertex_input_dynamic_state>>`
  * `<<VK_EXT_ycbcr_2plane_444_format>>`
  * `<<VK_NV_inherited_viewport_scissor>>`
  * Vulkan video core & codecs provisional extension package, including
  ** `<<VK_KHR_video_queue>>`
  ** `<<VK_KHR_video_decode_queue>>`
  ** `<<VK_KHR_video_encode_queue>>`
  ** `<<VK_EXT_video_decode_h264>>`
  ** `<<VK_EXT_video_decode_h265>>`
  ** `<<VK_EXT_video_encode_h264>>`

-----------------------------------------------------

Change log for March 29, 2021 Vulkan 1.2.174 spec update:

  * Update release number to 174 for this update.

GitHub Issues:

  * Add a common header macro dname:VK_USE_64_BIT_PTR_DEFINES to specify at
    compile time whether non-dispatchable handles are declared using a
    64-bit pointer type, or a 64-bit unsigned integer type. NOTE: it is
    possible that the complex platform-dependent C preprocessor block will
    move from vk.xml into the static (non-generated) vk_platform.h header in
    the near future (partially addresses public issue 1431, in addition to
    internal needs).
  * Clarify code:PatchVertices documentation for tessellation shaders
    (public pull request 1475).

Internal Issues:

  * Add valid usage statements restricting bitfield operations to 32-bit
    types in the <<spirvenv-module-validation-standalone, Standalone SPIR-V
    Validation>> section (internal issue 2561).
  * Update registry documentation to require providing the `type` attribute
    of `enum` tags when they are specifying compile time constants, and
    change the accepted values of the attribute to a small set of C scalar
    type names, instead of schema-specific names. The XML schema itself
    would ideally be updated to match, but we don't know how to do that yet
    (internal issue 2564). NOTE: it is possible this will affect downstream
    consumers of `vk.xml`, although we consider this unlikely.
  * Document in the style guide that bits reserved in corresponding 32- and
    64-bit bitmasks should be reserved in both types (internal merge issue
    2565).
  * Add output generator options to generate MISRA-friendly headers, and
    check generator scripts to avoid generating etext:RESERVED 64-bit
    bitflag names specified by `disabled` extensions in `vk.xml` (internal
    merge request 4239, internal issue 2572).
  * Clarify that compressed copies need to round up division in the
    computation `rowLength` and `imageHeight` in the sample code for the
    <<copies-buffers-images-addressing, Buffer and Image Addressing>>
    section (internal merge request 4439).

-----------------------------------------------------

Change log for March 21, 2021 Vulkan 1.2.173 spec update:

  * Update release number to 173 for this update.

GitHub Issues:

  * Fix valid usage statement for flink:vkCmdBeginQueryIndexedEXT to allow
    multiple active queries of the same type, as long as their index values
    are different (public issue 1357).
  * Fix tagging for slink:VkPhysicalDeviceVulkan11Features in `vk.xml`
    (public issue 1437).
  * Update the <<WSI Swapchain>> chapter's use of "`release`" and
    "`present`" terminology (public pull request 1470).
  * Migrate from Azure Pipelines to GitHub Actions for CI, and use updated
    Khronos Docker image to build (public pull request 1473).

Internal Issues:

  * Document requirements for extension <<extensions-feature-structures,
    Feature Structures>> (internal issue 2503).
  * Add missing valid usage statements for slink:VkAttachmentReference2 and
    separate depth/stencil layouts (internal issue 2509).
  * Clarify interactions between `<<VK_EXT_buffer_device_address>>` and
    Vulkan 1.2 in slink:VkDeviceCreateInfo valid usage (internal issue
    2530).
  * Allow variation in number of acceleration structure handles following a
    top-level acceleration structures for
    flink:vkCmdCopyAccelerationStructureToMemoryKHR (internal issue 2538).
  * Specify implementation requirement for device timestamps in the
    description of elink:VkTimeDomainEXT (internal issue 2551).
  * Update valid usage ID assignment and extraction scripts to handle IDs
    containing function pointer names (internal issue 2557).
  * Move some runtime restrictions to
    <<spirvenv-module-validation-standalone Standalone SPIR-V>> valid usage
    statements (internal merge request 4286).
  * Use new version of the HTML asciidoctor-chunker, which runs much faster,
    and a new Docker image which omits the old implementation of the chunker
    (internal merge request 4391).
  * Fix <<devsandqueues-devices, logical device creation language>> for
    Vulkan 1.1 (internal merge request 4405).
  * Modify scripts to enable platform extensions to be filtered by the
    `"supported"` attribute in `vk.xml` (internal merge request 4411).
  * Add common valid usage statement for draw/dispatch commands on format
    support for mip filters (internal merge request 4413).
  * Fix valid usage statement extractor (vu-to-json) to add padding after
    inserted list items, so they don't absorb other markup that might come
    after in the document (internal merge request 4423).
  * Disallow shadow lookups on 3D images in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section. This is not supported on all hardware, and should not have been
    allowed (internal merge request 4424).

New Extensions:

  * `<<VK_FUCHSIA_external_memory>>`
  * `<<VK_FUCHSIA_external_semaphore>>`

-----------------------------------------------------

Change log for March 8, 2021 Vulkan 1.2.172 spec update:

  * Update release number to 172 for this update.

Internal Issues:

  * Remove Asciidoctor conditional markup for extensions from
    <<spirvenv-module-validation-standalone, Standalone SPIR-V valid usage
    statements>>, and add a note to this effect for future additions
    (internal issue 2512).
  * Update the descriptions (and related validation rules) of
    code:uniformAndStorageBuffer8BitAccess and
    code:uniformAndStorageBuffer16BitAccess to only refer to the
    code:Uniform storage class; and update the 16-bit storage feature
    validation rules to refer to 16-bit floating-point, similarly to the
    feature descriptions. These changes are in the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    <<features-requirements, Feature Requirements>> sections (internal issue
    2535).
  * Ban recursion in tlink:PFN_vkDebugUtilsMessengerCallbackEXT callbacks,
    for consistency of `<<VK_EXT_debug_utils_callbacks>>` with
    `<<VK_EXT_device_memory_report>>` and the rules for
    slink:VkAllocationCallbacks (internal issue 2537).
  * Remove dependency on `<<VK_KHR_create_renderpass2>>` from `vk.xml` for
    `<<VK_KHR_synchronization2>>` (internal issue 2539).
  * Add the transform feedback pipeline stage as valid for
    ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT access (internal
    merge request 4355).
  * Fix typo in `<<VK_EXT_debug_utils>>` examples (internal merge request
    4395).
  * Fix typo to refer to "`buffer view`" rather than "`image view`" in the
    valid usage statements for code:OpImageWrite (internal merge request
    4398).
  * Fix typo in the mandatory features section related to
    `<<VK_KHR_ray_tracing_pipeline>>` (internal merge request 4406).

-----------------------------------------------------

Change log for March 1, 2021 Vulkan 1.2.171 spec update:

  * Update release number to 171 for this update.

GitHub Issues:

  * Use `strictly increasing` rather than `monotonically increasing` in the
    definition of <<glossary, timeline semaphores>> (public issue 1424).
  * Add missing raytracing pipeline creation information from
    `<<VK_KHR_pipeline_executable_properties>>` to
    flink:vkGetPipelineExecutableStatisticsKHR and
    flink:vkGetPipelineExecutableInternalRepresentationsKHR valid usage
    statements (public issue 1433).
  * Add missing `SPV_EXT_shader_atomic_float` to `vk.xml` (public issue
    1447).
  * Fix ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL to
    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT in synchronization
    valid usage statement 03938 (public issue 1458).
  * Correct the <<interfaces-resources-setandbinding, DescriptorSet and
    Binding Assignment>> "`noteworthy example`" to refer to code:OpTypeImage
    code:Samplerd=1, not code:OpTypeSampler code:Sampled=1 (public pull
    request 1459).
  * Clarify that the value of slink:VkViewport::pname:minDepth is not
    restricted relative to pname:maxDepth (Vulkan-Headers public issue 180).
  * Add valid usage statement to <<spirvenv-module-validation-standalone,
    Standalone SPIR-V Validation>> specifying that push constant array
    members must only be accessed with dynamically uniform indices
    (SPIRV-Tools public issue 2909)
  * Add valid usage statement to <<spirvenv-module-validation-standalone,
    Standalone SPIR-V Validation>> specifying when the code:Flat decoration
    must be used (SPIRV-Tools public issue 3154)

Internal Issues:

  * Specify the maximum allowed pname:depthBias unit for
    flink:vkCmdSetDepthBias (internal issue 2455).
  * Add `"protect"` attribute to provisional extension enumerants, and emit
    them with that symbol for runtime conditional inclusion from
    `vulkan_core.h`. Update description of ename:VK_ENABLE_BETA_EXTENSIONS
    to match (internal issue 2481).
  * Add valid usage statement to slink:VkImageViewCreateInfo to ban 3D image
    views when the ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT is
    set (internal issue 2501).
  * Add explicit language for the zero hit group intersection shader to the
    <<ray-intersection-confirmation, Ray Intersection Confirmation>> section
    (internal issue 2505).
  * Add a new <<raytraversal-ray-intersection-candidate-diagram, basic ray
    diagram>> (internal issue 2518).
  * Clarify that acceptable fragment shading rates are less than *or equal*
    to, not just less than, in the description of the
    <<primsrast-fragment-shading-rate-combining final combined shading
    rate>> (internal issue 2524)
  * Refer to correct barycentric coordinates for
    <<ray-intersection-candidate-determination, triangle intersection
    coordinates>> (internal issue 2525).
  * Add valid usage statements to drawing commands to match
    pname:rasterizationSamples in the pipeline state and the current
    attachments (internal merge request 4332).
  * Make use of ename:VK_WHOLE_SIZE consistent with sized flush in valid
    usage statement for slink:VkMappedMemoryRange (internal merge request
    4373).
  * Fix Asciidoctor ifdef markup around
    ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT (internal merge request 4383).
  * Move improperly placed valid usage statements from
    slink:VkImageViewCreateInfo to slink:VkImageCreateInfo (internal merge
    request 4390).
  * Add valid usage statements to <<spirvenv-module-validation-standalone,
    Standalone SPIR-V Validation>> for pname:minTexelGatherOffset and
    pname:minTexelGatherOffset.
  * Make <<spirvenv-module-validation-standalone, Standalone SPIR-V
    Validation>> valid usage statement 04681 unconditional, rather than
    having two versions when a relevant Vulkan extension is or is not
    enabled, since this is *standalone* validation.

New Extensions

  * `<<VK_QNX_screen_surface>>` (public pull request 1449).

-----------------------------------------------------

Change log for February 15, 2021 Vulkan 1.2.170 spec update:

  * Update release number to 170 for this update.

Internal Issues:

  * Add missing language for zero hit groups to the <<shader-binding-table,
    Shader Binding Table>> section and related valid usage statements
    (internal issue 2505).

New Extensions:

  * `<<VK_KHR_synchronization2>>`

-----------------------------------------------------

Change log for February 2, 2021 Vulkan 1.2.169 spec update:

  * Update release number to 169 for this update.

GitHub Issues:

  * Fix typos in language in the <<vertexpostproc-renderpass-transform,
    Render Pass Transform>> section (public issue 1406).
  * Fix case of etext:EXTENSION_NAME and etext:SPEC_VERSION enums in
    `vk.xml` for the `<<VK_QCOM_rotated_copy>>` extension (public issue
    1427).
  * Fix equations in the <<ray-intersection-candidate-determination, Ray
    Intersection Candidate Determination>> section (public issue 1427).
  * Modify examples in the `<<VK_EXT_debug_utils>>` appendix to use
    flink:vkGetInstanceProcAddr (public issue 1432).
  * Various typo fixes (public pull request 1434).

Internal Issues:

  * Add missing query types to the introduction of the <<queries>> chapter
    (internal issue 2488).
  * Tag use of union types in `vk.xml` as `noautovalidity`, since we don't
    generate meaningful valid usage statements or validation layer code at
    present. This removes a few nonsensical, and unimplemented valid usage
    statements of form 'ptext:param must: be a valid stext:VkUnionType union
    (internal issue 2490).
  * Flatten inline lists in valid usage statements in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section so the VU extraction script can process them properly (internal
    issue 2502).
  * Move some common copy buffer / copy image valid usage statements to
    `copy_bufferimage_to_imagebuffer_common.txt` so they can be shared
    (internal merge request 4344).
  * Update copyright dates to 2021 (internal merge request 4345),
  * Fix typos in Asciidoctor conditional markup in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section (internal issue 4349).
  * Fix typos in SPIR-V capability names
    code:WorkgroupMemoryExplicitLayout8BitAccessKHR and
    code:WorkgroupMemoryExplicitLayout16BitAccessKHR (internal merge request
    4359).
  * Fix typo in description of
    slink:VkCoarseSampleLocationNV::pname:pSampleLocations (internal merge
    request 4365).


-----------------------------------------------------

Change log for January 25, 2021 Vulkan 1.2.168 spec update:

  * Update release number to 168 for this update.

Internal Issues:

  * Change slink:VkAccelerationStructureNV resource classification to
    non-linear, and slink:VkAccelerationStructureKHR is neither linear nor
    non-linear. This affects the memory classification for purposes of
    <<resources-bufferimagegranularity,bufferImageGranularity>> (internal
    issue 2289).
  * Specify which storage classes are affected by code:scalarBlockLayout in
    the <<interfaces-resources-standard-layout, Standard Buffer Layout>>
    section (internal merge request 4280).
  * Flatten valid usage statements in the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section so they are correctly processed by the VU extractor script
    (internal merge request 4285).

New Extensions:

  * `<<VK_KHR_workgroup_memory_explicit_layout>>`
  * `<<VK_KHR_zero_initialize_workgroup_memory>>`

-----------------------------------------------------

Change log for January 19, 2021 Vulkan 1.2.167 spec update:

  * Update release number to 167 for this update.

GitHub Issues:

  * Clarify valid usage statements for slink:VkGraphicsPipelineCreateInfo
    interaction with potential format features (public issue 1392).
  * Use default PDF theme with a local fallback font, to provide
    floor/ceiling symbols (public issue 1400).
  * Fix valid usage statements to clarify that
    flink:vkCmdWriteAccelerationStructuresPropertiesNV only accepts
    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV (public
    Vulkan-ValidationLayers issue 2448).
  * Add missing `SPV_KHR_multiview` SPIR-V extension to `vk.xml` (public
    Vulkan-ValidationLayers issue 2456).

Internal Issues:

  * Move Acceleration Structure chapter before Ray Traversal and Ray Tracing
    chapters and reorganize Asciidoctor source markup, including inlining
    ray tracing sub-chapters (internal issue 2249).
  * Clarify the definition of the `optional='true'` XML attribute to allow
    its use with scalar types, and use it consistently in the specification
    and XML; this removes a few uses of the attribute and simplifies some
    valid usage statements (internal issue 2435).
  * Clarify that it is not valid to create an image view using a format that
    requires YCbCr conversion without passing a
    slink:VkSamplerYcbcrConversion in valid usage for
    slink:VkImageViewCreateInfo (internal issue 2458).
  * Clarify that pipeline flags do not cause the corresponding flags to
    appear in code:IncomingRayFlagsKHR variables (internal issue 2470).
  * Require that pname:supportedAlpha is never zero in text and valid usage
    statements for slink:VkDisplayPlaneCapabilitiesKHR and
    slink:VkDisplaySurfaceCreateInfoKHR (internal issue 2471).
  * Clarify that Dref values are supposed to be clamped for fixed-point
    accesses in the <<textures-depth-compare-operation, Depth Compare
    Operation>> section (internal issue 2474).
  * Fix typo for a destination stage in an issue in the
    `<<VK_EXT_transform_feedback>>` extension appendix (internal issue
    2477).
  * Restrict code:OpImageQueryLod, code:OpImageQuerySizeLod, and
    code:OpImageQueryLevels to require a sampler (not storage image) in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section (internal issue 2478).
  * Allow
    flink:vkGetAccelerationStructureBuildSizesKHR::pname:pMaxPrimitiveCounts
    to be zero by setting the `optional` attribute in the XML (internal
    issue 2480).
  * Update description of
    slink:VkDeviceMemoryReportCallbackDataEXT::pname:objectType for
    consistency with description of other parameters (internal issue 2485).
  * Add a valid usage statement to slink:VkRayTracingPipelineCreateInfoKHR
    requiring that all linked pipelines have the same set of flags specified
    from the etext:VK_PIPELINE_CREATE_RAY_TRACING_* bits (internal issue
    2489).
  * Add valid usage statements to flink:vkCmdBeginQuery /
    flink:vkCmdBeginQueryIndexedEXT to disallow use with pools created with
    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR /
    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR types
    (internal issue 2493).
  * Fix normative language for valid usage statements in the <<spirvenv,
    Vulkan Environment for SPIR-V>> appendix (internal merge request 4265).
  * Remove a few cases where `_KHR` suffixes were left on promoted
    extensions in valid usage statements (internal merge request 4293)
  * Update and futureproof a previously hardwired reference to Vulkan 1.1 in
    the <<introduction-conventions, Document Conventions>> section (internal
    merge request 4295).
  * Add code:PhysicalStorageBuffer as a valid atomic storage class in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section (internal merge request 4296).
  * Clean up phrasing of valid usage statements in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section (internal merge request 4297).
  * Add shared valid usage statement for buffer copy commands requiring
    pname:bufferRowLength to fit in a signed 32-bit integer (internal merge
    request 4302).
  * Add dname:VK_NO_STDDEF_H to allow apps to prevent including
    `<stddef.h>`, and document it in the <<boilerplate, API Boilerplate>>
    appendix (internal merge request 4312).
  * Fix typo `SkipTrianglesKHR` -> `SkipAABBsKHR` in the
    <<ray-traversal-culling-primitive, Ray Primitive Culling>> section
    (internal merge request 4315).

-----------------------------------------------------

Change log for January 4, 2021 Vulkan 1.2.166 spec update:

  * Update release number to 166 for this update.

GitHub Issues:

  * Add an Issue to the appendix for `<<VK_EXT_debug_report>>` discussing
    how to compare handles returned by the debug report callback to
    application handles (public issue 368).
  * Specify the purpose of ename:VK_LOD_CLAMP_NONE in the description of
    slink:VkSamplerCreateInfo::pname:maxLod (public issue 663).
  * Clarify in the <<extendingvulkan-extensions-extensiondependencies,
    Extension Dependencies>> section that extensions may depend on both
    other extensions, and specific core API versions. Together with previous
    changes to this section, this should close out the original issue
    (public issue 865).

Internal Issues:

  * Add descriptions of image queries to the <<textures, Image Operations
    Overview>> and <<textures-queries, Image Query Instructions>> sections
    (internal issues 2416 and 2423).
  * Allow axis swapping to be carried through clamping in the
    <<primsrast-fragment-shading-rate-combining, Combining the Fragment
    Shading Rates>> section (internal issue 2420).
  * Move even-size requirements for planar formats to valid usage statements
    for slink:VkImageCreateInfo and slink:VkImageViewCreateInfo, and tweak
    descriptions of <<formats-definition, the corresponding formats>>
    accordingly (internal issue 2434).
  * Remove Asciidoctor conditional macros from markup for
    slink:VkSamplerCreateInfo valid usage statement 01079 (internal issue
    2440).
  * Clarify behavior of the <<features-alphaToOne, pname:alphaToOne>>
    feature by linking the enable to the corresponding <<fragops-covg,
    Multisample Coverage>> fragment operation language, and specifying in
    the introduction to the <<fragops, Fragment Operations>> chapter that
    "`replacing`" a fragment shader output occurs whether or not the shader
    actually wrote that output (internal issue 2448).
  * Modify XML for
    slink:VkPipelineViewportShadingRateImageStateCreateInfoNV::pname:viewportCount
    to allow pname:viewportCount == 0 (internal issue 2449).
  * Remove "`built as`" requirement from valid usage statement 03579 for
    slink:VkWriteDescriptorSetAccelerationStructureKHR (internal issue
    2466).
  * Remove incorrect valid usage statement 03655 for
    slink:VkAccelerationStructureGeometryTrianglesDataKHR (internal issue
    2467).
  * Add location limits for mesh shaders to the
    <<interfaces-iointerfaces-limits, Shader Input and Output Locations>>
    table (internal merge request 3428).

-----------------------------------------------------

Change log for December 14, 2020 Vulkan 1.2.165 spec update:

  * Update release number to 165 for this update.

GitHub Issues:

  * Fix interaction between imageless framebuffers and
    slink:VkImageViewUsageCreateInfo for slink:VkRenderPassBeginInfo,
    elink:VkImageUsageFlagBits, and in the
    <<resources-image-inherited-usage>> section (public issue 1391).
  * Fix `vk.xml` `optional` / `noautovalidity` attributes and corresponding
    explicit valid usage statements for
    slink:VkBuildAccelerationStructureModeKHR (public issue 1405).
  * Remove redundant / incomplete handle comments from `vk.xml` for
    elink:VkObjectType enumerants (public merge request 1412).

Internal Issues:

  * Create valid usage statements from constraints in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section (internal issue 2394).
  * Fix valid usage statement 01256 for slink:VkDisplaySurfaceCreateInfoKHR
    (internal issue 2404).
  * Expand and clarify the event race condition warning for
    flink:vkCmdWaitEvents to include two additional scenarios in which the
    effect and/or state of an event becomes undefined without additional
    synchronization operations (internal issue 2411).
  * Update valid usage statement for flink:vkSetLocalDimmingAMD (internal
    issue 2446).
  * Recast slink:VkStridedDeviceAddressRegionKHR valid usage statements in
    terms of size being non-zero, instead of pname:deviceAddress (internal
    issue 2450).
  * Add missing ename:VK_SHARING_MODE_CONCURRENT valid usage statement for
    flink:vkQueueSubmit (internal merge request 4244).
  * Add limits related to local size to the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section (internal merge request 4255).
  * Fix typo in description of
    slink:VkDescriptorUpdateTemplateEntry::pname:dstArrayElement (internal
    merge request 4260).
  * Remove repeated "`all`" from slink:VkGraphicsPipelineCreateInfo valid
    usage statements (internal merge request 4266).
  * Fix internal xrefs to the SPIR-V capabilities tables, which broke as a
    side effect of generating the table instead of handcoding it (internal
    merge request 4270).
  * Fix normative language for code:WorkgroupSize (internal merge request
    4272).
  * Restore `len` attribute to `vk.xml` after its recent accidental removal
    from slink:VkDescriptorSetAllocateInfo::pname:pSetLayouts (internal
    merge request 4275).
  * Remove trailing periods from SPIR-V valid usage statements (internal
    merge request 4284).
  * Base PDF theme on builtin fallback theme, simplifying it and adding
    support for some math characters not found in the default theme
    (internal merge request 4287).

-----------------------------------------------------

Change log for December 7, 2020 Vulkan 1.2.164 spec update:

  * Update release number to 164 for this update.

GitHub Issues:

  * Reserve vendor ID for PoCL (public pull request 1411).

Internal Issues:

  * Add valid usage statements to ray tracing commands requiring they be
    given a ray tracing pipeline, and removing support for
    ename:ACCELERATION_STRUCTURE_TYPE_GENERIC in
    flink:vkCmdBuildAccelerationStructureNV (internal issue 2271).
  * Add valid usage statements disallowing the use of protected command
    buffers with Ray Tracing Pipelines and Ray Query instructions (internal
    issue 2409).
  * Move the un-numbered glossary / abbreviations / prefixes pseudo-chapters
    into a single appendix, so the table of contents looks cleaner (internal
    issue 2437).
  * Remove redundant valid usage statement from
    slink:VkCommandBufferAllocateInfo (internal merge request 4229).
  * Add missing <<features-inlineUniformBlock>> valid usage statement to
    slink:VkDescriptorSetLayoutBinding (internal merge request 4246).
  * Tweak example of Docker image invocation in `BUILD.adoc` (internal merge
    request 4249).
  * Capitalize code:LaunchIdKHR the same as in SPIR-V. code:LaunchSizeKHR
    and code:LaunchIdKHR are accessible in the code:CallableKHR shader stage
    (internal merge request 4252).
  * Remove unreachable (redundant) valid usage statements from
    flink:vkCmdBeginRenderPass and flink:vkCmdBeginRenderPass2 (internal
    merge request 4254).
  * Add missing `objtypeenum` attribute to `vk.xml` for slink:VkInstance
    (internal merge request 4263).
  * Change the chunked HTML target to use a more robust method of inserting
    additional Javascript and HTML to support the searchbox.

New Extensions:

  * `<<VK_NV_acquire_winrt_display>>`
  * `<<VK_VALVE_mutable_descriptor_type>>`

-----------------------------------------------------

Change log for November 30, 2020 Vulkan 1.2.163 spec update:

  * Update release number to 163 for this update.

GitHub Issues:

  * Add XML mapping between VK_OBJECT_TYPE_* names and object type names
    (public issue 1379).
  * Remove *_READ_BIT from .srcAccessMask in code samples (public issue
    1389).
  * Fix example code for slink:VkPushConstantRange to take
    elink:VkShaderStageFlags, not elink:VkPipelineStageFlags (public pull
    request 1393).
  * Add missing :refpage: attribute to slink:VkBlitImageInfo2KHR (public
    issue 1407).
  * Remove extraneous newline from texel block size table (public issue
    1409).

Internal Issues:

  * Update style guide to require `optional="true"` be set on pname:pNext
    structure members (internal issue 2428).
  * Sort conditionals in ifdef:: output of spirvcapgenerator for stability
    (internal issue 2430).
  * Fix slink:VkGraphicsPipelineShaderGroupsCreateInfoNV VU 02886
    (internal merge request 4225).


-----------------------------------------------------

Change log for November 23, 2020 Vulkan 1.2.162 spec update:

  * Update release number to 162 for this update.

GitHub Issues:

  * Mark pname:pNext pointers as `optional="true"` in `vk.xml` (public pull
    request 1396).
  * Make a formerly implicit slink:VkSubpassDescriptionDepthStencilResolve
    valid usage statement explicit (public Vulkan-ValidationLayers issue
    2311).

Internal Issues:

  * Clarify lifetime of push constants in the flink:vkCmdPushConstants
    description (internal issue 2168).
  * Clarify that flink:vkGetDeviceProcAddr is not intended to return
    physical device-level commands (internal issue 2344).
  * Tweak CI test for SPEC_VERSION to always succeed when the branch name
    exists, but the extension is disabled (internal merge request 4219).

New Extensions:

  * Add final (non-provisional) versions of the Vulkan Ray Tracing
    extensions (internal merge request 4143):
  ** `<<VK_KHR_acceleration_structure>>`
  ** `<<VK_KHR_ray_tracing_pipeline>>`
  ** `<<VK_KHR_ray_query>>`
  ** `<<VK_KHR_pipeline_library>>`
  ** `<<VK_KHR_deferred_host_operations>>`

-----------------------------------------------------

Change log for November 16, 2020 Vulkan 1.2.161 spec update:

  * Update release number to 161 for this update.

GitHub Issues:

  * Add some missing types to the table of handle type <->
    etext:VK_OBJECT_TYPE_* enums in the debugging chapter (in response to a
    comment on public issue 1379).

Internal Issues:

  * Move copyright statement into its own "`Preamble`" chapter to simplify
    preprocessing for chunked HTML target and make PDF / single-page HTML
    consistent with the chunked output (internal issue 2384).
  * Clarify that slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes
    and slink:VkExternalMemoryImageCreateInfo::pname:handleTypes can be
    zero, and fix missing `optional` attribute in `vk.xml` for the latter
    case (internal issue 2388).
  * Make `specialuse` attributes in source markup expand properly in
    extension refpages (internal issue 2412).
  * Remove as yet unused slink:VkSemaphoreCreateFlagBits type from `vk.xml`
    (internal issue 2413).
  * Remove unreachable valid usage statements for
    slink:VkRenderPassMultiviewCreateInfo::pname:pViewMask in the
    slink:VkRenderPassCreateInfo pname:pNext chain, and for
    slink:VkRenderPassCreateInfo2::pname:viewMask. These statements cannot
    ever be violated given that view masks cannot exceed index 31 and
    pname:maxFramebufferLayers exceeds this value (internal merge request
    4204).
  * Only allow forward pointers for physical storage buffers in the
    <<spirvenv-module-validation>> section (internal merge request 4206).
  * Fix a variety of minor valid usage statement issues with the
    `<<VK_KHR_fragment_shading_rate>>` extension (internal merge request
    4207).

-----------------------------------------------------

Change log for November 9, 2020 Vulkan 1.2.160 spec update:

  * Update release number to 160 for this update.

GitHub Issues:

  * Remove redundant input attachment valid usage statements from
    slink:VkAttachmentReference2 (public issue 1378).

Internal Issues:

  * Restore "`Preamble`" section containing the copyright statement to the
    proper place in the chunked specification index (internal issue 2384).
  * Add missing valid usage statements for
    flink:vkCmdDrawIndirectByteCountEXT (internal issue 2400).
  * Move vertex input example from the <<fxvertex>> chapter to the Vulkan
    Guide (internal merge request 4162).
  * Clarify update-after-bind limits for dynamic buffers in the
    <<limits-maxDescriptorSetUpdateAfterBindUniformBuffersDynamic>> and
    <<limits-maxDescriptorSetUpdateAfterBindStorageBuffersDynamic>> sections
    (internal merge request 4186).
  * Clarify slink:VkFramebufferCreateInfo to allow read-only use of depth
    images as attachments and non-attachments (internal merge request 4191).
  * Remove redundant valid usage statement from slink:VkWriteDescriptorSet
    (internal merge request 4196).
  * Remove redundant valid usage statement from flink:vkFreeDescriptorSets
    (internal merge request 4198).
  * Fix typo in slink:VkDisplaySurfaceCreateInfoKHR valid usage statement
    (internal merge request 4199).
  * Remove redundant pname:firstViewport / pname:firstScissor limit checks
    in valid usage statements for flink:vkCmdSetViewportWScalingNV,
    flink:vkCmdSetScissor, flink:vkCmdSetExclusiveScissorNV,
    flink:vkCmdSetViewportShadingRatePaletteNV, and flink:vkCmdSetViewport
    (internal merge request 4200).

New Extensions:

  * `<<VK_NV_fragment_shading_rate_enums>>`

-----------------------------------------------------

Change log for November 1, 2020 Vulkan 1.2.159 spec update:

  * Update release number to 159 for this update.

GitHub Issues:

  * Clarify handle uniqueness with private data in the
    <<fundamentals-objectmodel-overview, Object Model>> section (public
    issue 1349).
  * Make ename:VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR
    an alias of
    ename:VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR
    and ename:VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR
    an alias of
    ename:VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR,
    for backwards compatibility while complying with naming conventions
    (public issue 1367).
  * Make ename:VK_SURFACE_COUNTER_VBLANK_EXT an alias of
    ename:VK_SURFACE_COUNTER_VBLANK_BIT_EXT for backwards compatibility
    while complying with naming conventions (public issue 1368).
  * Add a note to the <<memory-model-synchronizes-with, Synchronizes-With>>
    section that fragment shader interlock instructions don't perform
    implicit availability or visibility operations (public issue 1383).

Internal Issues:

  * Dynamically generate SPIR-V <<spirvenv-capabilities-table,
    Capabilities>> and <<spirvenv-extensions-table, Extensions>> tables from
    new tags in `vk.xml`, exposing this information for other projects
    downstream (internal issue 2156).
  * Clarify when a <<renderpass-feedbackloop, feedback loop>> creates a data
    race (internal issue 2296).
  * Remove un-needed `noautovalidity` attributes on pname:pNext structure
    members, including a few cases where they were actually suppressing
    appropriate autogenerated validity statements (internal issue 2335;
    similar purpose to closed public PR 1339).
  * Clarify treatment of most-negative signed normalized fixed-point values
    in the <<fundamentals-fixedfpconv, Conversion from Normalized
    Fixed-Point to Floating-Point>> section (internal issue 2367).
  * Clarify that enabling an extension cannot change existing implementation
    behavior in the introduction to the <<extendingvulkan-extensions,
    Extensions>> chapter (internal issue 2375).
  * Add missing valid usage statement to flink:vkCreatePrivateDataSlotEXT
    (internal issue 2379).
  * Fix a misplaced Asciidoctor `endif::` for flink:vkCreateSwapchainKHR
    (internal merge request 4177).
  * Add missing pname:aspectMask valid usage statement to
    slink:VkSubpassDescription2, matching
    slink:VkInputAttachmentAspectReference (internal merge request 4177).
  * Clarify <<interfaces, SPIR-V rules on decorations>> (internal
    spirv/SPIR-V issue 444).
  * Add missing `<<VK_VERSION_1_2>>` to all
    `<<VK_EXT_separate_stencil_usage>>` conditional markup (internal
    vulkansc/vulkansc issue 58).

New Extensions:

  * `<<VK_QCOM_rotated_copy_commands>>` (internal merge request 4132).

-----------------------------------------------------

Change log for October 19, 2020 Vulkan 1.2.158 spec update:

  * Update release number to 158 for this update.

Internal Issues:

  * Clarify that  linear filtering can be used with comparison sampling
    in valid usage statements for dispatched draw commands
    (internal issue 2365).
  * Add valid usage statement for flink:vkGetQueryPoolResults requiring
    pname:stride to be large enough for a single performance query result
    (internal issue 2380).
  * Move input attachment imageLayout to valid usage reference section,
    and refer to the <<attachment-type-imagelayout>> section
    to reduce complexity of valid usage statement
    (internal merge request 4117).
  * Update issues list for `<<VK_QCOM_render_pass_transform>>`
    (internal merge request 4175).
  * Add valid usage statement for
    slink:VkPipelineColorBlendStateCreateInfo::pname:attachmentCount (public
    Vulkan-ValidationLayers issue 2197).

New Extensions:

  * `<<VK_KHR_fragment_shading_rate>>`
  * `<<VK_KHR_shader_terminate_invocation>>`

-----------------------------------------------------

Change log for October 12, 2020 Vulkan 1.2.157 spec update:

  * Update release number to 157 for this update.

GitHub Issues:

  * Fix `<<VK_KHR_shader_draw_parameters>>` missing as a feature alias
    (based on public pull request 1310).
  * Remove unnecessary sentence about device extensions implemented by
    layers in the flink:vkCreateDevice description (based on public pull
    request 1350).
  * Fix parenthesis in equation in the
    <<textures-texel-anisotropic-filtering, Texel Anisotropic Filtering>>
    section (public merge request 1365).
  * Add missing types to `vk.xml` for `<<VK_EXT_device_memory_report>>`
    (public issue 1374).
  * Add slink:VkBufferImageCopy valid usage statement for
    ename:VK_IMAGE_ASPECT_DEPTH_BIT and ename:VK_IMAGE_ASPECT_STENCIL_BIT
    pname:aspectMask values (public Vulkan-ValidationLayers issue 2113).

Internal Issues:

  * Remove unused etext:VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT
    token
    (internal issue 2275).
  * Clarify the specific stage requirement for synchronization
    between flink:vkCmdResetEvent and flink:vkCmdWaitEvents
    (internal merge request 4152).

-----------------------------------------------------

Change log for October 5, 2020 Vulkan 1.2.156 spec update:

  * Update release number to 156 for this update.

GitHub Issues:

  * Define memory import/export using the glossary term _payload_, rather
    than "`the same underlying memory`", for slink:VkFence,
    <<synchronization-semaphores-payloads, the semaphore payload section>>,
    and many places in the <<memory, Memory Allocation>> chapter (public
    issue 1145).

New Extensions:

  * `<<VK_EXT_device_memory_report>>`

-----------------------------------------------------

Change log for September 28, 2020 Vulkan 1.2.155 spec update:

  * Update release number to 155 for this update.

New Extensions:

  * `<<VK_EXT_shader_image_atomic_int64>>`

-----------------------------------------------------

Change log for September 7, 2020 Vulkan 1.2.153 spec update:

  * Update release number to 153 for this update.

GitHub Issues:

  * Specification default branch for updates and PRs is now `main` instead
    of `master`. `master` branch still exists, but is frozen at the 1.2.152
    level. If you are pulling content from this repository, please switch
    from `master` to `main` branch (internal issue 1351).
  * Fix slink:VkSubpassDependency2 link from slink:VkRenderPassCreateInfo2
    (public issue 1358).

Internal Issues:

  * Add developer documentation to the appendices for
    `<<VK_EXT_memory_budget>>`, `<<VK_KHR_buffer_device_address>>`,
    `<<VK_KHR_depth_stencil_resolve>>`, `<<VK_KHR_draw_indirect_count>>`,
    `<<VK_KHR_multiview>>`, `<<VK_KHR_sampler_ycbcr_conversion>>` (internal
    issue 2109).
  * Implement VUID expander treeprocessor plugin to make VUID text visible
    and searchable in generated outputs (internal issue 2253, 2258).
  * Clarify when acceleration structures can be indexed dynamically in the
    <<interfaces-resources-descset, Descriptor Set Interface>> section
    (internal issue 2316).
  * Add missing valid usage statement for flink:vkImportFenceWin32HandleKHR
    (internal merge request 4087).
  * Replace badly formatted VUID for `<<VK_AMD_display_native_hdr>>`
    (internal merge request 4096).
  * Add ray tracing acceleration structures to the lists of objects where
    appropriate in the <<fundamentals-objectmodel-lifetime, Object
    Lifetime>> section (internal merge request 4100).
  * Move GLSL and SPIR-V extension references in the extension appendices
    into the "`Interactions and External Dependencies`" sections (internal
    merge request 3969).

-----------------------------------------------------

Change log for August 26, 2020 Vulkan 1.2.152 spec update:

  * Update release number to 152 for this update.

GitHub Issues:

  * Add attachment image layout valid usage statements for
    slink:VkSubpassDescription and slink:VkSubpassDescription2 (public issue
    1316).
  * Clarify and generalize use of "`graphics commands`" in the
    <<descriptorsets>> and <<pipelines>> chapters (public issue 1322).
  * Fix description of handle returned in slink:VkDeviceQueueInfo2 (public
    pull request 1347).

Internal Issues:

  * Promote valid usage statements requiring multiple parameters of a copy
    command from the structure parameter descriptions to the command itself,
    significantly restructuring some of the common validity files (internal
    issue 2034).
  * Add details of clamping and quantization behavior for border colors that
    are outside the normal range for slink:VkSamplerCreateInfo and in the
    <<textures-operation-validation, Instruction/Sampler/Image View
    Validation>> and <<textures-texel-replacement, Texel Replacement>>
    sections (internal issue 2281).
  * Clarify in the <<spirvenv-module-validation-standalone, Standalone
    SPIR-V Validation>> section that the value of code:XfbBuffer cannot
    differ for members of the same block (internal issue 2307).
  * Add valid usage blocks to the <<interfaces>> chapter where discussing
    allowed uses of built-in SPIR-V variables (internal merge requests 3933,
    4090).
  * Refactor <<spirvenv-module-validation-standalone, Standalone SPIR-V
    Validation>> constraints to single statement phrases not using ifdef::ed
    Asciidoctor markup, and move some of them down to the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section (internal merge request 4054).
  * Fix XML attributes for some `<<VK_INTEL_performance_query>>` interfaces
    (internal merge request 4061).
  * Fix the "`Differences relative to `VK_KHR_shader_float16_int8``"
    paragraph in the <<versions-1.2, Version 1.2>> appendix (internal merge
    request 4062).
  * Fix several valid usage statements for
    flink:vkCmdBindTransformFeedbackBuffersEXT (public
    KhronosGroup/Vulkan-ValidationLayers issue 2105).
  * Clarify `shader_read_only` layout restrictions for
    slink:VkWriteDescriptorSet and elink:VkImageLayout (internal merge
    request 4060).
  * Clarify wording for required 4444 and {YCbCr} formats in the
    <<formats-mandatory-features-subbyte, Mandatory format support: sub-byte
    channels>> and <<formats-requiring-sampler-ycbcr-conversion, Formats
    requiring sampler {YCbCr} conversion for ename:VK_IMAGE_ASPECT_COLOR_BIT
    image views>> tables (internal merge request 4066).
  * Move a feature valid usage statement from flink:vkCmdDrawIndexedIndirect
    to its proper home in flink:vkCmdDrawIndexedIndirectCount, matching what
    the validation layer already does (internal merge request 4070).
  * Split valid usage statement for slink:VkWriteDescriptorSet into one
    statement for each descriptor type for image layout requirements
    (internal merge request 4071).
  * Add the a <<valid-imageview-imageusage>> definition to capture which
    elink:VkImageUsageFlagBits must be set when creating a
    sname:VkImageView, and use that definition to simplify
    slink:VkImageViewCreateInfo valid usage statements (internal merge
    request 4073).
  * Remove redundant valid usage statement 03269 for slink:VkPresentInfoKHR
    (internal merge request 4084).
  * Move valid usage statement from slink:VkProtectedSubmitInfo to
    slink:VkSubmitInfo (internal merge request 4085).
  * Update reference to pname:framebufferIntegerColorSampleCounts from the
    description of the <<limits-framebufferColorSampleCounts>> feature if
    Vulkan 1.2 is supported (internal merge request 4088).

-----------------------------------------------------

Change log for August 17, 2020 Vulkan 1.2.151 spec update:

  * Update release number to 151 for this update.

GitHub Issues:

  * Clarify that the <<memory-protected-memory,Protected Memory>> is not
    cross-physical device (public issue 1335).

Internal Issues:

  * Improve the layout of the <<Standard sample locations>> table to avoid
    overflow in the HTML output (internal issue 1354).
  * Also build core-only HTML spec in internal CI, to try and catch
    extension ifdef errors (should probably also do this in Azure CI on
    GitHub) (internal issue 1770).
  * Add internal CI test for un-tagged uses of "`undefined`", to help make
    sure we've carefully considered all such uses (internal issue 2270).
  * Add style guide section "`Commands which Return Error Codes`" to give
    guidance on assigning error codes and when to use
    ename:VK_ERROR_OUT_OF_HOST_MEMORY (internal issue 2290).
  * Use the term "`reference monitor`" instead of "`mastering display`" for
    the `<<VK_EXT_hdr_metadata>>` extension (internal issue 2291).
  * Explicitly state that SPIR-V modules must be valid after specialization
    in slink:VkPipelineShaderStageCreateInfo and the
    <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    section (internal issue 2302).
  * Add slink:VkShaderModuleCreateInfo valid usage statements to match the
    SPIR-V capabilities (internal merge request 4047).
  * Add missing features to the <<spirvenv-module-validation-runtime,
    Runtime SPIR-V Validation>> section (internal merge request 4048).
  * Update slink:VkPhysicalDeviceVulkan11Properties to follow the same
    renaming of "`subgroups`" to "`groups`" previously done for
    slink:VkPhysicalDeviceSubgroupProperties (internal merge request 4050).

-----------------------------------------------------

Change log for August 10, 2020 Vulkan 1.2.150 spec update:

  * Update release number to 150 for this update.

GitHub Issues:

  * Remove ename:VK_ERROR_TOO_MANY_OBJECTS as a required error code for
    flink:vkAllocateMemory and and flink:vkCreateSampler, and note that
    while it may still occur as a historical artifact, exceeding
    implementation limits will result in undefined behavior (public issue
    1295).
  * Allow duplicate slink:VkDebugUtilsMessengerCreateInfoEXT structs in
    pname:pNext chain (public issue 1329)
  * Fix typo in slink:VkSubmitInfo valid usage statement 04120 (public merge
    request 1336).
  * Remove `KHR` suffix from some names promoted to core, in the
    <<renderpass, Render Pass>> chapter (public merge request 1341).

Internal Issues:

  * Add ename:VK_ERROR_OUT_OF_HOST_MEMORY to `vk.xml` as a possible error
    code for some additional commands returning elink:VkResult, and add a
    note to the description of elink:VkResult giving some guidance on which
    commands may and may not return that error code (internal issue 2063).
  * Make a handful of terminology changes which move this repository closer
    to the conventions of the AOSP
    https://source.android.com/setup/contribute/respectful-code[Coding with
    Respect] document (internal issue 2282).
  * Update `<<VK_MVK_ios_surface>>` and `<<VK_MVK_macos_surface>>`
    documentation and mark them as deprecated and replaced by
    `<<VK_EXT_metal_surface>>` (internal merge request 4024).
  * Add a section to the style guide on markup for the copyright and license
    block on files in the repository (internal merge request 4036).
  * Add ename:VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT to
    `<<VK_EXT_validation_features>>` to enable synchronization validation
    (internal merge request 4037).

-----------------------------------------------------

Change log for August 3, 2020 Vulkan 1.2.149 spec update:

  * Update release number to 149 for this update.

GitHub Issues:

  * Fix valid usage statements to clarify interactions between
    `<<VK_EXT_extended_dynamic_state>>` and the old viewport related
    extensions `<<VK_NV_clip_space_w_scaling>>`,
    `<<VK_NV_shading_rate_image>>` (for the palettes),
    `<<VK_NV_viewport_swizzle>>`, and `<<VK_NV_scissor_exclusive>>` (public
    issue 1296).

Internal Issues:

  * Clarify wording around non-uniform and non-constant descriptor access in
    <<interfaces-resources-descset, Descriptor Set Interface>> (internal
    issue 2163).
  * Add a missing code:StorageBuffer reference in the <<interface-resources,
    Shader Resource Interface>> section (internal issue 2191).
  * Refactor common valid usage statements for flink:vkBindBufferMemory,
    slink:VkBindBufferMemoryInfo, flink:vkBindImageMemory, and
    slink:VkBindImageMemoryInfo (internal issue 2260).
  * Copy over import/export behavior for sync file descriptor value `-1`
    from slink:VkImportFenceFdInfoKHR to slink:VkImportSemaphoreFdInfoKHR
    (internal issue 2274).
  * State that a deriviative group is a quad scope instance in the
    <<shaders-derivative-operations, Derivative Operations>> section
    (internal merge request 4025)

New Extensions:

  * `<<VK_EXT_4444_formats>>`

-----------------------------------------------------

Change log for July 19, 2020 Vulkan 1.2.148 spec update:

  * Update release number to 148 for this update.

GitHub Issues:

  * Move description of slink:VkPhysicalDevicePerformanceQueryFeaturesKHR to
    the <<features>> chapter (public merge request 1312).
  * Fix a few broken internal and external links, and add stub description
    of empty elink:VkPipelineCompilerControlFlagsAMD type (public merge
    request 1313).

Internal Issues:

  * Fix a few new places where "`undefined`" was used imprecisely, by
    clarifying the difference between undefined results and undefined
    behavior (internal issue 543).
  * Add valid usage statement to common indirect draw valid usage statements
    requiring that the pname:countBufferOffset to the count being used lie
    within the pname:countBuffer (internal issue 1309).
  * Add <<interfaces-raypipeline, Ray Tracing Pipeline Interface>> section
    (internal issues 2094, 2237).
  * Add valid usage statement to flink:vkCmdBeginTransformFeedbackEXT to
    require that the last vertex processing stage of the bound graphics
    pipeline be declared with the code:Xfb execution mode (internal issue
    2124).
  * Do not allow flink:vkWaitForFences or flink:vkWaitSemaphores to return
    timeouts before the period has expired, even though this is valid in
    some other synchronisation APIs (internal issue 2146).
  * Add elink:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT as an alias
    of elink:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT for clarity
    when interacting with D3D11 fences (internal issue 2175).
  * Ignore slink:VkMemoryAllocateInfo::pname:allocationSize when importing
    D3D resources (internal issue 2176).
  * Clarify the definition of flink:vkCmdBindVertexBuffers2EXT::pname:pSizes
    (internal issue 2262).
  * Fix markup error in slink:VkDescriptorSetLayoutBindingFlagsCreateInfo
    (internal merge request 3998).
  * Remove un-needed dependency of `<<VK_EXT_filter_cubic>>` on
    `<<VK_IMG_filter_cubic>>` (internal merge request 4000).
  * Minor textual clarifications in ray tracing extensions (internal merge
    request 4017).
  * Modify the validity generator, so that when generating valid usage for
    array lengths with a chain of parameters (e.g. pname:pFoo->bar),
    non-zero values are not required if any parameter in the chain is
    optional, and consider the last parameter only when deciding the type of
    the parameter (internal merge request 4021).
  * Fix a typo in the `<<VK_EXT_fragment_density_map2>>` extension appendix
    markup that caused refpage build warnings, and modify CI and
    `BUILD.adoc` to use `makeSpec` instead of the old `makeAllExts` script
    (internal merge request 4023).

New Extensions:

  * `<<VK_EXT_image_robustness>>`
  * `<<VK_EXT_shader_atomic_float>>`

-----------------------------------------------------

Change log for July 13, 2020 Vulkan 1.2.147 spec update:

  * Update release number to 147 for this update.

GitHub Issues:

  * Allow physical-device-level structures in pname:pNext chains (public
    merge request 1303).
  * Remove elink:VkRenderPassCreateFlags from dependencies of
    `<<VK_QCOM_render_pass_transform>>` (public merge request 1311)

Internal Issues:

  * Require that variables with code:HitAttributeKHR storage class must:
    <<spirvenv-module-validation-standalone, only be written in intersection
    shaders>> (internal issue 2103).
  * Specify that acceleration structure scratch buffer accesses from
    acceleration structure build should be synchronized with the
    ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline
    stage and an access mask of
    ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR or
    ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR (internal issue
    2173).
  * Improve description of 3D blitting in flink:vkCmdBlitImage (internal
    issue 2212).
  * Split <<fragops-coverage-reduction, Coverage Reduction>> section into
    multiple steps when multi-pixel fragments are involved: first per-pixel
    coverage is separated out, then per-sample coverage is generated for
    each color sample from per-pixel coverage. Additionally, the definition
    of "`color sample mask`" and discussions of it have been removed in
    favor of the per-color-sample coverage. (internal merge request 3951).
  * Modify slink:VkSamplerYcbcrConversionCreateInfo valid usage statements,
    as well as the <<textures-chroma-reconstruction, Chroma Reconstruction>>
    section, to make it clear the values of pname:xChromaOffset and
    pname:yChromaOffset are only validated when chroma channels are
    downsampled (internal merge request 3959).
  * Allow flink:vkGetBufferMemoryRequrements and
    flink:vkGetBufferMemoryRequrements2 to be called for an Android Hardware
    Buffer backed slink:VkBuffer, before it has been bound to memory
    (internal merge request 3982).
  * Remove *Draft* status from `<<VK_EXT_private_data>>` (internal merge
    request 3982).
  * Move valid usage statement from slink:VkProtectedSubmitInfo to
    slink:VkSubmitInfo (internal merge request 3987).
  * Add valid usage statements for protected buffers to
    slink:VkBindBufferMemoryInfo and slink:VkBindImageMemoryInfo
    (internal merge request 3988).
  * Add valid usage statement to slink:VkImageCreateInfo requiring that
    images with linear tiling cannot have sparse residency (internal merge
    request 3988).
  * Clarify that the ptext:maxPerStageDesciptorUpdateAfterBind*
    <<limits-required, Required Limits>> must be at least the corresponding
    non- ptext:UpdateAfterBind limits (internal merge request 3992).

-----------------------------------------------------

Change log for July 3, 2020 Vulkan 1.2.146 spec update:

  * Update release number to 146 for this update.

GitHub Issues:

  * Fix valid usage generation script for optional bitmasks in a
    non-optional array (public pull request 1228).
  * Add lunr to `package.json` and update the locally cached copy (public
    pull request 1238).
  * Require that newly released extensions have etext:*_SPEC_VERSION `1`
    (public issue 1263).
  * Add to the NOTE in slink:VkPhysicalDeviceIDProperties, advising
    implementations on returning unique pname:deviceUUID values and avoiding
    hardwired values, especially 0 (public issue 1273).
  * Add noscript fallback for HTML output (public pull request 1289).
  * Fix duplicated VUIDs in flink:vkCmdExecuteGeneratedCommandsNV (public
    pull request 1304).
  * Fix link markup in <<ray-traversal, Ray Traversal>> chapter, nested link
    markup, and linear equation markup in
    <<textures-unnormalized-to-integer>> (public pull requests 1305, 1306,
    1307).

Internal Issues:

  * Add comments to extending enums in the generated API interfaces showing
    which core version and/or extensions provide the enum, matching recent
    changes to show this information for commands and structures (internal
    issue 1431, public issue 444).
  * Only allow code:Invocation memory scope in the
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    section when memory semantics is *None* (internal issue 1782).
  * Make reflow script properly handle literal block delimiters and lines
    containing only whitespace (internal issues 2039, 2042).
  * Clarify definition of <<limits-maxFragmentCombinedOutputResources,
    pname:maxFragmentCombinedOutputResources>> (internal issue 2236).
  * Add missing `errorcodes=` XML attributes for some
    `<<VK_EXT_display_control>>` commands.
  * Clarify <<features-extentperimagetype, allowed extent values based on
    image type>> and the related <<limits-maxImageDimension1D>>,
    <<limits-maxImageDimension2D>>, <<limits-maxImageDimension3D>>,
    <<limits-maxImageDimensionCube>> limits (internal merge request 3922).
  * Remove redundant valid usage statement
    VUID-VkFramebufferCreateInfo-flags-03188 (internal merge request 3934).
  * Update style guide to recommend new extension spec language be contained
    in existing Asciidoctor files, unless it is of enough scope to create a
    new chapter (internal merge request 3955).

New Extensions:

  * `<<VK_EXT_directfb_surface>>` (public pull requests 1292, 1294).
  * `<<VK_EXT_fragment_density_map2>>` (internal merge request 3914).

-----------------------------------------------------

Change log for June 20, 2020 Vulkan 1.2.145 spec update:

  * Update release number to 145 for this update.

GitHub Issues:

  * Fix `<<VK_EXT_conservative_rasterization>>` interactions with external
    SPIR-V and GLSL functionality in the extension appendix (public issue
    1288).

Internal Issues:

  * Break SPIR-V validation into two sections,
    <<spirvenv-module-validation-standalone, Standalone SPIR-V Validation>>
    and <<spirvenv-module-validation-runtime, Runtime SPIR-V Validation>>
    (internal issue 1598).
  * Add VkFormat enums for ASTC 3D formats to `vk.xml`. These values are
    slotted into the reserved, and still disabled extension 289. They will
    not appear in the published `vulkan_core.h` header and there is no
    published extension utilizing them, but this allows external projects
    such as KTX2 to use these values as part of their internal cross-API
    formats by generating a header including this disabled extension
    (internal merge requests 1662, 2216).
  * Clarify that shader binding table accesses from ray tracing
    pipelines should be synchronized with the
    ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR pipeline stage and
    the access mask of ename:VK_ACCESS_SHADER_READ_BIT (internal issue
    1749).
  * Validate that 3D image views are not used as attachments in
    slink:VkFramebufferCreateInfo and slink:VkRenderPassAttachmentBeginInfo
    (internal issue 2142).
  * Increase the number of conditions recognized as build errors by the
    valid usage extraction plugin (internal issue 2215).
  * Relax slink:VkImportAndroidHardwareBufferInfoANDROID valid usage
    statement 01881 to support external formats (internal issue 2220).
  * Clearly define what "`optional capabilities`" means in the
    <<spirvenv-capabilities, Capabilities>> section, and specify that if
    *any* of the core versions and/or extensions required for a capability
    is enabled, then it is valid to use that capability (internal merge
    request 3827).
  * Add ename:VK_FORMAT_B5G5R5_UNORM_PACK16 and
    ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16 to
    `<<VK_EXT_custom_border_color>>` as exceptions when
    <<features-customBorderColorWithoutFormat,
    pname:customBorderColorWithoutFormat>> is enabled (internal merge
    request 3833).
  * Add new <<spirvenv-format-type-matching, Image Format and Type
    Matching>> section and refer to it from elsewhere in the spec,
    clarifying rules regarding types for image operations (internal merge
    request 3916).
  * Fix typo sname:VkImageFormatProperties -> slink:VkFormatProperties
    (internal merge request 3921).
  * Move <<sparsememory-examples, sparse image examples>> to the Vulkan
    Guide (internal merge request 3930).
  * Fix typo in slink:VkAccelerationStructureBuildOffsetInfoKHR valid usage
    statement 03553 (internal merge request 3938).
  * Support <remove> tags for extending enumerants in XML (internal merge
    request 3942).

New Extensions:

  * `<<VK_EXT_extended_dynamic_state>>`

-----------------------------------------------------

Change log for June 8, 2020 Vulkan 1.2.144 spec update:

  * Update release number to 144 for this update.

Internal Issues:

  * Require `volatile` semantics for loading <<builtin-volatile-semantics,
    certain variables used in ray pipeline stages>> in the
    <<spirvenv-module-validation, Validation Rules within a Module>> and
    also the <<ray-tracing-shader-call, Shader Call Instructions>> section
    (internal issue 1924).
  * Created new <<potential-format-features, Potential Format Features>>
    section and corresponding glossary term, use the new term where
    appropriate, and add some related valid usage statements to
    flink:vkCmdBeginRenderPass, flink:vkCmdBeginRenderPass2,
    slink:VkSubpassDescription, and slink:VkSubpassDescription2 (internal
    issue 2031).
  * Add interaction with `<<VK_KHR_ray_tracing>>` and corresponding `NV`
    extension to flink:vkUpdateDescriptorSetWithTemplate (internal issue
    2193).
  * Resolve collisions in common VUID names using `{stageMaskName}`
    qualifiers as part of the name and make fixes to
    `config/vu-to-json/extension.rb` to match (internal issue 2215).
  * Replace `shutil.move` operations with `copy` / `remove` in the base
    `generator.py` code, working around a problem with bind mounts while
    using the Khronos docker build image with `podman` instead of `docker`
    (internal merge request 3872).
  * Add a new <<spirvenv-extensions, SPIR-V Extensions>> subsection
    containing a table showing the corresponding Vulkan extension or core
    API required to support each of the SPIR-V extensions, replacing a
    harder-to-read list of extensions (internal merge request 3876).
  * Remove two redundant valid usage statements from flik:vkCmdResolveImage
    (internal merge request 3878).
  * Make repository REUSE-compliant, and run the `reuse` license checker as
    part of internal CI. While most files now have SPDX license identifier
    tags, some licenses are recorded in `.reuse/dep5` instead. Note that
    this does not change licenses in the repository (aside from adding some
    to files missing them), just ensures that every file *has* an explicit
    license (internal merge request 3904).
  * Clarify that code:ImageMSArray is supported as part of the
    <<features-shaderStorageImageMultisample>> feature (internal merge
    request 3905).
  * Reorganize some valid usage statements for flink:vkCmdBlitImage,
    flink:vkCmdCopyBuffer, flink:vkCmdCopyBufferToImage,
    flink:vkCmdCopyImage, flink:vkCmdCopyImageToBuffer, and
    flink:vkCmdResolveImage as common valid usage statements, for
    future-proofing (internal merge requests 3906, 3907, 3908, 3909, 3910).
  * Add two valid usage statements to flink:vkAllocateMemory and
    flink:vkCreateSampler for allocation limits of slink:VkDeviceMemory and
    elink:VkSamplers, respectively (internal merge request 3923).

-----------------------------------------------------

Change log for June 8, 2020 Vulkan 1.2.143 spec update:

  * Update release number to 143 for this update.

GitHub Issues:

  * Move `translate_math.js` to the `scripts/` directory (public pull
    request 1286).
  * Minor cleanup of math markup (public pull request 1287).

Internal Issues:

  * Reorganize some valid usage statements for slink:VkBufferMemoryBarrier,
    and for commands with elink:VkPipelineStageFlags parameters, as common
    valid usage statements, for future-proofing (internal merge requests
    3863, 3867).
  * Misc. licensing updates (internal issue 1017):
  ** Replace the "`Exceptions`" clause on `vk.xml` with a dual Apache-2.0 OR
     MIT license, with agreement of downstream developers known to be
     affected by it. This enables use of `vk.xml` in GPLed projects under a
     more widely used licensing scheme.
  ** Use `SPDX-License-Identifier` tags in place of longer license text.
     This does not change the license terms on files other than `vk.xml`,
     but makes license statements in most files more compact.
  ** Reorganize repository documentation (README.adoc, COPYING.adoc,
     LICENSE.adoc, CONTRIBUTING.adoc, CODE_OF_CONDUCT.adoc, and BUILD.adoc)
     with a more widely used split of information; make all of these files
     Asciidoctor instead of Markdown format for consistency with the rest of
     the repository; describe use of SPDX identifiers; and point to full
     license text of the various OSS licenses used in the repository.
  * Add new <<resources-image-views-identity-mappings, text describing the
    identity swizzle>> incorporating the existing "`Component Mappings
    Equivalent To ename:VK_COMPONENT_SWIZZLE_IDENTITY`" table, and refer to
    this text in place of explicit references to
    ename:VK_COMPONENT_SWIZZLE_IDENTITY in many places (internal merge
    request 3399).
  * Require code:storageBuffer16BitAccess capability if
    `<<VK_KHR_16bit_storage>>` is enabled (internal merge request 3709).
  * Added XML schema and generator script extensions to support 64-bit flags
    and corresponding bitmasks (internal merge request 3718).
  * Correct <<interfaces-resources-standard-layout, Standard Buffer Layout>>
    alignment rules (internal merge request 3750).
  * Relax non-strict line constraints in the <<primsrast-lines-basic>> and
    <<primsrast-lines-bresenham>> sections (internal merge request 3792).
  * Add missing `structextends` attribute to the
    slink:VkPhysicalDevicePrivateDataFeaturesEXT definition in `vk.xml`
    (internal merge request 3873).
  * Move slink:VkImageFormatListCreateInfo valid usage statements to
    flink:vkCreateImageView (internal merge request 3879).
  * Update valid usage statements for slink:VkImageViewASTCDecodeModeEXT to
    allow ASTC HDR formats (internal merge request 3881).
  * Add missing extension dependency to
    `<<VK_KHR_pipeline_executable_properties>>` definition in `vk.xml`
    (internal merge request 3882).
  * Require the <<features-customBorderColors, pname:customBorderColors>>
    feature be enabled when using etext:VK_BORDER_COLOR_* in
    slink:VkSamplerCreateInfo (internal merge request 3884).

-----------------------------------------------------

Change log for June 1, 2020 Vulkan 1.2.142 spec update:

  * Update release number to 142 for this update.

GitHub Issues:

  * Add boilerplate descriptions of reserved bitmask types (public pull
    request 1265).
  * Move dynamic state valid usage statements from
    slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV and
    VkPipelineViewportShadingRateImageStateCreateInfoNV to
    slink:VkGraphicsPipelineCreateInfo, where they are testable, and make
    corresponding tweaks in `vk.xml` (public pull request 1268).
  * Add missing flink:vkDestroyPrivateDataSlotEXT explicit valid usage
    statement (public pull request 1269).
  * Cast arguments of dlink:VK_MAKE_VERSION macro to code:uint32_t to avoid
    compiler warnings (public pull request 1279).

Internal Issues:

  * Update <<fundamentals-validusage-pNext, description of pname:pNext
    chains>> to allow structures in the chain to be defined by either core
    versions or extensions. Add the new term "`extending structure`" to the
    glossary to describe such structures, and use it in place of "`extension
    structure`". Update the style guide accordingly (internal issue 1083).
  * Add a comment to the beginning of generated API includes showing which
    combinations of API core versions and extensions provide that API, based
    on the explicit requirements in the API XML. This does not yet document
    enumerants introduced by extending a base enum type (internal issue
    1431).
  * Relax the restriction that slink:VkBufferImageCopy::pname:bufferOffset
    must be a multiple of 4 for flink:vkCmdCopyBufferToImage and
    flink:vkCmdCopyImageToBuffer when run on graphics or compute queues, but
    not on transfer queues (internal issue 1701).
  * Document the types of "`special use`" extensions in the new
    <<extendingvulkan-compatibility-specialuse, Special Use Extensions>>
    section, summarize special uses in the generated metadata for extension
    appendices, and link back to the new section from each special use
    extension (internal issue 1938).
  * Clarify behavior of flink:vkGetDeferredOperationMaxConcurrencyKHR,
    allowing it to return zero for completed operations (internal issue
    2036).
  * Allow flink:vkGetInstanceProcAddr to resolve itself with a `NULL`
    pname:instance (internal issue 2057).
  * Modify the valid usage statement ID assignment script to track a range
    of unused IDs for each extension branch under development, instead of
    only allowing VUID assignment in `master` and `devel` branches (internal
    issue 2100).
  * Add `selector` and `selection` attributes for unions in XML, to enable
    automatic generation of validation code (internal issue 2140).
  * Fix validity generator for stext:Vk*Flags types that are aliases,
    correcting generation of implicit valid usage for
    slink:VkAccelerationStructureInfoNV::pname:flags. Remove
    `noautovalidity` attribute for this member, as well as the previously
    written explicit valid usage (internal issue 2140).
  * Fix description of slink:VkTextureLODGatherFormatPropertiesAMD (internal
    issue 2189).
  * Remove redundant text about variables being explicitly laid out in the
    <<interfaces-resources-layout, Offset and Stride Assignment>> section
    (internal merge request 3691).
  * Fix conflicting slink:VkSamplerYcbcrConversionCreateInfo valid usage
    statements (internal merge request 3716).
  * Fix use of code:AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT to
    code:AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER in valid usage statement
    02386 for slink:VkMemoryAllocateInfo (internal merge request 3808).
  * Add missing `externsync` XML attributes for ftext:vkCmd* commands
    (internal merge request 3825).
  * Add missing `extends` attribute to
    slink:VkDevicePrivateDataCreateInfoEXT XML (internal merge request
    3834).
  * Add code:RayGeometryIndexKHR to the `<<VK_KHR_ray_tracing>>` list of
    built-in variables (internal merge request 3853).
  * Restrict slink:VkBufferViewCreateInfo with ename:VK_WHOLE_SIZE, and
    round down results of division in calculating the test in the
    corresponding valid usage statements (internal merge request 3858).
  * Miscellaneous cleanup and reorganization of synchronization language in
    multiple places, and add the
    <<synchronization-image-barrier-layout-transition-order>> section
    (internal merge request 3861).
  * Redefine ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT and
    ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT as pseudo-stages in multiple
    places (internal merge request 3862).
  * Reorganize some valid usage statements, especially but not limited to
    stage mask parameters for slink:VkImageMemoryBarrier,
    slink:VkPipelineStageFlags, flink:vkCmdPipelineBarrier,
    flink:vkCmdResetEvent, flink:vkCmdSetEvent, flink:vkCmdWaitEvents,
    flink:vkCmdWriteBufferMarkerAMD, and flink:vkCmdWriteTimestamp as common
    valid usage statements, for future-proofing (internal merge requests
    3864, 3865, 3866, 3867, 3868).

-----------------------------------------------------

Change log for May 15, 2020 Vulkan 1.2.141 spec update:

  * Update release number to 141 for this update.
  * *Note*: Using the default build options, specification outputs will now
    be created in `gen/out/` instead of `out/`, and header files will be
    created in `gen/include/vulkan` instead of `include/vulkan`. This can be
    overridden using the `-genpath` option to the frontend scripts like
    `makeAllExts` and `makeSpec`, or by specifying `GENERATED=*path*` on the
    make command line when invoking it directly.

GitHub Issues:

  * Assign new elink:VkDriverId and elink:VkVendorId enums for Mesa (public
    issue 1256).

Internal Issues:

  * Fix a typo in the <<fragops-stencil, Stencil Test>> section, removing a
    sentence fragment accidentally left over from an earlier merge conflict
    resolution (internal issue 2158).
  * Typo fixes for flink:vkGetRayTracingShaderGroupHandlesKHR and
    flink:vkGetRayTracingCaptureReplayShaderGroupHandlesKHR valid usage
    statements (internal merge request 3831).
  * Add a `requiredBy` dictionary to the generated `vkapi.py` showing which
    core versions or extensions require each API (internal merge request
    3832).
  * Allow specifying multiple API names for and tags in registry processing
    scripts. Update the registry schema documentation accordingly, and
    remove the redundant `xml_supported_name_of_api` method from the
    VulkanConventions object (internal merge request 3836).
  * Consolidate generated intermediate files and output documents into
    $(GENERATED) directory, add -genpath option to scripts requiring them,
    and modify Makefile accordingly. Add a new `makeSpec` script, which
    combines and extends the functionality of the `makeExt`, `makeKHR`, and
    `makeAllExts` scripts (internal merge requests 3837, 3838, 3840, 3841).
  * Add "`runtime`" to style guide and use that spelling consistently
    (internal merge request 3843).

-----------------------------------------------------

Change log for May 3, 2020 Vulkan 1.2.140 spec update:

  * Update release number to 140 for this update.

GitHub Issues:

  * Add `vk.xml` `noautovalidity` attribute to
    flink:vkCmdBindTransformFeedbackBuffersEXT::pname:pSizes to cause change
    in the generation of implicit valid usage statement for
    pname:bindingCount (public issue 1227).
  * Remove the special tokens (not part of the Vulkan API) suffixed with
    etext:*_BEGIN_RANGE etext:*_END_RANGE, and etext:*_RANGE_SIZE from the
    generated C headers, after consultation with downstream components and
    ISVs and advanced warning to the developer community (public issue 1230,
    internal issue 872).

    *Note* if you absolutely require these tokens for some reason, you can
    still build a version of the header which restores them. Edit
    `scripts/genvk.py` to add the parameter `genEnumBeginEndRange = True` to
    the `CGeneratorOptions` objects for the header file targets you want to
    restore. See the version of `genvk.py` in the 1.2.139 spec update for an
    example.
  * Add valid usage statement to slink:VkApplicationInfo requiring that
    pname:apiVersion be greater than or equal to dlink:VK_API_VERSION_1_0
    (public pull request 1252).
  * Add \<implicitexternsync> tags to `vk.xml` for flink:vkDestroyDevice
    slink:VkQueue objects received from pname:device (public pull request
    1255).
  * Fix typo in slink:VkBufferMemoryBarrier language (public pull request
    1257).

Internal Issues:

  * Automatically generate interface lists for extension appendices from
    `vk.xml` using a new interface generator script, and update the style
    guide's description of these appendices accordingly (internal issue
    977, internal merge request 3819).
  * Add transitive language to the <<formats-compatible-planes, Compatible
    formats of planes of multi-planar formats>> section to pull in format
    compatibility classes as well (internal issue 1615).
  * Add valid usage statements to ftext:vkCmdBuildAccelerationStructure*KHR,
    flink:vkCmdCopyAccelerationStructureToMemoryKHR, and
    flink:vkCmdCopyMemoryToAccelerationStructureKHR for structure builds
    bound to device memory (internal issue 2033).
  * Don't generate etext:*_MAX_ENUM values in documentation generators,
    since they're not part of the API, and only meaningful on compiled
    headers (internal issue 2056).
  * Remove special lifetime rules for pipelines in the
    <<fundamentals-objectmodel-lifetime-cmdbuffers>> section (internal issue
    2068).
  * Improve valid usage statements for ftext:vkCmdTraceRays*, share more
    common VUs between ftext:vkTraceRays*, and add ftext:vkCmdTracerays* VUs
    for bound buffers. Improve documentation for the
    pname:raygenShaderBindingOffset parameters and fork `NV` and `KHR` valid
    usage statements, since the shader binding table is described
    differently (internal issues 2075, 2136).
  * Clarify lifetime of acceleration structure build inputs for
    flink:vkCreateAccelerationStructureKHR (internal issue 2077).
  * Add a Note to the <<framebuffer-blending, Blending>> section to stop
    claiming that blending is ignored for all integer formats (internal
    issue 2098).
  * Mark handle parameters of some ftext:vkDestroy* commands as `optional`
    and `externsync="true"` in `vk.xml` (internal issue 2129).
  * Add missing `:refpage:` attributes for ray tracing common valid usage
    statements (internal issue 2141).
  * Redefine fragment to include the possibility of it covering multiple
    pixels. This affects many parts of the specification including the
    <<pipelines, Pipelines>>, <<primsrast, Rasterization>>, and <<fragops,
    Fragment Operations>> chapters, the `<<VK_EXT_post_depth_coverage>>`
    appendix, the `Coverage*` and `Sample Index` glossary entries, the
    code:SampleId and code:SampleMask definitions in the
    <<interfaces-builtin-variables, Built-In Variables>> section, and the
    <<shaders-fragment-execution, Fragment Shader Execution>>,
    <<shaders-fragment-earlytest, Early Fragment Tests>>, and
    <<textures-texel-coordinate-systems, Texel Coordinate Systems>> sections
    (internal merge request 3568).
  * Refactor `scripts/genvk.py` script to specify generator and generator
    options to the `Registry` object before loading XML. This allows
    generator options to influence behavior such as reparenting enum
    elements from feature/extension elmements to the enums they are being
    added to, which is desirable for generating complete feature lists for
    an extension or core version (internal merge request 3789).
  * Raise a fatal error (instead of a warning) in `scripts/generator.py`
    when two enumerants that are not aliased have the same value, so that CI
    will fail (internal merge request 3807).
  * Remove accidentally duplicated slink:VkSubpassDependency2 valid usage
    statement 03093 (internal merge request 3826).

New Extensions:

  * `<<VK_EXT_private_data>>`
  * `<<VK_EXT_custom_border_color>>`

-----------------------------------------------------

Change log for April 26, 2020 Vulkan 1.2.139 spec update:

  * Update release number to 139 for this update.

GitHub Issues:

  * Configure GitHub CI with Azure pipelines and the Khronos Docker build
    image (public pull request 1141).
  * Move NOTE in flink:vkEnumerateInstanceVersion prior to valid usage
    statements (public pull request 1237).
  * Add `implicitexternsyncparams` to flink:vkDestroyInstance for
    slink:VkPhysicalDevice objects (public pull request 1244).
  * Note in the style guide that extension names are used as preprocessor
    symbols in all the generated Vulkan headers (public pull request 1245).
  * Move NOTE about app use of `switch` statements and Vulkan API enums from
    the style guide into the <<fundamentals-validusage-enums, Valid Usage
    for Enumerated Types>> section (public pull request 1246).
  * Modify generator script to use Unix newlines on all platforms (public
    pull request 1250).

Internal Issues:

  * Allow ename:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT error to be
    generated by flink:vkQueuePresentKHR (internal issue 1932).
  * Update references to the SPIR-V Specification to version 1.5.3 (internal
    issue 1957).
  * Add a \<comment> explaining why the bitfields defined for
    slink:VkAccelerationStructureInstanceKHR in `vk.xml` are non-normative
    (internal issue 1975).
  * Add valid usage statement for flink:vkBindImageMemory2::pname:pBindInfos
    to prevent binding disjoint memory twice (internal merge request 3696).
  * Add valid usage statements to flink:vkGetBufferMemoryRequirements,
    flink:vkGetImageMemoryRequirements, and
    slink:VkBufferMemoryRequirementsInfo2 requiring that external Android
    hardware buffers be bound to memory (internal merge request 3717).
  * Fix implicit valid usage statement generation script for handle
    parameters with `optional="false,true"` XML attributes (internal merge
    request 3753).

New Extensions:

  * `<<VK_EXT_robustness2>>`
  * `<<VK_QCOM_render_pass_shader_resolve>>`

-----------------------------------------------------

Change log for April 16, 2020 Vulkan 1.2.138 spec update:

  * Update release number to 138 for this update.

GitHub Issues:

  * Use correctly tagged normative term macros in various places (public
    pull request 1217).
  * Fix C arrow markup in parameter descriptions (public pull request 1222).

Internal Issues:

  * Add language to the <<features-requirements, Feature Requirements>>
    section, the <<versions, Core Revisions>> appendix, and the applicable
    extensions to require major feature bits if the corresponding extension
    is supported (internal issue 1961).
  * Allow slink:VkAccelerationStructureCreateInfoKHR::pname:maxGeometryCount
    = 0, and clarify that exactly one of pname:compactedSize and
    pname:maxGeometryCount must: be zero. (internal issue 2079).
  * Add `allowduplicate` attribute to XML `type` tags to enable future
    structures which can allow multiple copies of a structure in their
    pname:pNext chain (internal issue 2090).
  * Add the glossary term "`format features`", and make minor clarifications
    to uses of this term in several places in the <<resources, Resource
    Creation>> chapter and the
    <<resources-sampler-ycbcr-conversion-format-features, Sampler Ycbcr
    Conversion Format Features>> section (internal merge request 3727).
  * Add a constraint to the <<memory-external-android-hardware-buffer,
    Android Hardware Buffer>> section requiring that bound slink:VkImage or
    slink:VkBuffer objects be created with the
    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
    flag set, and corresponding valid usage statements to
    flink:vkBindBufferMemory, slink:VkBindBufferMemoryInfo,
    flink:vkBindImageMemory, and slink:VkBindImageMemoryInfo (internal merge
    request 3732).
  * Fix pname:memoryTypes ordering description for device coherent memory
    (ename:VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD) in the
    <<memory-device-bitmask-list>> section (internal merge request 3738).
  * Replace code:AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT with
    code:AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER in the
    <<memory-external-android-hardware-buffer-usage, AHardwareBuffer Usage
    Equivalence>> table, and add
    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT flag for this case
    (internal merge request 3741).
  * Add more references to `NV` and `KHR` ray tracing pipelines in
    discussions of creating pipelines, or generalize text so they need not
    all be mentioned by name (internal merge request 3743).
  * Allow *ShaderCallKHR* memory scope in ray tracing shaders, in the
    <<spirvenv-module-validation, Validation Rules within a Module>>
    appendix (internal merge request 3744).
  * Use Khronos Dockerhub image for spec builds in internal CI (internal
    merge request 3748).
  * Add the `<<VK_KHR_dedicated_allocation>>` extension as a dependency of
    `<<VK_ANDROID_external_memory_android_hardware_buffer>>` (internal merge
    request 3751).

-----------------------------------------------------

Change log for April 06, 2020 Vulkan 1.2.137 spec update:

  * Update release number to 137 for this update.

GitHub Issues:

  * Incorporate several changes to the specification build process and HTML
    load-time scripts which pre-render KaTeX math, pre-fetch fonts, and
    perform several other optimizations which can significantly improve load
    time for the single-page HTML specification. In our internal evaluation
    these changes appear to primarily help when using Chrome or Chromium,
    with smaller improvements for Firefox and Safari. Speedups seem more
    significant on Linux, Windows, and Android platforms, while MacOS
    browsers may benefit less (public pull requests 702, 704, and 708).
  * Clarify that code:OpVariable is decorated with code:Location, not
    code:OpTypeStruct in the <<interfaces-iointerfaces-locations, Location
    Assignment>> section (public issue 1203).
  * Add a NOTE about the WSI origin location in the description of
    flink:vkQueuePresentKHR (public pull request 1208).
  * Add the `null-terminated` attribute to
    slink:VkPerformanceValueDataINTEL::pname:valueString in `vk.xml` (public
    pull request 1209).
  * Mark slink:VkPhysicalDeviceVulkan11Properties and
    slink:VkPhysicalDeviceVulkan12Properties structures as `returnedonly` in
    `vk.xml` (public pull request 1210).
  * Create explicit valid usage statements from text in the description of
    slink:VkValidationFeaturesEXT (public pull request 1212).
  * Update style guide to add "`user`" to the list of words *not* to use,
    instead recommending "`application`" (public pull request 1213).
  * Fix typos where `ext:` was used in the style guide instead of the new
    `apiext:` Asciidoctor macro (public pull request 1214).
  * Miscellaneous minor markup and editing fixes (public pull request 1215).
  * Remove etext:KHR from promoted ename:VK_MAX_DRIVER_NAME_SIZE in the
    description of slink:VkPhysicalDeviceDriverProperties (public pull
    request 1218).
  * Correct use of `NULL` to dlink:VK_NULL_HANDLE in the
    <<acceleration-structure-inactive-prims, Inactive Primitives and
    Instances>> section (public pull request 1219).
  * Remove trailing periods on valid usage statement text, as required by
    the style guide, and add `scripts/deperiodize_vuids.py` to do this in
    the future if needed (public pull request 1220).

Internal Issues:

  * Provide a warning in the repository `README.adoc` of pending header
    changes to remove etext:VK_*_BEGIN_RANGE, etext:VK_*_END_RANGE, and
    etext:VK_*_RANGE_SIZE tokens (internal issue 872).
  * Describe the meaning of code:Device for the `<<VK_KHR_shader_clock>>`
    extension in the <<shaders-scope-device, Device>>,
    <<shaders-scope-queue-family, Queue Family>>, and
    <<shaders-scope-command, Command>> sections of the shader
    <<shaders-scope, Scope>> section (internal issue 1955).
  * Allow slink:VkDebugUtilsObjectNameInfoEXT::pname:pObjectName to be
    either NULL or an empty string to remove a previously set name (internal
    issue #2019).
  * Add missing VK_ERROR_OUT_OF_HOST_MEMORY error code in `vk.xml` for
    flink:vkEnumerateInstanceVersion (internal issue 2029).
  * Require code:R32i or code:R32ui image format for
    code:OpImageTexelPointer atomic operations in the
    <<spirvenv-module-validation, Validation Rules within a Module>> section
    (internal issue 2049).
  * Remove the `<pattern>` element from images used in the specification, to
    avoid complaints from prawn-svg during PDF spec builds (internal issue
    2053).
  * Clarify usable sample counts for empty subpasses in the
    <<features-variableMultisampleRate>> section and the related
    flink:vkCmdBindPipeline valid usage statement, as well as in the
    <<limits-framebufferNoAttachmentsSampleCounts>>
    <<renderpass-noattachments>> sections (internal issue 2066).
  * Clarify pname:aspectMask usage in render passes in
    slink:VkGraphicsPipelineCreateInfo valid usage statement 01565 and in
    slink:VkAttachmentReference2 (internal merge request 3664).
  * Remove unused etext:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_KHR
    token from `vk.xml` and the `<<VK_KHR_ray_tracing>>` appendix
    (internal merge request 3680).
  * Require <<features-subgroup-extended-types,
    pname:shaderSubgroupExtendedTypes>> for Vulkan 1.2 (internal merge
    request 3680).
  * Generate symlinks from refpage aliases to the API they're aliasing
    (internal merge request 3694).
  * Add an alias from the old ename:VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME
    token (internal merge request 3697).
  * Add `scripts/compImages.sh` to compare all images in two git branches of
    the specification (internal merge request 3699).
  * Improve valid usage statements for `<<VK_NV_device_generated_commands>>`
    in flink:vkCmdExecuteGeneratedCommandsNV,
    slink:VkGeneratedCommandsInfoNV,
    flink:vkCmdPreprocessGeneratedCommandsNV,
    slink:VkIndirectCommandsStreamNV, slink:VkIndirectCommandsLayoutTokenNV
    and slink:VkGraphicsPipelineCreateInfo (internal merge request 3702).
  * Clarify differences between `<<VK_NV_ray_tracing>>` and
    `<<VK_KHR_ray_tracing>>` for
    slink:VkPipelineCreationFeedbackCreateInfoEXT pipeline creation,
    pname:shaderGroupHandleSize and pname:maxRecursionDepth limit
    requirement differences, and detangle `SPV_KHR/NV_ray_tracing` in the
    <<spirvenv-capabilities-table, List of SPIR-V Capabilities and enabling
    features or extensions>> (internal merge request 3710).
  * Add flink:vkGetImageViewAddressNVX and
    slink:VkImageViewAddressPropertiesNVX to `<<VK_NVX_image_view_handle>>`
    (internal merge request 3710).
  * Shorten 'make' output by reducing redundant logging output from refpage
    build targets (internal merge request 3729).
  * Replace sname: macro with slink: everywhere except language actually
    describing the structure in the macro argument (internal merge request
    3728).
  * Add flink:vkGetBufferMemoryRequirements2 and
    flink:vkGetImageMemoryRequirements2 to the commands for which the
    implementation makes guarantees about certain properties of the memory
    requirements in the <<resources-association, Resource Memory
    Association>> section, following the description of
    slink:VkMemoryRequirements (internal merge request 3730).
  * Add valid usage statements for
    `<<VK_ANDROID_external_memory_android_hardware_buffer>>` (internal merge
    request 3731).
  * Add requirements on the
    slink:VkAccelerationStructureMemoryRequirementsInfoKHR acceleration
    structure for which memory type bits must be exposed (internal
    advisorypanel issue 28).

New Extensions:

  * `<<VK_QCOM_render_pass_store_ops>>`

-----------------------------------------------------

Change log for March 24, 2020 Vulkan 1.2.136 spec update:

  * Update release number to 136 for this update.

GitHub Issues:

  * Generate per-extension refpages from the extension appendices in the
    specification instead of the old, minimal generated refpages, and update
    the registry index to point to these refpages instead of the
    specification (public issue 1195, internal issue 1999).
  * Rename ename:VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL to
    ename:VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL
    to match the similar renaming of sname:VkQueryPoolCreateInfoINTEL to
    slink:VkQueryPoolPerformanceQueryCreateInfoINTEL (public issue 1207,
    internal issue 2048).

Internal Issues:

  * Add a new <<resources-sampler-ycbcr-conversion-format-features, Sampler
    Ycbcr Conversion Format Features>> section, and update
    elink:VkFormatFeatureFlagBits and valid usage statements for
    slink:VkSamplerCreateInfo and slink:VkSamplerYcbcrConversionCreateInfo
    to refer to it (internal issue 1963).
  * Comment out reserved but unused ename:VK_ACCESS_RESERVED_31_BIT_KHR to
    avoid generator script warnings (internal issue 2016).
  * Fix some `<<VK_KHR_ray_tracing>>` valid usage IDs that were broken in
    the 1.2.135 update (internal issue 2044).
  * Remove `const` qualifier from
    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:pNext
    in `vk.xml` (internal issue 2047).
  * Remove `flowRoot` elements supported only by Inkscape from some of the
    images, and update a couple to 96 DPI from 90 DPI due to current
    Inkscape's insistence. This reduces warnings from prawn-svg during PDF
    builds (internal issue 2053).
  * Remove reference in the <<devsandqueues-lost-device, Lost Device>>
    section to a non-existent list of functions returning
    ename:VK_ERROR_DEVICE_LOST (internal merge request 3667).
  * Add valid usage statements to slink:VkImageViewCreateInfo for cube and
    cube array image view (internal merge request 3682).
  * Remove redundant valid usage statement 00228 from flink:vkCmdBlitImage
    (internal merge request 3684).
  * Document the Khronos-provided Docker image, whose use is recommended
    when building documents and generated files from this repository
    (internal merge request 3686).
  * Rename ename:VK_PIPELINE_COMPILE_REQUIRED_EXT from
    ename:VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT and add an alias from the
    old name, since it is not actually an error code. Add it to the
    `successcodes` attributes of appropriate commands in `vk.xml` (internal
    merge request 3687).

-----------------------------------------------------

Change log for March 17, 2020 Vulkan 1.2.135 spec update:

  * Update release number to 135 for this update.

GitHub Issues:

  * Add missing dependencies of slink:VkExportMemoryWin32HandleInfoKHR on
    slink:VkExportMemoryAllocateInfo in the slink:VkMemoryAllocateInfo
    pname:pNext chain; slink:VkExportFenceWin32HandleInfoKHR on
    slink:VkExportFenceCreateInfo in the slink:VkFenceCreateInfo pname:pNext
    chain; and slink:VkExportSemaphoreWin32HandleInfoKHR on
    slink:VkExportSemaphoreCreateInfo in the slink:VkSemaphoreCreateInfo
    pname:pNext chain (public issue 1095).
  * Update the <<spirvenv-module-validation, Validation Rules within a
    Module>> section of the SPIR-V environment appendix to allow the
    code:PhysicalStorageBuffer64 addressing model (public issue 1199).
  * Fix markup in parameters section of
    flink:vkGetPhysicalDeviceXcbPresentationSupportKHR (public pull request
    1201).
  * Amend rules in the <<extensions-vendor-id, Registering a Vendor ID with
    Khronos>> section of the style guide to allow other Khronos APIs such as
    OpenCL to reserve vendor IDs here so they can be shared with those APIs
    (public KhronosGroup/OpenCL-Docs pull request 203).

Internal Issues:

  * Clarify layer loading order for slink:VkInstanceCreateInfo and in the
    <<extendingvulkan-layers, Layers>> chapter following the specification
    of slink:VkLayerProperties (internal issue 1986).
  * Simplify markup for SPIR-V versions required by different Vulkan
    versions in the <<spirvenv, Vulkan Environment for SPIR-V>> appendix
    (internal issue 2011).
  * Rename sname:VkQueryPoolCreateInfoINTEL to
    slink:VkQueryPoolPerformanceQueryCreateInfoINTEL in the
    `<<VK_INTEL_performance_query>>` extension (internal issue 2022).
  * Add ename:VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT to
    elink:VkValidationFeatureEnableEXT to specify that layers will process
    code:debugPrintfEXT operations (internal issue 2023).
  * Fix conflicting language in slink:VkSamplerYcbcrConversionCreateInfo
    valid usage statement 01653 (internal merge request 3629).
  * Add missing valid usage statement for slink:VkSparseImageMemoryBindInfo
    to require slink:VkImage objects created with the
    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT flag set (internal merge
    request 3633).
  * Remove redundant valid usage statement 00122 from flink:vkCmdCopyImage
    (internal merge request 3643).
  * Fix several places where `VULKAN_1_1` was used in Asciidoctor
    conditional markup instead of `VK_VULKAN_1_1` (internal merge request
    3654).
  * Fix conditional markup around slink:VkImageViewCreateInfo valid usage
    statement 01018 to ensure it doesn't overlap a similar valid usage
    statement written for another combination of enabled extensions and
    versions (internal merge request 3655).
  * Remove redundant valid usage statement from flink:vkCmdCopyImage that
    was already covered by statements for slink:VkImageCopy. Eventually this
    will be inverted so the statements are located with flink:vkCmdCopyImage
    but that requires more work and is deferred (internal merge request
    3656).
  * Clarify wording of slink:VkImageMemoryBarrier valid usage statement
    01671 and add a missing statement (internal merge request 3657).
  * Minor fixes to the style guide to bring it up to date with respect to
    the Asciidoctor client, assignment of valid usage ID tags, and proper
    placement of valid usage statements (internal merge request 3662).
  * Add missing valid usage statements to slink:VkSubpassDescription2 based
    on comparable statements for slink:VkSubpassDescription (internal merge
    request 3663).

New Extensions

  * Ray Tracing package of extensions, including
  ** `<<VK_KHR_deferred_host_operations>>`
  ** `<<VK_KHR_pipeline_library>>`
  ** `<<VK_KHR_ray_tracing>>`
  * `<<VK_EXT_pipeline_creation_cache_control>>`
  * `<<VK_NV_device_diagnostics_config>>`
  * `<<VK_NV_device_generated_commands>>` (replacing
    `VK_NVX_device_generated_commands`, which was an experimental vendor
    extension and has been removed from the Specification and `vk.xml`).

-----------------------------------------------------

Change log for March 6, 2020 Vulkan 1.2.134 spec update:

  * Update release number to 134 for this update.

GitHub Issues:

  * Fix flink:vkGetPhysicalDeviceToolPropertiesEXT implicit array valid
    usage statements, rewrite for consistency, and explicitly state lifetime
    of retrieved results (public pull request 1148).
  * Change use of "`happens before`" to glossary term "`happens-before`"
    (public pull request 1170).
  * Use glossary terms "`release operation`" / "`acquire operation`" instead
    of similar colloquial language (public pull request 1171).
  * Fix minor spelling errors and duplicated words (public pull request
    1174).
  * Remove duplicate "`to`" word (public pull request 1176).
  * Rephrase description of signaling / unsignaling for slink:VkEvent
    (public pull request 1179).
  * Update Asciidoctor extension handling of C arrow operator to avoid need
    for escaping it in custom macros, and corresponding fixes to markup in
    the spec and to the style guide (public pull request 1186).
  * Move layout transition NOTE in the
    <<synchronization-image-layout-transitions, Image Layout Transitions>>
    section below the corresponding normative paragraph (public pull request
    1190).
  * Change the parent handle types of slink:VkDisplayKHR and
    slink:VkDisplayModeKHR in `vk.xml` (public pull request 1194).
  * Add missing `len` attribute for
    flink:vkQueueSignalReleaseImageANDROID::pname:pWaitSemaphores parameter
    in `vk.xml` (public pull request 1196).

Internal Issues:

  * Link to HTML preview of `SPV_KHR_non_semantic_info` link in the
    `<<VK_KHR_shader_non_semantic_info>>` appendix, instead of Asciidoctor
    source document (internal merge request 3614).
  * Improve registry schema documentation description of allowed <enum> tags
    inside <remove> tags (internal merge request 3614).

  * Clarify behavior when reading or writing image formats with padding
    ("`X`" components) in the "`Common Operation`" section of the <<copies>>
    chapter, and that padding components are unused in the elink:VkFormat
    description of such formats (internal issue 1122).
  * Clarify that flink:vkGetDeviceProcAddr can be used for device-level
    commands from instance extensions (internal issue 1960).
  * Add a note to the <<primsrast-lines-bresenham, Bresenham Line Segment
    Rasterization>> section clarifying that line rasterization does not
    depend on sample locations (internal issue 1855).
  * Add a new header macro dlink:VK_HEADER_VERSION_COMPLETE which provides
    the complete version (major, minor, and patch/release) of the Vulkan
    headers at compile time, and document the intended use cases for this
    macro (internal issue 1990).
  * Remove `optional` attribute from
    slink:VkDebugUtilsObjectNameInfoEXT::pname:pObjectName in `vk.xml`,
    making the string required (internal issue 2002).
  * Add a missing `structextends` attribute for
    slink:VkQueryPoolCreateInfoINTEL in `vk.xml` (internal merge request
    3599).
  * Clarify when implicit subpass dependencies are introduced in the
    definition of slink:VkSubpassDependency (internal merge request 3603).
  * Update several valid usage statements for flink:vkCmdResetQueryPool,
    flink:vkCmdBeginQuery, and flink:vkCmdBeginQueryIndexedEXT which
    interact with the presence of flink:vkCmdResetQueryPool commands in a
    command buffer, and restrict the VUs to performance queries (internal
    merge request 3604).
  * Simplify a hard-to-parse sentence in the <<textures-RGB-sexp, RGB to
    Shared Exponent Conversion>> section (internal merge request 3606).
  * Add a `pdfwidth` attribute to markup for images inside tables, to work
    around a crash occurring in recent versions of asciidoctor-pdf (internal
    merge request 3626).

New Extensions

  * `<<VK_QCOM_render_pass_transform>>`

-----------------------------------------------------

Change log for February 15, 2020 Vulkan 1.2.133 spec update:

  * Update release number to 133 for this update.

GitHub Issues:

  * Clarify language describing the <<commandbuffers-lifecycle, command
    buffer lifecycle>> (public pull request 1152).
  * Add anchor handles to chapters and VUID statements in the HTML outputs
    (public pull request 1157).
  * Update declaration of flink:vkCmdDrawIndexedIndirectCountAMD to alias
    the core function rather than the KHR extension function (public pull
    request 1165).
  * Remove redundant NOTE discussing
    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT after the description
    of slink:VkCommandBufferInheritanceInfo.txt (public pull request 1167).
  * Reserved vendor ID for Codeplay (public pull request #1167).

Internal Issues:

  * Restrict flag bits to bit positions 0..30. Add language to the
    <<fundamentals-validusage-flags, Valid Usage for Flags>> section
    expressing the restriction; to the registry documentation where the
    `bitpos` attribute is defined; and finally, add a test to the generator
    scripts that warns of bits 31 and higher being used (internal issue
    1945).
  * Clarify dynamic indexing of sampler objects in the
    <<interfaces-resources-descset, Descriptor Set Interface>> section, to
    be controlled by the same feature as sampled images (internal issue
    1951).
  * Make the effect of query reset commands requiring multiple passes to
    complete explicit, by disallowing resets of the same query from the same
    primary command buffer in the description of flink:vkCmdResetQueryPool
    and the valid usage statements for ftext:vkCmdBeginQuery* (internal
    issue 1965).
  * Update interaction between elink:VkFormatFeatureFlagBits affecting
    slink:VkSamplerYcbcrConversionCreateInfo::pname:forceExplicitReconstruction
    (internal merge request 3533).
  * Generate implicit pname:sType-unique valid usage statements from
    `validitygenerator.py` even for pname:pNext chains with only a single
    valid structure type, to enable validation layers work (internal merge
    request 3534).
  * Clean up wording of some flink:vkBindImageMemory valid usage statements
    (internal merge request 3547).
  * Mark the `VK_EXT_shader_subgroup_vote` and
    `VK_EXT_shader_subgroup_ballot` as deprecated in `vk.xml` (internal
    merge request 3558).
  * Tighten slink:VkSamplerYcbcrConversionCreateInfo::pname:chromaFilter
    valid usage restriction to be ename:VK_FILTER_NEAREST instead of
    ename:VK_FILTER_LINAER, now that other filters exist (internal merge
    request 3561).
  * Add valid usage statements to slink:VkCommandPoolCreateInfo and
    slink:VkDeviceQueueCreateInfo requiring that the corresponding
    ename:VK_COMMAND_POOL_CREATE_PROTECTED_BIT and
    ename:VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT not be set if the protected
    memory feature is not enabled. Previously this restriction was described
    for the elink:VkCommandPoolCreateFlagBits and
    elink:VkDeviceQueueCreateFlagBits types containing those flags, but not
    in valid usage statements (internal merge request 3563).
  * Fix conditional markup in the <<shaders-scope-device>> and
    <<shaders-scope-queue-family>> sections to apply to Vulkan 1.2, as well
    as `VK_KHR_vulkan_memory_model` (internal merge request 3570).
  * Add performance queries to the list in the introduction of the
    <<supported query types, queries>> chapter (internal merge request
    3577).

New Extensions

  * `<<VK_KHR_shader_non_semantic_info>>`

-----------------------------------------------------

Change log for January 20, 2020 Vulkan 1.2.132 spec update:

  * Update release number to 132 for this update.

GitHub Issues:

  * Move and reword a NOTE in the <<extendingvulkan-extensions, Extensions>>
    section (public pull request 1131).
  * Change redundant description of application error when using
    flink:vkMapMemory into a non-normative NOTE (public pull request 1143).
  * Remove redundant valid usage statement for flink:vkCmdExecuteCommands
    (public pull request 1151).
  * Remove redundant command buffer
    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT language in
    flink:vkCmdExecuteCommands valid usage statements (public pull request
    1153).
  * Add flink:vkBeginCommandBuffer valid usage statement to prevent using a
    primary command buffer with both the
    ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT and
    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flags (public pull
    request 1154).
  * Add slink:VkRenderPassBeginInfo valid usage statements for
    pname:renderArea (public pull request 1159).
  * Add missing valid usage statements for flink:vkCmdBeginRenderPass when
    `VK_KHR_separate_depth_stencil_layouts` is enabled (public
    KhronosGroup/Vulkan-ValidationLayers issue 1470).

Internal Issues:

  * Clarify the definition of "`transfer commands`" for
    <<synchronization-pipeline-stages-transfer,
    ename:VK_PIPELINE_STAGE_TRANSFER_BIT>> (internal issue 816).
  * Clarify VK_ATTACHMENT_STORE_OP_DONT_CARE and reorder render pass chapter
    (internal issue 1098).
  * Clarify that <<pipelines-dynamic-state, Dynamic State>> can be set
    before pipeline bind, and update valid usage statements accordingly
    (internal issue 1624).
  * Clarify the behavior of floating-point divide by zero in the
    <<spirvenv-precision-operation, Precision and Operation of SPIR-V
    Instructions>> section (internal issue 1669).
  * Add a valid usage statement to flink:vkCmdResetQueryPool which allows
    not calling flink:vkCmdEndQuery if a prior flink:vmCmdResetQuery command
    was called (internal issue 1700).
  * Refactor specification of shader scopes into the new <<shaders-scope,
    Scope>> section, and modify other references to this language
    accordingly. Also describe quad invocation groups properly, with
    derivative and quad group operations referencing the description, and
    call out helper invocations as being able to become spontaneously
    inactive. Simplify parts of the texturing chapter accordingly (internal
    issues 1824, 1884, 1885, 1911).
  * Stop claiming that semaphore signals are ordered between different queue
    commands in the <<synchronization-signal-operation-order>> section
    (internal merge request 3542).
  * Move a valid usage statement from slink:VkBindImagePlaneMemoryInfo to
    flink:vkBindImageMemory2, where it can be determined (internal merge
    request 3548).

-----------------------------------------------------

Change log for January 15, 2020 Vulkan 1.2.131 spec update:

  * Vulkan 1.2 initial release. Update release number to 131 for this
    update. The patch number will be used for all Vulkan 1.x spec updates,
    and continue to increment continuously from the previous Vulkan 1.1.130
    update.

GitHub Issues:

  * Use the attributes {prime}, {YCbCr}, and {RGBprime} for better markup of
    prime symbols, and ease of changing the markup for the commonly used
    color format names (public issue 636).
  * Expand the <<extendingvulkan-extensions-extensiondependencies, Extension
    Dependencies>> section to acknowledge that extension dependencies are
    usually, but not always satisfied by promoted versions of the
    dependencies, and point to the extension and version appendices for more
    information (public issue 1085).
  * Clarify the <<features-shaderStorageImageExtendedFormats,
    pname:shaderStorageImageExtendedFormats>> feature and add corresponding
    formats to the <<formats-mandatory-features-2byte>>,
    <<formats-mandatory-features-10bit>>,
    <<formats-mandatory-features-16bit>>, and
    <<formats-mandatory-features-64bit>> tables (public pull request 1098).
  * Fix issue 2 wording in the `<<VK_KHR_surface>>` appendix (public pull
    request 1100).
  * Fix valid usage statements for
    slink:VkSwapchainCreateInfoKhr::pname:minImageCount interactions with
    `<<VK_KHR_shared_presentable_image>>` (public pull request 1101).
  * Change the etext:VK_QUERY_SCOPE_* tokens in the
    slink:VkPerformanceCounterScopeKHR to aliases of new
    etext:VK_PERFORMANCE_COUNTER_SCOPE_* tokens, following the naming
    conventions for enumerants (public issue 1130).
  * Move `NV` extension pipe stages in elink:VkShaderStageFlagBits so they
    are not included in enmae:VK_SHADER_STAGE_ALL_GRAPHICS (public pull
    request 1133).
  * Clarify the introduction of the "`Surface Queries`" section of the
    <<wsi, Window System Integration>> chapter (public pull request 1135).
  * Fix macros that consume codelike text like pname:foo\->bar (public pull
    request 1149).

Internal Issues:

  * Add a new <<fundamentals-errorcodes, error code>>,
    ename:VK_ERROR_UNKNOWN, that can be returned by any function that has
    error returns (internal issue 1654).
  * Remove the `<<VK_EXT_filter_cubic>>` requirement to cubic filter the
    formats etext:*USCALED_PACKED32, etext:*SSCALED_PACKED32,
    etext:*UINT_PACK32, and etext:*SINT_PACK32 in the
    <<features-required-format-support, Required Format Support>> section
    (internal issue 1934).
  * Add a missing valid usage statement for
    `<<VK_KHR_buffer_device_address>>` to slink:VkBindBufferMemoryInfo,
    based on a similar statement for flink:vkBindBufferMemory (internal
    merge request 3512).
  * Fix some 'name:' macros to the correct 'pname:' (internal merge request
    3529).
  * Changes to script tools to stay relatively aligned with OpenXR scripts
    (internal merge request 3530).

-----------------------------------------------------

Change log for December 9, 2019 Vulkan 1.1.130 spec update:

  * Update release number to 130

GitHub Issues:

  * Mark slink:VkPipelineExecutableInternalRepresentationKHR as
    `returnedonly` in `vk.xml` (public pull request 1092).
  * Use 'slink:' in autogenerated valid usage statements instead of 'sname:'
    (public pull request 1093).
  * Split flink:vkGetQueryPoolResults VU statement 00815, which had
    disallowed internal Asciidoctor conditionals into two (public issue
    1094).
  * Minor markup and editing fixes (public pull request 1099).
  * Hide outdated valid usage statement when not building with timeline
    semaphore extension (public pull request 1121).
  * Add `<<VK_NV_glsl_shader>>` deprecation note (public pull request 1125).
  * Add SPV and GLSL links to `<<VK_KHR_multiview>>` (public pull request
    1128).

Internal Issues:

  * Clarify and consistently refer to the shader interface matching rules in
    the <<interfaces, Shader Interfaces>> chapter (internal issue 1067).
  * Clarify that inner array dimensions can't be sized with specialization
    constants in the <<spirvenv-module-validation, Validation Rules within a
    Module>> section (internal issue 1739).
  * Use consistent markup for nested access (members, array references,
    pointers) to structure members and function parameters (internal issues
    503, 1765).
  * Make slink:VkDeviceQueueInfo2::pname:flags optional in `vk.xml` to
    remove an inappropriate valid usage statement (internal issue 1805).
  * Fix API name assignment for valid usage blocks in `scripts/reflow.py`
    (internal issue 1809).
  * Make spec language more internally consistent by fixing remaining cases
    where the term "`an instance of (structurename)`" was used, and
    expanding the style guide rules for describing pname:pNext chains along
    with corresponding edits it (internal issue 1814).
  * Disallow code:Workgroup memory and execution scope and code:Workgroup
    storage class in all but compute, mesh, and task shaders in the
    <<spirvenv-module-validation, Validation Rules within a Module>>
    section. There is an exception for code:Workgroup execution scope in
    tessellation control shaders because we do not have a more appropriate
    scope for patch barriers (internal issue 1905).
  * Restore 'Promoted to Vulkan 1.1 Core' comments in extension appendices,
    which were accidentally removed in spec revision 1.1.129 (internal issue
    1914).
  * Add some minor markup fixes as well as new valid usage statements for
    slink:VkAttachmentDescription, slink:VkAttachmentDescription2KHR, and
    slink:VkAttachmentReference2KHR (internal merge request 3493).

New Extensions

  * `<<VK_EXT_tooling_info>>`

-----------------------------------------------------

Change log for November 25, 2019 Vulkan 1.1.129 spec update:

  * Update release number to 129

GitHub Issues:

  * Rename "`pixel shaders`" to "`fragment shaders`" (public issue 1082).
  * Fix some markup in external semaphore extension (public pull request
    1083).
  * Fix styleguide em-dash example (public pull request 1088).
  * Update `.gitignore` to include some additional static refpages (public
    pull request 1089).
  * Restructure query language in <<wsi, Window System Integration (WSI)>>
    chapter - split into sections, reordered orphaned paragraphs, simplify
    language (public pull request 1090).

Internal Issues:

  * Remove NVIDIA contributors from `<<VK_KHR_performance_query>>` (internal
    merge request 3481).

New Extensions

  * `<<VK_KHR_buffer_device_address>>`

-----------------------------------------------------

Change log for November 18, 2019 Vulkan 1.1.128 spec update:

  * Update release number to 128

GitHub Issues:

  * Fix valid usage condition for
    flink:vkAllocationMemory::pname:pAllocateInfo (public issue 1032).
  * Change explicit valid usage statements for queue transfer operations in
    flink:vkCmdWaitEvents and flink:vkCmdPipelineBarrier, and corresponding
    language in the <<synchronization-queue-transfers-release>> section, to
    incorporate access masks and clarify when queue transfer ops occur
    (public pull request 1046).
  * Ignore disabled bits in valid usage statements (public pull request
    1062).
  * Fix some broken HTML links (public pull request 1063).
  * Change ename:VK_PIPELINE_CREATE_DISPATCH_BASE to an alias of new token
    ename:VK_PIPELINE_CREATE_DISPATCH_BASE_BIT, to follow the naming
    conventions for bitmasks (public issue 1075).

Internal Issues:

  * Add valid usage statement to flink:vkQueueSubmit for attempted use of a
    resource currently not available for use (internal issue 1751).
  * Make it invalid for an implementation to return anything but
    ename:VK_SUCCESS for the flink:vkFreeDescriptorSets and
    flink:vkResetDescriptorPool commands (internal issue 1781).
  * Add a note clarifying the relationship between
    code:SubgroupLocalInvocationId and code:LocalInvocationId or
    code:LocalInvocationIndex to the <<interfaces-builtin-variables-sgli,
    code:SubgroupLocalInvocationId>> description (internal issue 1810).
  * Add valid usage statements for scissor regions to
    slink:VkPipelineViewportStateCreateInfo based on similar statements for
    flink:vkCmdSetScissor, and generalize all these VUs to cover each
    element of the pname:pScissors array (internal issue 1861).
  * Fix the basis matrix for <<textures-texel-cubic-filtering, Texel Cubic
    Filtering>> (internal issue 1878).
  * Make the
    slink:VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT::pname:pNext
    member non-const, like other feature structures (internal issue 1880).
  * Document that aggregate load/store may access padding bytes in the
    <<memory-model-memory-location, Memory Location>> appendix (internal
    cross-api/memory-model issue 113).
  * Clarify in the description of elink:VkDescriptorBindingFlagBitsEXT that
    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT descriptors allow
    for updating different descriptors in the same set at the same time on
    multiple threads (internal merge request 3419).
  * Clarify that resolve attachments don't need to be compatible in the
    <<renderpass-compatibility, Render Pass Compatibility>> section
    (internal merge request 3422).
  * Add Visual Studio folders to `.gitignore` (internal merge request 3450).
  * Add language to
    slink:sname:VkPipelineCoverageModulationStateCreateInfoNV documenting
    that coverage modulation has no effect when using the
    ename:VK_COVERAGE_REDUCTION_MODE_TRUNCATE_NV reduction mode, clarifying
    an interaction with `<<VK_NV_coverage_reduction_mode>>` (internal merge
    request 3456).

New Extensions

  * `<<VK_KHR_performance_query>>`

-----------------------------------------------------

Change log for November 4, 2019 Vulkan 1.1.127 spec update:

  * Update release number to 127

GitHub Issues:

  * Consistently use the feature name pname:pipelineExecutableInfo as found
    in `vk.xml` and the generated header files, instead of
    pname:pipelineExecutableProperties as sometimes used in the
    specification text (public issue 1061).
  * Clarify the definition of the code:PrimitiveId returned by a
    `<<VK_NV_ray_tracing>>` shader (public issue 1068).

Internal Issues:

  * Remove unused `draw_renderpass_validation.txt` valid usage text
    (internal issue 1869).
  * Require <<features-features-timelineSemaphore, pname:timelineSemaphore>>
    if the `<<VK_KHR_timeline_semaphore>>` extension is supported (internal
    issue 1873).
  * Fix typos in slink:VkBindBufferMemoryInfo valid usage statement 02791
    and various slink:VkSparseMemoryBind VUs (internal merge request 3411).
  * Minor non-semantic markup and diagram fixes (internal merge request
    3417).
  * Clarify that <<interfaces-iointerfaces-locations, Location>> values are
    physical slots, not a virtual table that just imposes an overall maximum
    on the number of locations that can be used (internal merge request
    3426).
  * Add links to GLSL specs from the `<<VK_KHR_shader_clock>>` appendix, as
    well as expected mappings for GLSL builtins (internal merge request
    3429).

New Extensions

  * `<<VK_KHR_separate_depth_stencil_layouts>>`

-----------------------------------------------------

Change log for October 21, 2019 Vulkan 1.1.126 spec update:

  * Update release number to 126

GitHub Issues:

  * Update the elink:VkAccessFlagBits etext:VK_ACCESS_MEMORY_* flags
    definition to make clear that ename:VK_ACCESS_MEMORY_READ_BIT and
    ename:VK_ACCESS_MEMORY_WRITE_BIT are meant to be equivalent to setting
    all applicable etext:READ and etext:WRITE access flags, and update the
    <<synchronization-access-types-supported, supported access types>> table
    accordingly (public pull request 1014).
  * Remove misleading NOTE in the <<synchronization-dependencies-chains>>
    section (public pull request 1048).
  * Clarify the memory mapping NOTE about invalidation described for
    flink:vkInvalidateMappedMemoryRanges (public pull request 1049).
  * Fix label for flink:vkCmdWaitEvents VUID 02803 (public pull request
    1056).
  * Styleguide fixes to several NOTES in the <<synchronization>> chapter
    (public pull request 1057).
  * Markup fix to <<features-features-timelineSemaphore>> section (public
    pull request 1058).
  * Convert some external links to `https` protocol (public pull request
    1064).
  * Remove unsupported nested links inside table captions (public pull
    request 1067 + followon tweak to make 'allchecks' target pass).

Internal Issues:

  * Restrict the SPIR-V code:Invariant decoration to only be used with
    code:Output variables in the <<spirvenv-module-validation, Validation
    Rules within a Module>> section (internal issue 1832).
  * Clarify that the <<features-independentResolve, independentResolve>>
    feature implies support for the <<features-independentResolveNone,
    independentResolveNone>> feature (internal issue 1848).
  * Clarify self-contradictory language for slink:VkSubpassDescription to
    say that resolves only happen within the render area (internal issue
    1850).
  * Add valid usage statements for slink:VkMemoryAllocateInfo and
    corresponding language to elink:VkExternalMemoryFeatureFlagBitsKHR to
    restrict implementations and applications from using both an external
    host memory allocation and dedicated allocation (internal merge request
    3375).

-----------------------------------------------------

Change log for October 13, 2019 Vulkan 1.1.125 spec update:

  * Update release number to 125.

GitHub Issues:

  * Allow slink:VkRenderPassFragmentDensityMapCreateInfoEXT to extend
    slink:VkRenderPassCreateInfo2KHR in `vk.xml` (public issue 1027).
  * Fix markup in `<<VK_EXT_external_memory_dma_buf>>` appendix (public pull
    request 1051).
  * Update .gitignore (public pull request 1052).

Internal Issues:

  * Disallowed slink:VkEvent from participating in queue family ownership
    transfers in the <<devsandqueues-index, Queue Family Index>> section
    (internal issue 1691).
  * Relax language describing default NT handle access rights for
    slink:VkExportMemoryWin32HandleInfoKHR and
    slink:VkExportSemaphoreWin32HandleInfoKHR (internal issue 1838).
  * Fix markup for slink:VkDeviceCreateInfo valid usage statement 00372 to
    remove imbedded Asciidoctor conditionals by splitting it into two VUs
    (internal issue 1846).
  * Clarify lifetime of samplers used as immutable samplers in
    slink:VkDescriptorSetLayoutBinding (internal issue 1849).
  * Add a valid usage statement prohibiting flink:vkCmdBeginQuery on
    timestamp queries (internal issue 1851).
  * Correct some <<Precision of GLSL.std.450 Instructions, SPIR-V
    instruction precisions>> (internal merge request 3391).
  * Fix a typo in flink:vkQueueBindSparse valid usage statement 03245
    (internal merge request 3394).

New Extensions

  * `<<VK_KHR_spirv_1_4>>`

-----------------------------------------------------

Change log for October 6, 2019 Vulkan 1.1.124 spec update:

  * Update release number to 124.

GitHub Issues:

  * Fix Makefile SPECREMARK macro to work when not building in a git tree
    (public issue 992).
  * Ignore pname:aspectMask for unused attachments in
    slink:VkSubpassDescription2KHR valid usage statements (public pull
    request 1028).
  * Minor markup / spelling fixes (public pull requests 1035, 1045).

Internal Issues:

  * Fix markup in Valid Usage statement for slink:VkCreateFramebuffer
    (internal issue 1823).
  * Add a new <<synchronization-signal-operation-order, _signal operation
    order_>> section to the synchronization chapter which describes in
    detail the ordering guarantees provided by the API between fence and
    semaphore signal operations (internal merge request 3368).
  * Move generated `appendix/meta/` files into the Makefile GENERATED
    directory (internal merge request 3381).

New Extensions

  * `<<VK_KHR_shader_clock>>`
  * `<<VK_KHR_timeline_semaphore>>`

-----------------------------------------------------

Change log for September 15, 2019 Vulkan 1.1.123 spec update:

  * Update release number to 123.

GitHub Issues:

  * Add missing aspect mask descriptions to elink:VkImageAspectFlagBits
    (public pull request 1029).
  * Modify validity generator script to not check validity of ignored values
    in same-parent valid usage statements (public pull request 1030).
  * Make slink:VkDescriptorUpdateTemplateCreateInfo::pname:descriptorSetLayout
    `noautovalidity` in `vk.xml` (public pull request 1031).
  * Fix footnote markup in the <<vkGetDeviceProcAddr behavior>> table
    (public pull request 1034).

Internal Issues:

  * Require that <<interfaces-builtin-variables-sgs, code:SubgroupSize>> be
    a power of two (internal issue 1499).
  * Clarify that shaderFloat64 and shaderInt64 enable all storage classes,
    while shaderFloat16, shaderInt8, and shaderInt16 only enable
    non-interface storage classes. in the <<features-shaderFloat64>>,
    <<features-shaderInt64>>, and <<features-shaderInt16>> descriptions and
    for slink:VkPhysicalDeviceShaderFloat16Int8FeaturesKHR (internal issue
    1582).
  * Fix broken Asciidoctor conditional logic in the
    <<spirvenv-module-validation, Validation Rules within a Module>>
    section, and add style guide language to help avoid this problem in the
    future (internal issue 1808).
  * Modify VUID assignment script to use the first API include in a block as
    part of the VUID name rather than the last one, so the VUID is based on
    the promoted API name (internal issue 1809).
  * Cleanup string descriptions to consistently refer to "`null-terminated
    UTF-8`" strings (internal issue 1813).
  * Clarify the purpose of the
    slink:VkPhysicalDeviceLimits::ptext:maxDescriptorSet* limits (internal
    merge request 3357).
  * Fix the slink:VkPhysicalDeviceRayTracingPropertiesNV limits for
    pname:maxGeometryCount, pname:maxInstanceCount, and
    pname:maxTriangleCount in the <<limits-required, Required Limits>>
    section (internal issue 3372).
  * Update SPIR-V image op sign-matching rules in the
    <<spirvenv-module-validation, Validation Rules within a Module>>
    section, the <<formats-numericformat>> table, and the
    <<interfaces-resources-descset, Descriptor Set Interface>> section
    (internal spirv/SPIR-V issue 332).

New Extensions

  * `<<VK_KHR_shader_subgroup_extended_types>>`
  * `<<VK_GOOGLE_user_type>>`

-----------------------------------------------------

Change log for September 8, 2019 Vulkan 1.1.122 spec update:

  * Update release number to 122.

Internal Issues:

  * Add style guide language on not using standalone `+` signs (internal
    issue 736); not using leading whitespace for markup (internal issue
    747); and on keeping descriptions of a single API in a contiguous block
    of markup (internal issue 949), and apply them to the specification.
  * Add a glossary definition of "`constant integral expression`", pointing
    to the SPIR-V "`constant instruction`" definition (internal issue 1225).
  * Many minor edits to improve writing style consistency and capture
    additional style guidelines (internal issue 1553).
  * Clarify that <<fragops-depth-write, depth writes are not performed>> if
    there is no depth framebuffer attachment (internal issue 1771).
  * Allow implementations to use rectangular line style of interpolation for
    <<primsrast-lines-bresenham, wide Bresenham lines>>, though replicating
    attributes is still preferred. Clarify that code:FragCoord is not
    replicated (internal issue 1772).
  * Resolve a contradiction in valid usage statements for
    slink:VkImageCreateInfo and slink:VkImageStencilUsageCreateInfoEXT
    (internal issue 1773).
  * Add style guide discussion of markup for indented equations, and use
    markup workaround for Asciidoctor 2 compatibility (internal issue 1793).
  * Deprecate the `<<VK_EXT_validation_flags>>` extension in `vk.xml` and
    the extension appendix (internal issue 1801).
  * Add a new checker script `scripts/xml_consistency.py`. This is not
    currently run as part of internal CI (internal merge request 3285).
  * Correct "`an`" -> "`a`" prepositions where needed (internal merge
    request 3334).
  * Clarify that the <<features-uniformBufferStandardLayout,
    pname:uniformBufferStandardLayout>> feature is only required when the
    extension defining it is supported (internal merge request 3341).
  * Bring scripts into closer sync with OpenXR, mainly through conversion of
    comments to docstrings where appropriate, and add gen-scripts-docs.sh
    (internal merge request 3324).
  * Correct pname:maxDrawMeshTasksCount to 2^16^-1 in the <<limits-required,
    Required Limits>> table (internal merge requests 3361).

New Extensions

  * `<<VK_IMG_format_pvrtc>>` (public issue 512).

-----------------------------------------------------

Change log for August 25, 2019 Vulkan 1.1.121 spec update:

  * Update release number to 121.

GitHub Issues:

  * Add missing `structextends` attribute in `vk.xml` for
    slink:VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR (public
    issue 1018).
  * Change attributes of flink:vkCmdCopyAccelerationStructureNV,
    flink:vkCmdWriteAccelerationStructuresPropertiesNV,
    flink:vkCmdBuildAccelerationStructureNV, and flink:vkCmdTraceRaysNV to
    require that these commands execute outside renderpasses (public issue
    1021).
  * Add an issue to the `<<VK_EXT_buffer_device_address>>` appendix
    discussing the introduction of new names and aliasing by equivalent old
    names (public pull request 1024).

Internal Issues:

  * Protect the `VK_KHR_sampler_mirror_clamp_to_edge` extension with
    Asciidoctor conditionals, and remove it from the core-only specification
    builds, where it had previously been force-included in the Makefile. It
    is now treated like any other extension (internal issue 1776).
  * Edit some Asciidoctor anchor names starting with `features-features-` to
    just start with `features-`, since the old chapters was split into 3
    pieces. There are still some mild naming inconsistencies with anchors
    which may be addressed in the future (internal issue 1792).
  * Add `KHR` alias for the non-suffixed extension token
    ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE, for compatibility
    with naming rules for extensions (internal issue 1796).
  * Clarify requirements for external memory in NOTEs for
    sname:VkExternalMemoryBufferCreateInfo, and valid usage statements for
    flink:vkBindBufferMemory, slink:VkBindBufferMemoryInfo,
    flink:vkBindImageMemory, and slink:VkBindImageMemoryInfo (internal merge
    request 3301).
  * Make extension version numbers in `vk.xml` and extension appendices
    consistent. In a few cases, we could not recover history at this
    granularity, and left the summary of a version's change undefined
    (internal merge request 3323).
  * Fix invocation of `CodeInlineMacro` in the Ruby extension backing the
    `code:` macro, which was delegating to the wrong base class (internal
    merge request 3331).
  * Modify `reg.py` to do a better job of recognizing equivalent <enum>
    definitions.
  * Add a `sortorder` attribute to XML feature and extension tags.

New Extensions

  * `<<VK_AMD_device_coherent_memory>>`

-----------------------------------------------------

Change log for August 17, 2019 Vulkan 1.1.120 spec update:

  * Update release number to 120.

GitHub Issues:

  * Add slink:VkAccelerationStructureTypeNV explicitly to extension XML for
    `<<VK_NV_ray_tracing>>` (public issue 848).
  * Add missing valid usage statements for feature flags in
    slink:VkCommandBufferInheritanceInfo (public pull request 1017).

Internal Issues:

  * Clarify behavior of non-premultiplied destination colors for
    `<<VK_EXT_blend_operation_advanced>>` prior to the definition of
    slink:VkBlendOverlapEXT (internal issue 1766).
  * Fix the confusing phrasing "`no other queue must: be (doing something)`"
    for flink:vkQueuePresentKHR, flink:vkQueueSubmit, and
    flink:vkQueueBindSparse (internal issue 1774).
  * Add `<<VK_EXT_validation_features>>` flag to enable best practices
    checks, which will soon be available in the validation layer (internal
    issue 1779).
  * Specify allowed characters for VUID tag name components in the style
    guide (internal issue 1788).
  * Update links to SPIR-V extension specifications, and parameterize their
    markup in case the URLs change in the future (internal issue 1797).
  * Fix an off-by-one error in the valid usage statement for
    slink:VkPipelineExecutableInfoKHR (internal merge request 3303).
  * Clean up markup indentation not matching the style guide (internal merge
    request 3314).
  * Minor script updates to allow refpage aliases, generate a dynamic TOC
    for refpages, generate Apache rewrite rules for aliases, open external
    links from refpages in a new window, and synchronize with the OpenCL
    scripts. This will shortly enable a paned navigation setup for refpages,
    similar to the OpenCL 2.2 refpages (internal merge request 3322).
  * Script updates to add tests to the checker, refactor and reformat code,
    generate better text for some valid usage statements, use more Pythonic
    idioms, and synchronize with the OpenXR scripts (internal merge request
    3239).
  * Script updates and minor fixes in spec language to not raise checker
    errors for refpage markup of pages not existing in the API, such as
    VKAPI_NO_STDINT_H. Remove corresponding suppression of some
    check_spec_links.py tests from .gitlab-ci.yml and 'allchecks' target
    (internal merge request 3315).

-----------------------------------------------------

Change log for August 11, 2019 Vulkan 1.1.119 spec update:

  * Update release number to 119.
  * A new extension was accidentally left out of the 1.1.118 spec update.
    This update corrects that oversight.

New Extensions:

  * `<<VK_KHR_pipeline_executable_properties>>`

-----------------------------------------------------

Change log for August 11, 2019 Vulkan 1.1.118 spec update:

  * Update release number to 118.

GitHub Issues:

  * Update `BUILD.adoc` to specifically require Asciidoctor 1.5.8, and make
    that change to the gitlab CI script (public issue 968).
  * Remove redundant slink:VkSubpassDependency and
    slink:VkSubpassDependency2KHR valid usage statements
    (public pull request 995).
  * Clarify the <<vkGetInstanceProcAddr behavior>> and <<vkGetDeviceProcAddr
    behavior>> tables (public pull request 1004).
  * Fix use of nonexistent
    slink:VkSamplerYcbcrConversionImageFormatProperties::pname:maxCombinedImageSamplerDescriptorCount
    (public pull request 1010).
  * Use compatible pathlib for python2 (public pull request 1012).

Internal Issues:

  * Mark the <<VK_KHR_vulkan_memory_model>> extension as no longer
    provisional in `vk.xml` (internal issue 1369).
  * Clarify that use-defined code:Input and code:Output variables cannot be
    code:Boolean in the <<interfaces-iointerfaces-user, User-defined
    Variable Interface>> section (internal issue 1663).
  * Fix naming inconsistencies in
    slink:VkPhysicalDevicePerformanceQueryFeaturesKHR,
    slink:VkPhysicalDevicePerformanceQueryPropertiesKHR,
    slink:VkQueryPoolPerformanceCreateInfoKHR, and associated enumerants
    (internal issue 1746).
  * Use ACM reference style for normative references (internal merge request
    3256).
  * Explicitly list the features changed in Vulkan 1.1 in the
    <<features-requirements, Feature Requirements>> section and the
    <<versions, Core Revisions (Informative)>> appendix (internal merge
    request 3274).
  * Add the slink:VkPhysicalDeviceSubgroupSizeControlFeaturesEXT structure
    to the <<VK_EXT_subgroup_size_control>> extension, which was
    accidentally omitted in the initial release of the extension (internal
    merge request 3287).
  * Add missing slink:VkImageUsageFlag description for
    ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT (internal merge
    request 3292).
  * Add valid usage statements to slink:VkAccelerationStructureInfoNV and
    flink:vkGetAccelerationStructureHandleNV to clarify usage of
    acceleration structure handle and geometries (internal merge request
    3292).

New Extensions:

  * `<<VK_AMD_shader_core_properties2>>`
  * `<<VK_AMD_pipeline_compiler_control>>`

-----------------------------------------------------

Change log for July 28, 2019 Vulkan 1.1.117 spec update:

  * Update release number to 117.

GitHub Issues:

  * Add ename:VK_STENCIL_FACE_FRONT_AND_BACK for naming consistency, and
    alias the old ename:VK_STENCIL_FRONT_AND_BACK for backwards
    compatibility (public issue 991).
  * Fix minor issues with valid usage statements for
    flink:vkCreateFramebuffer, slink:VkFramebufferCreateInfo, and
    slink:VkRenderPassBeginInfo when the `<<VK_KHR_imageless_framebuffer>>`
    extension is enabled (public issue 998).
  * Clarify the subpass dependency requirement in the
    <<renderpass-layout-transitions>> section to eliminate the need for a
    subpass dependency for either the same or different layouts as long as
    they're both read-only (relates to
    https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/948).

Internal Issues:

  * Document that <<extendingvulkan-compatibility-promotion, backwards
    compatibility aliases are not promoted>> as part of promoting an
    extension (internal issue 1677).
  * Update VK_ANDROID_native_buffer extension to spec version 8 (internal
    issue 1753).
  * Add missing section to the <<VK_KHR_shader_controls_v4_incompatibility,
    VK_KHR_shader_float_controls>> extension appendix describing
    the reason for the breaking API change in version 4 of the extension,
    and correct the version to 4 in `vk.xml` (internal merge request
    3275).
  * Add valid usage statements to slink:VkAccelerationStructureInfoNV
    requiring the ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag for
    buffers used in acceleration structure building.

New Extensions:

  * `<<VK_EXT_line_rasterization>>`
  * `<<VK_EXT_texture_compression_astc_hdr>>`
  * `<<VK_EXT_index_type_uint8>>`

-----------------------------------------------------

Change log for July 20, 2019 Vulkan 1.1.116 spec update:

  * Happy 50th Lunar Landing Day!
  * Update release number to 116.

Internal Issues:

  * Clarify that flink:vkCmdBeginQuery is the same as
    flink:vkCmdBeginQueryIndexEXT with index = 0, and that
    flink:vkCmdEndQuery is the same as flink:vkCmdEndQueryIndexEXT with
    index = 0 (internal issue 1735).
  * Clarify that when copying the depth aspect between buffers and images
    via slink:VkBufferImage Copy, the depth values in buffer memory must be
    in range if the `<<VK_EXT_depth_range_unrestricted>>` extension is not
    enabled (internal issue 1737).
  * Minor language tweaks in the <<spirvenv-module-validation, Validation
    Rules within a Module>> section (internal issue 1744).
  * Change the slink:VkPhysicalDeviceFloatControlsPropertiesKHR structure in
    the `<<VK_KHR_shader_controls>>` extension. This is a rare case of
    breaking the interface of an existing extension to acknowledge the
    reality of divergent vendor implementations that could not be described
    properly otherwise, and the breaking change is considered acceptable
    given the expected low use of the extension (internal issue 1734).
    Specific changes:
  ** Added the slink:VkShaderFloatControlsIndependenceKHR enumeration to
     describe the three possible behaviors.
  ** Renamed pname:separateDenormSettings to
     pname:denormBehaviorIndependence.
  ** Renamed pname:separateRoundingModeSettings to
     pname:roundingModeIndependence
  * Add a missing valid usage statement for
    slink:VkQueryPoolCreateInfo::pname:queryCount (internal issue 1742).
  * Update the `<<VK_NV_shading_rate_image>>` appendix to list all
    interfaces defined by the extension.
  * Add a valid usage statement to
    slink:VkWriteDescriptorSetAccelerationStructureNV to clarify that
    acceleration structure descriptors must be top level structures.

New Extensions:

  * `<<VK_EXT_subgroup_size_control>>`

-----------------------------------------------------

Change log for July 14, 2019 Vulkan 1.1.115 spec update:

  * Update release number to 115.

GitHub Issues:

  * Add valid usage statements to slink:VkWriteDescriptorSet and
    slink:VkCopyDescriptorSet specifying that updating immutable descriptors
    with ename:VK_DESCRIPTOR_TYPE_SAMPLER is invalid, and that updating
    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER ignores the update's
    samplers (public issue 985).
  * Document that the `manhtmlpages` target requires building with all
    extensions enabled, in `BUILD.adoc` (public issue 992).
  * Fix reference to the wrong subpass in valid usage statement for
    slink:VkRenderPassCreateInfo (public pull request 994).

Internal Issues:

  * Rename slink:VkPhysicalDeviceShaderIntegerFunctions2INTEL and
    ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS2_FEATURES_INTEL
    for consistency with global naming conventions, and to help code
    generation in other projects (internal issue 1685).
  * Update valid usage statements for image code:Offset / code:ConstOffset
    usage in the <<textures-gather, Texel Gathering>> and
    <<spirvenv-module-validation, Validation Rules within a Module>>
    sections, and for the <<limits-minTexelGatherOffset>> and
    <<limits-maxTexelGatherOffset>> limits (internal issue 1723).
  * Require code:code:OpGroupNonUniformBroadcast to take a constant `Id`
    operand in the <<spirvenv-module-validation, Validation Rules within a
    Module>> sections (internal issue 1726).
  * Note that the swapchain specified in slink:VkImageSwapchainCreateInfoKHR
    when creating an image must match the one specified in
    slink:VkBindImageMemorySwapchainInfoKHR when binding memory to the image
    (internal issue 1729).
  * Remove stext:KHR suffix from some structure cross-references that were
    promoted to Vulkan 1.1 (internal issue 1730).
  * Fix structure name in `structextends` attribute for
    slink:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT in `vk.xml`
    (internal issue 1740).
  * Fix an error in the code:ClipColor() pseudocode for
    <<VK_EXT_blend_operation_advanced>> (internal issue 1741).
  * Add a row for
    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV to the
    description of elink:VkQueryType, and make a few related minor text
    cleanups.
  * Rename slink:VkPhysicalDeviceFloat16Int8FeaturesKHR to
    slink:VkPhysicalDeviceShaderFloat16Int8FeaturesKHR for consistency,
    retaining aliases of the old structure name and structure type enum for
    backwards compatibility.

-----------------------------------------------------

Change log for July 7, 2019 Vulkan 1.1.114 spec update:

  * Update release number to 114.

Internal Issues:

  * Fix extension appendix for `<<VK_INTEL_performance_query>>` to remove
    duplicate citation of ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL
    (internal merge request 3234).

New Extensions:

  * `<<VK_KHR_imageless_framebuffer>>`

-----------------------------------------------------

Change log for June 30, 2019 Vulkan 1.1.113 spec update:

  * Update release number to 113.

GitHub Issues:

  * Fix typo in `<<VK_EXT_global_priority>>` appendix (public issue 979).

Internal Issues:

  * Expand the explanation of
    slink:VkSamplerYcbcrConversionImageFormatPropertiesKHR::pname:combinedImageSamplerDescriptorCount,
    and explain how it interacts with slink:VkWriteDescriptorSet,
    slink:VkDescriptorSetLayoutBinding::pname:descriptorCount, and
    slink:VkDescriptorPoolSize::pname:descriptorCount (internal issue 1643).
  * Clarify restrictions on components for code:OpImageGather in the
    <<spirvenv-module-validation, Validation Rules within a Module>> section
    (internal issue 1707).
  * Clarify the descriptions of <<limits-computeUnitsPerShaderArray,
    pname:computeUnitsPerShaderArray>> and <<limits-wavefrontSize,
    pname:wavefrontSize>> fields in
    slink:VkPhysicalDeviceShaderCorePropertiesAMD.

New Extensions:

  * `<<VK_EXT_texel_buffer_alignment>>`
  * `<<VK_EXT_shader_demote_to_helper_invocation>>`

-----------------------------------------------------

Change log for June 23, 2019 Vulkan 1.1.112 spec update:

  * Update release number to 112.

GitHub Issues:

  * Clarify that it is possible to use the <<memory-host, Host Memory>>
    pname:pfnReallocation callback to free memory in any case that
    pname:pfnFree could be used (public issue 973).

Internal Issues:

  * Clarify range and precision of code:OpImageQueryLod in the discussion of
    scale factor and level-of-detail operation in the
    <<textures-normalized-operations, Normalized Texel Coordinate
    Operations>> section (internal issues 926, 1719).
  * Fix framebuffer layer valid usage statements for
    slink:VkRenderPassCreateInfo, slink:VkRenderPassCreateInfo2KHR, and
    slink:VkFramebufferCreateInfo (internal issue 1670).
  * Refactor common valid usage statements for flink:vkCmdBeginQuery and
    flink:vkCmdBeginQueryIndexedEXT (internal issue 1682).
  * Prohibit the ename:ename:VK_SAMPLER_YCBCR_RANGE_ITU_NARROW range from
    being used in slink:VkSamplerYcbcrConversionCreateInfo for formats with
    a bit depth less than 8 (internal issue 1688).
  * Add missing interactions with `<<VK_EXT_host_query_reset_usage>>` in the
    <<queries, Queries>> chapter (internal issue 1692).
  * Clean up error output from the `optimize-pdf` build script on success.
  * Fix an internal link to the <<spirvenv-correctly-rounded, Correctly
    Rounded>> section in the SPIR-V appendix by adding and referring to that
    anchor.
  * Fix extension version numbers in `vk.xml` for `VK_EXT_filter_cubic` and
    `VK_IMG_filter_cubic`.
  * Specify division precision for negative numbers, and remove statement
    that trigonometric functions have undefined precision, in the
    <<spirvenv-precision-operation, Precision and Operation of SPIR-V
    Instructions>> appendix.

-----------------------------------------------------

Change log for June 10, 2019 Vulkan 1.1.111 spec update:

  * Update release number to 111.

GitHub Issues:

  * Clean up flink:vkGetPhysicalDeviceSurfaceFormatsKHR and
    flink:vkGetPhysicalDeviceSurfaceFormats2KHR to drop the
    ename:VK_FORMAT_UNDEFINED case, require callers pass a supported
    surface, and rearrange some validation-related language (public issue
    207).
  * Allow dynamic and nonuniform indexing of acceleration structures in the
    <<interfaces-resources-descset, Descriptor Set Interface>> section
    (public KhronosGroup/glslang issue 1766).

Internal Issues:

  * Clarify when images require the use of YCbCr samplers for
    slink:VkWriteDescriptorSet and slink:VkImageViewCreateInfo (internal
    issue 1639).
  * Remove the "`block`" language around <<features-robustBufferAccess,
    vectorizing and robust buffer access>> (internal issue 1642).
  * Allow code:OpTypeImageFormat == code:Unknown for input attachments in
    the <<interfaces-resources-descset, Descriptor Set Interface>> section
    (internal issue 1645).
  * Fix Asciidoctor conditionals around
    ename:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT in the
    <<fundamentals-errorcodes>> section (internal issue 1679).
  * Remove error codes from `vk.xml` for
    flink:vkUninitializePerformanceApiINTEL, which has a `void` return type
    (internal issue 1704).
  * Various subgroup-related fixes in the <<spirvenv-capabilities,
    Capabilities>>, <<shaders-subgroup-arithmetic, Arithmetic Subgroup
    Operations>>, <<shaders-subgroup-clustered, Clustered Subgroup
    Operations>>, and <<shaders-subgroup-partitioned, Partitioned Subgroup
    Operations>> sections (internal merge request 3164).
  * Fix Asciidoctor markup affecting math rendering in the <<Precision of
    core SPIR-V Instructions>> table (internal merge request 3166).
  * Fix incorrect reference to flink:vkGetPhysicalDeviceFeatures2KHR in the
    description of slink:VkPhysicalDeviceASTCDecodeFeaturesEXT (internal
    merge request 3169).
  * Fix a non-sentence in the introduction to the <<textures, Image
    Operations Overview>> section (internal merge request 3184).
  * Minor markup, grammar, and typo fixes for the
    `<<NV_shader_sm_builtins>>` extension spec language (internal merge
    request 3189).
  * Clarify that 1D and 1D array format support is optional for cubic
    filters, immediately following the <<formats-mandatory-features-astc,
    Mandatory ASTC LDR format support>> table (internal merge request 3194).

-----------------------------------------------------

Change log for June 2, 2019 Vulkan 1.1.110 spec update:

  * Update release number to 110.

GitHub Issues:

  * Fix typo (public pull request 972).
  * Rename Pastel driver ID to SwiftShader (public pull request 974).

New Extensions:

  * `<<VK_EXT_fragment_shader_interlock>>`
  * `<<VK_NV_shader_sm_builtins>>`

-----------------------------------------------------

Change log for May 24, 2019 Vulkan 1.1.109 spec update:

  * Update release number to 109.

GitHub Issues:

  * Require matching for physical devices to be in a device group in the
    <<devsandqueues-devices, Devices>> section (public issue 695).
  * Fix typo in an equation in the <<fragmentdensitymap-fetch-density-value,
    Fetch Density Value>> section (public issue 954).
  * Fix styleguide links (public pull request 965).

Internal Issues:

  * Allow <<renderpass-compatibility, compatibility of single-subpass
    renderpasses>> with different resolve attachments (internal issue 1464).
  * Add some missing empty flags types to API spec so custom refpage
    generation doesn't break (internal issue 1607).
  * Add a "`SPIR-V Sampled Type`" column to the <<formats-numericformat,
    Interpretation of Numeric Formats>> table, and clarify the requirement
    that the code:OpTypeImage sampled type match the bound image's numeric
    format for slink:VkClearColorValue and in the
    <<interfaces-resources-descset, Descriptor Set Interface>> section
    (internal issue 1646).
  * Fix a typo in the <<tessellation-quad-tessellation, Quad Tessellation>>
    section which should refer to rectangles, not triangles (internal issue
    1667).
  * Clarify the definition of time domains in elink:VkTimeDomainEXT
    (internal merge request 3110).
  * Add R10X6 and R12X4 formats to the <<formats-mandatory-features-10bit>>
    table (internal merge request 3137).
  * Don't require extern sync on wait/signal semaphores in `vk.xml` for
    flink:vkQueueSubmit and flink:vkQueueBindSparse (internal merge request
    3116).
  * Improve phrasing of compute and mesh shader size related to
    code:LocalSize and code:WorkgroupSize in
    slink:VkPhysicalDeviceMeshShaderPropertiesNV and
    slink:VkPhysicalDeviceMaintenance3Properties (internal merge request
    3156).
  * Make the flink:vkCmdBindShadingRateImageNV pname:imageView parameter
    optional in `vk.xml` (internal merge request 3157).

New Extensions:

  * `<<VK_INTEL_performance_query>>`
  * `<<VK_INTEL_shader_integer_functions2>>`

-----------------------------------------------------

Change log for May 13, 2019 Vulkan 1.1.108 spec update:

  * Update release number to 108.

Internal Issues:

  * Clarify that only external resources can be bound to external memory in
    valid usage statements for flink:vkBindBufferMemory,
    flink:vkBindImageMemory, slink:VkSparseMemoryBind, and
    slink:VkSparseImageMemoryBind (internal issue 1496).
  * Move all `vk.xml`requirements for
    flink:vkGetDeviceGroupSurfacePresentModes2EXT into
    `<<VK_EXT_full_screen_exclusive>>` (internal issue 1622).
  * Add some missing valid usage statements for
    flink:vkCmdEndQueryIndexedEXT (internal issue 1638).
  * Specify rules for defining "`New Flags and Bitmask Types`" in that
    section of the style guide (internal issue 1649).
  * Add a comment to the `vk.xml` extension block for
    `VK_ANDROID_native_buffer` explaining why the extension is tagged
    `"disabled"` (internal issue 1657).
  * Fix typos in the description of slink:VkImageViewCreateInfo (internal
    issue 1661).
  * Modify valid usage statements for slink:VkImageViewCreateInfo to fix the
    description about the restriction for pname:baseArrayLayer and
    pname:layerCount from pname:extent.depth to the depth of mipmap level
    while creating a 2D array image view on a 3D image.
  * Forbid structures that contain opaque types (images or samplers) in the
    SPIR-V <<spirvenv-module-validation, Validation Rules within a Module>>
    section.
  * Minor editorial changes for the `VK_EXT_swapchain_colorspace` extension
    in the description of slink:VkColorSpace KHR and `vk.xml`, including:
  ** Consistently specify which function (OETF or Inverse-EOTF) is being
     defined;
  ** Remove the Display P3 EOTF, since no other EOTFs are defined;
  ** Include luminance range for the HLG OETF;
  ** Remove a duplicated paragraph; and,
  ** Rename ename:VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT, leaving the old
     ename:VK_COLOR_SPACE_DCI_P3_LINEAR_EXT token as an alias.

New Extensions:

  * `<<VK_NV_framebuffer_mixed_samples_coverage_reduction_mode>>`
  * `<<VK_KHR_uniform_buffer_standard_layout>>`

-----------------------------------------------------

Change log for April 16, 2019 Vulkan 1.1.107 spec update:

  * Update release number to 107.

Public Issues:

  * Fix revision date for the `<<VK_AMD_gpu_shader_half_float>>` appendix
    (public issue 617).
  * Make <<synchronization-pipeline-barriers-subpass-self-dependencies,
    subpass self-dependencies>> less restrictive (public issue 777).
  * Fix the `<<VK_EXT_full_screen_exclusive>>` dependency on
    `<<VK_KHR_win32_surface>>` in `vk.xml` (public pull request 849).
  * Remove single-page (`apispec.html`) refpage sub-targets from the
    Makefile `allman` target and the build instructions. The target is still
    present in the Makefile, but we have not been actively maintaining the
    single-page document and do not promise it will work. The full
    Specification and the individual API reference pages are what we support
    and publish at present (public issue 949).

Internal Issues:

  * De-duplicate common valid usage statements shared by multiple commands
    or structures by using Asciidoctor includes and dynamically assigning
    part of the valid usage ID based on which command or structure they're
    being applied to (internal issue 779).
  * Add reference pages for constructs not part of the formal API, such as
    platform calling convention macros, and script changes supporting them
    This required suppressing some check_spec_links warning classes in order
    to pass CI, until a more sophisticated fix can be done (internal issue
    888).
  * Change math notation for the elink:VkPrimitiveTopology descriptions to
    use short forms `v` and `p` instead of `vertex` and `primitive`,
    increasing legibility (internal issue 1611).
  * Rewrite generated file includes relative to a globally specified path,
    fixing some issues with refpage generation (internal issue 1630).
  * Update contributor list for `<<VK_EXT_calibrated_timestamps>>`.
  * Fix use of pathlin in `scripts/generator.py` so the script will work on
    Windows under Python 3.5 (internal merge request 3107).
  * Add missing conditionals around the
    <<descriptorsets-accelerationstructure, Acceleration Structure>>
    section (internal merge request 3108).
  * More script synchronization with OpenXR spec repository (internal merge
    request 3109).
  * Mark the `<<VK_AMD_gpu_shader_half_float>>` and
    `<<VK_AMD_gpu_shader_int16>>` extensions as deprecated in `vk.xml` and
    the corresponding extension appendices (internal merge request 3112).

New Extensions:

  * `<<VK_EXT_headless_surface>>`

-----------------------------------------------------

Change log for April 7, 2019 Vulkan 1.1.106 spec update:

  * Update release number to 106.

Public Issues:

  * Add searchbox and generate search index for the chunked HTML target.
    Note that doing this requires several new toolchain components to build
    the `chunked` target (public issue 578 / internal issue 1352).
  * Remove descriptions of flink:vkCreateSampler sampler constraints which
    were repeated in the valid usage statements (public pull request 648).
  * Fix sense of conditional around a valid usage statement in the
    <<copies>> chapter (public issue 942).

Internal Issues:

  * Add missing pname:extent.width and pname:extent.height valid usage
    statements for flink:vkCmdClearAttachments (internal issue 1583).
  * Fix some inconsistencies in structures and corresponding pname:sType
    enumerant names by renaming
    sname:VkPhysicalDeviceShaderDrawParameterFeatures ->
    slink:slink:VkPhysicalDeviceShaderDrawParametersFeatures;
    sname:VkPhysicalDeviceVariablePointerFeatures ->
    slink:VkPhysicalDeviceVariablePointerFeatures;
    sname:VkPhysicalDeviceVariablePointerFeaturesKHR ->
    slink:VkPhysicalDeviceVariablePointerFeaturesKHR;
    sname:VkPhysicalDeviceBufferAddressFeaturesEXT ->
    slink:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT;
    etext:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES
    ->
    ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES;
    etext:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES ->
    ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES;
    etext:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR ->
    ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR;
    and etext:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT
    ->
    ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT.
    The old names are still available as aliases for backwards
    compatibility. This change required introducing valid XML markup which
    externally written XML processing scripts may need to be modified to
    accommodate, to support multiple aliases of a single command or token
    name (internal issue 1592).
  * Add slink:VkDevice as the first parameter to flink:vkSetLocalDimmingAMD
    (internal issue 1618).
  * Improve CI header compilation tests to test all Vulkan platform
    includes, using fake platform headers where needed, and change the
    `allchecks` Makefile target to use the more comprehensive
    `check_spec_links.py` script instead of the retired `checkinc` and
    `checklinks` targets.
  * Move descriptions of the ASTC compressed texture decode mode from the
    <<appendix-compressedtex-astc,appendix>> to the recently updated
    external Khronos Data Format Specification.
  * Fix minor markup and spelling issues in the `VK_NV_ray_tracing`
    extension.

-----------------------------------------------------

Change log for March 19, 2019 Vulkan 1.1.105 spec update (GDC edition):

  * Update release number to 105.

Public Issues:

  * Fix contractions and other markup issues (public pull request 935).

New Extensions:

  * Google Games Platform
  ** New `ggp` platform and associated header file `vulkan_ggp.h`
  ** `VK_GGP_frame_token`
  ** `VK_GGP_stream_descriptor_surface`

-----------------------------------------------------

Change log for March 18, 2019 Vulkan 1.1.104 spec update:

  * Update release number to 104.

Public Issues:

  * Remove the incorrect line from "`Initial`" to "`Invalid`" state in the
    <<commandbuffer-lifecycle-diagram, Lifecycle of a command buffer>>
    diagram (public issue 881).
  * Add Fuchsia platform to <<boilerplate-wsi-header-table, Window System
    Extensions and Headers>> table (public pull request 933).
  * Change the type of
    slink:VkBufferDeviceAddressCreateInfoEXT::pname:deviceAddress from
    basetype:VkDeviceSize to basetype:VkDeviceAddress. These are both
    typedefs of code:uint64_t, so it is an ABI-compatible change (public
    issue 934).

Internal Issues:

  * Remove generated header files and update the CI tests to build a copy of
    the headers for use by the hpp-generate / hpp-compile CI stages. Targets
    to generate the headers will not be removed, but keeping these generated
    files in the repository increased the frequency of conflicts between
    branches when merging to master (internal issue 745).
  * Reword "`undefined: behavior if *action*" to "`must: not do *action*`"
    in the places the old terminology was used, and add a new
    <<writing-undefined, Describing Undefined Behavior>> section of the
    style guide to explain how to write such language in the future
    (internal issue 1579).
  * Move almost all Python scripts into the toplevel `scripts/` directory.
    Apply extensive internal edits to clean up and simplify the scripts, and
    try to follow PEP8 guidelines. Generalize the scripts with the use of a
    Conventions object controlling many aspects of output generation, to
    enable their use in other Khronos projects with similar requirements.
    Autogenerate extension interface refpages (these are experimental and
    may be retired going forward).

New Extensions:

  * `VK_AMD_display_native_hdr`
  * `VK_EXT_full_screen_exclusive` (internal issue 1439)
  * `VK_EXT_host_query_reset`
  * `VK_EXT_pipeline_creation_feedback` (internal issue 1560)
  * `VK_KHR_surface_protected_capabilities` (internal issue 1520)

-----------------------------------------------------

Change log for March 11, 2019 Vulkan 1.1.103 spec update:

  * Update release number to 103.

Public Issues:

  * Remove (unnecessary) scoped modification order case from the memory
    model <<memory-model-location-ordered, location-ordered>> definition
    (public pull request 924).
  * Add an <<memory-model-acyclicity, acyclicity>> axiom to the memory model
    (public pull request 927).

Internal Issues:

  * Fix reversed logic of slink:VkFormatProperties discussion of multi-plane
    formats and ename:VK_FORMAT_FEATURE_DISJOINT_BIT (internal issue 1493).
  * Clarify how slink:VkImageStencilUsageCreateInfoEXT works, including new
    valid usage statements for flink:vkCmdClearDepthStencilImage, and the
    <<copies, Common Operation>> section of the Copy Commands chapter
    (internal issue 1565).
  * Update <<spirvenv-precision-operation, Precision and Operation of SPIR-V
    Instructions>> section to require that denorms be preserved by several
    instructions that don't perform any mathematical operations (internal
    issue 1584).
  * Remove duplicate valid usage statement from flink:vkAcquireNextImageKHR
    (internal merge request 3062).

-----------------------------------------------------

Change log for March 3, 2019 Vulkan 1.1.102 spec update:

  * Update release number to 102.

Public Issues:

  * Simplify flink:vkGetImageMemoryRequirements constraint for
    ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT (public pull request 817).
  * Fix typo in markup of the <<textures-texel-coordinate-systems-diagrams,
    Texel Coordinate Systems, Corner Sampling>> image that was generating
    complaints from chunked HTML output generation (public pull request
    928).

Internal Issues:

  * Split the old <<features, Features>> chapter into four chapters:
    <<features, Features>>, <<limits, Limits>>, <<formats, Formats>>, and
    <<capabilities, Capabilities>>, with minor edits to the introductory
    paragraph of each chapter. Anchor names in these chapters were changed,
    with corresponding effects to xrefs to these anchors elsewhere in spec
    markup . The purpose is to make the chunked HTML spec output load faster
    on what was previously a single, gigantic chapter (internal issue 1554).
  * Add ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV, to the supported
    pipeline stages for ename:VK_ACCESS_UNIFORM_READ,
    ename:VK_ACCESS_SHADER_READ, and ename:VK_ACCESS_SHADER_WRITE in the
    <<synchronization-access-types-supported>> table.
  * Correct legal name of Google, LLC in vk.xml <tags> section and a
    copyright statement.
  * Clarify that Vulkan treats the Android
    code:AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM format as RGBA, and the
    application is responsible for forcing the X/A component to be read as
    1.0, in the <<memory-external-android-hardware-buffer-formats>> table.
  * Clarify the vertex order of various primitive topologies, and define the
    order of transform feedback vertex capture based on that. This involves
    a lot of refactoring and cleanup in the <<drawing-primitive-topologies,
    Primitive Topologies>>, <<geometry-input, Geometry Shader Input
    Primitives>> sections, and <<vertexpostproc-transform-feedback Transform
    Feedback>> sections, and numerous places in the <<tessellation>>
    chapter,

New Extensions:

  * `VK_EXT_metal_surface`
  * `VK_EXT_ycbcr_image_arrays` (internal issue 1361).
  * `VK_NVX_image_view_handle`

-----------------------------------------------------

Change log for February 17, 2019 Vulkan 1.1.101 spec update:

  * Update release number to 101.

Public Issues:

  * Make clear that memory types for imported host memory must be host
    visible in slink:VkMemoryHostPointerPropertiesEXT.txt (public issue
    897).
  * Make <<interfaces-resources-layout, WARNING block>> into a NOTE block,
    per the styleguide (public pull request 916).

Internal Issues:

  * Make <<textures-output-format-conversion, computation of derivatives in
    non-uniform flow control>> have undefined behavior (internal issue
    1367).
  * Make behavior, not just values, undefined for
    <<textures-layout-validation, reads from inconsistent YCbCr layouts>>
    (internal issue 1366).
  * Consolidate version and extension behavior documentation in the
    <<extended-functionality, Extended Functionality>> appendix, While a
    great deal of text was moved from other parts of the Specification into
    the appendix, this just serves to simplify and make consistent
    discussions of versions and extensions (internal issue 1473).
  * Add limits for slink:VkPhysicalDeviceRayTracingPropertiesNV in the
    <<features-limits-types, Required Limit Types>> and
    <<features-limits-required, Required Limits>> tables (internal issue
    1511).
  * Disallow <<memory-protected-memory, indirect calls within protected
    command buffers>> by adding valid usage statements for the related
    indirect dispatch and draw commands (internal issue 1513).
  * Add valid usage stataements to slink:VkGraphicsPipelineCreateInfo,
    slink:VkSubpassDescription, slink:VkSubpassDescription2KHR,
    slink:VkSubpassDescriptionDepthStencilResolveKHR, and
    slink:VkImageViewCreateInfo preventing the creation of a renderpass with
    attachments in formats that are not supported for rendering (internal
    issue 1552).
  * Qualify valid usage statements for
    slink:VkAttachmentReference::pname:layout parameter so restrictions only
    apply if an attachment is ename:VK_ATTACHMENT_UNUSED (internal issue
    1561).
  * Add valid usage statement for flink:vkCmdDrawIndirectByteCountEXT
    restricting pname:vertexStride to be positive (internal issue 1566).
  * Make the `VK_EXT_sample_locations` extension depend on
    `VK_KHR_get_physical_device_properties2` in `vk.xml`.
  * Rearrange and simplify the <<interfaces-resources-layout, block layout
    rules>>.

New Extensions:

  * `VK_NV_cooperative_matrix`
  * `VK_EXT_depth_clip_enable` (internal issue 1485).

-----------------------------------------------------

Change log for February 10, 2019 Vulkan 1.1.100 spec update:

  * Update release number to 100.

Public Issues:

  * Clarify that scoped modification order only relates to
    <<memory-model-atomic-operation, atomic writes>> (public pull request
    906).
  * Remove `readme.txt` reference from `xml/README.adoc` (public pull
    request 907).
  * Add missing slink:VkShaderResourceUsageAMD to the <<VK_AMD_shader_info>>
    appendix (public pull request 908).
  * Fix markup for <<VK_EXT_filter_cubic>> appendix (public pull request
    911).
  * Fix typo "`attachment`" (public pull request 914).
  * Alias the enums for `VK_IMG_filter_cubic` properly to the corresponding
    `VK_EXT_filter_cubic` enums, so they appear in the corresponding
    enumerated types, instead of as #defines (Vulkan-Headers issue 40).

Internal Issues:

  * Remove nested conditionals in valid usage statements for
    slink:VkFramebufferCreateInfo and flink:vkCmdPipelineBarrier by
    duplicating statements along ifdef/ifndef paths for
    VK_KHR_depth_stencil_resolve (internal issue 1527).
  * Clarify allowed values of <<spirv-precision-operation, SPIR-V operations
    near infinity>>. For very large results of operations the allowed range
    of return values as defined in the spec didn't include the largest
    finite number. In some rounding modes (eg. RTZ) the largest finite
    number is the correctly rounded result, so it should be allowed.
  * Require descriptor types to match in slink:VkCopyDescriptorSet.

-----------------------------------------------------

Change log for February 3, 2019 Vulkan 1.1.99 spec update:

  * Update release number to 99.

Public Issues:

  * Add missing pname:pMemoryHostPointerProperties description to
    flink:vkGetMemoryHostPointerPropertiesEXT.txt (public pull request 896).
  * Minor markup fixes (public pull request 900).
  * Minor update to `khronos.css` and markup fixes (originally proposed in
    public pull request 901, but done via an internal MR).

Internal Issues:

  * Document restrictions on image queries for {YCbCr} formats in the
    <<formats-requiring-sampler-ycbcr-conversion>> table as well as
    for slink:sname:VkImageFormatProperties and slink:VkImageCreateInfo
    (internal issue 1361).
  * Correct type of the code:FragSizeEXT built-in in the
    <<interfaces-builtin-variables, Built-In Variables>> section (internal
    issue 1526).
  * Clean up math in the <<textures, Image Operations>> chapter by
    refactoring, using better naming conventions, updating diagrams to use
    the correct orientation, etc. (internal merge request 2968).
  * Fix minor typos for slink:VkImageCreateInfo and
    slink:VkImageStencilUsageCreateInfoEXT.
  * Add missing documentation for tlink:VkResolveModeFlagsKHR.
  * Fix extension dependency of pname:scalarBlockLayout in the
    <<features-features-requirements, Feature Requirements>> section.
  * Fix indexing math for shader binding table calculations in the
    <<shader-binding-table-indexing-rules, Indexing Rules>> section, and use
    spelling "`any-hit`" consistently.
  * Reconcile valid usage statement and text for sampled image layouts in
    slink:VkWriteDescriptorSet
    (https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/551).
  * Make SPIR-V code:OpConvertUToPtr and code:OpConvertPtrToU operations
    require a 64-bit integer for physical storage buffer pointers in the
    <<spirvenv-module-validation, Validation Rules within a Module>>
    section.
  * Update to KaTeX 10.0.

New Extensions:

  * `VK_EXT_filter_cubic`
  * `VK_NV_dedicated_allocation_image_aliasing`

-----------------------------------------------------

Change log for January 13, 2019 Vulkan 1.1.98 spec update:

  * Update release number to 98.

Public Issues:

  * Fix missing markup in flink:vkDestroyPipelineLayout valid usage
    statement (pull request 882).
  * Add missing contributors for `<<VK_EXT_buffer_device_address>>` (public
    pull request 891).

Internal Issues:

  * Detect nested bullet points in valid usage blocks and warn about them
    during VUID assignment (internal issue 1382).
  * Update the style guide to document the process for reserving new bits in
    bitmask types (internal issue 1411).
  * Clarify for slink:VkApplicationInfo::pname:apiVersion and in the
    <<fundamentals-validusage-versions, Valid Usage for Newer Core
    Versions>> section when it is valid for an application to use a certain
    version of Vulkan API functionality (for an instance and for a
    device/physical device); and when the validation layers must generate an
    error (internal issue 1412).
  * Add optional <<memory-model-availability-visibility, transitive
    availability/visibility operations to the memory model, including a new
    pname:vulkanMemoryModelAvailabilityVisibilityChains feature for
    slink:VkPhysicalDeviceVulkanMemoryModelFeaturesKHR (internal issue
    1460).
  * Add the code:StorageBuffer storage class to those in the
    <<interfaces-resources-descset, Descriptor Set Interface>> (internal
    issue 1480).
  * Add missing `returnedonly` tags for a number of returned extension
    structures that can be passed in pname:pNext chains (internal issue
    1515).
  * Clean up and rearrange some spec language for
    slink:VkRenderPassCreateInfo and slink:VkAttachmentReference.txt
    (internal issue 1522).
  * Correctly round the code:OpVectorTimesScalar and
    code:OpMatrixTimesScalar SPIR-V operations in the <<Precision of core
    SPIR-V Instructions>> table (internal merge request 2996).
  * Work around cases in flink:vkCmdBeginTransformFeedbackEXT,
    flink:vkCmdEndTransformFeedbackEXT, and
    slink:VkPipelineCoverageModulationStateCreateInfoNV where an array
    parameter is `optional` but the length is not in `vk.xml`. This is an
    interim fix using `noautovalidity` + handcoded VU replacing those that
    should be autogenerated (internal issue 2944 and
    https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/480).
  * Remove redundant capability validation of the code:float16 and code:int8
    SPIR-V capabilities from the <<spirvenv-capabilities, Capabilities>>
    section, since they are already covered in the preceding table.
  * Update check_spec_links script, including validation for reference page
    open blocks. Fix errors identified by the script.

-----------------------------------------------------

Change log for January 05, 2019 Vulkan 1.1.97 spec update:

  * Update release number to 97.

Public Issues:

  * Add a special case to the <<renderpass-compatibility, Render Pass
    Compatibility>> rules allowing single-subpass renderpasses to be
    compatible even if they have different resolve attachment references
    (public issue 835).
  * Fix the miss shader binding table record address rule in the
    <<shader-binding-table-indexing-rules, Miss Shaders>> section to index
    by code:missIndex, not code:sbtOffset (public issue 875).

Internal Issues:

  * Add a missing anchor to the elink:VkSamplerCreateFlagBits language
    (internal issue 1483).
  * Add missing implicit valid usage include for slink:VkHdrMetadataEXT and
    corresponding `noautovalidity` attributes in `vk.xml` for the
    externally-defined metadata properties (internal issue 1514).
  * Remove restrictions on the `mask` parameter of SPIR-V's
    code:OpGroupNonUniformXor in the <<spirvenv-module-validation,
    Validation Rules within a Module>> appendix (internal merge request
    2971).
  * Restore `noautovalidity` attribute for
    slink:VkPipelineViewportWScalingStateCreateInfoNV::pname:pViewportWScalings
    in `vk.xml` (internal merge request 2975).
  * Update copyright dates on Khronos-copyrighted files to 2019 (internal
    merge request 2980).

New Extensions:

  * `VK_KHR_depth_stencil_resolve`
  * `VK_EXT_buffer_device_address`
  * `VK_EXT_memory_budget`
  * `VK_EXT_memory_priority`
  * `VK_EXT_validation_features`

-----------------------------------------------------

Change log for December 16, 2018 Vulkan 1.1.96 spec update:

  * Update release number to 96.

Public Issues:

  * Fix typo in `vk.xml` for `structextends` attribute of
    slink:VkPhysicalDeviceShadingRateImagePropertiesNV (public PR 870).
  * Fix links in optimized PDF output (public PR 879).

Internal Issues:

  * Add a link to GitHub contributors in the <<credits, Other Credits>>
    section (internal issue 808).
  * Clarify the behavior of command aliases described in the <<versions,
    Core Revisions>> and <<initialization-functionpointers, Command Function
    Pointers>> sections and the registry schema document with respect to
    whether they are or are not the same entry point, and what the behaviour
    of the ftext:vkGet*ProcAddr commands is for each alias (internal issue
    1462).
  * Update slink:VkPipelineShaderStageCreateInfo valid usage statements for
    writing to code:Layer and code:viewportIndex to apply to any vertex
    processing stage (internal issue 1475).
  * Make sparse image creation optional for {YCbCr} formats in the
    <<features-required-format-support, Required Format Support>> section
    and the <<formats-requiring-sampler-ycbcr-conversion, Formats
    requiring sampler {YCbCr} conversion for
    ename:VK_IMAGE_ASPECT_COLOR_BIT image views>> table (internal issue
    1476).
  * Modify the valid usage statement for
    flink:vkCmdDrawIndirectByteCountEXT::pname:vertexStride to use the
    pname:maxTransformFeedbackBufferDataStride limit rather than the
    pname:maxVertexInputBindingStride limit, which is a better match for
    transform feedback related operations (internal issue 1487).
  * Changed all members of slink:VkPhysicalDevicePCIBusInfoPropertiesEXT to
    have the `uint32_t` type. This is an incompatible change to an EXT
    that was released very recently; although this is against usual Vulkan WG
    policy, we discussed and consider this an acceptable risk, but have
    polled the mesa-dev list in case there are use cases we missed (internal
    issue 1492).
  * Set spec vetsion to 1 for `VK_GOOGLE_hlsl_functionality1` and
    `VK_GOOGLE_decorate_string` in `vk.xml` (internal MR 2948).
  * Remove redundant valid usage statement `VkImageCreateInfo-pNext-02395`
    (internal MR 2950).
  * Add `check_spec_links.py` script, use it in Gitlab CI, and fix many
    minor markup issues discovered by the script (internal MR 2955).
  * Update `BUILD.md` to the current Ruby version (2.5.3), and make some
    corresponding updates to per-platform build instructions (internal MR
    2956).
  * Fix binding numbers and other details in
    flink:vkUpdateDescriptorSetWithTemplate.txt example code blocks
    (internal MR 2960).
  * Remove some nautovalidity="true" in `vk.xml` for NV extensions where
    it is clearly wrong (internal MR 2970).

-----------------------------------------------------

Change log for December 3, 2018 Vulkan 1.1.95 spec update:

  * Update release number to 95.

Public Issues:

  * Fix valid usage and XML issues found in public issues 789 and 790 for
    the `VK_EXT_debug_utils` extension (public pull request 794).
  * Replace references to `VK_NV_dedicated_allocation` with links to the
    corresponding slink:slink:VkMemoryDedicatedRequirements and
    slink:slink:VkMemoryDedicatedAllocateInfo structures in the description
    of elink:VkExternalMemoryFeatureFlagBits (public issue 801).
  * Fix miscellaneous minor markup and spelling issues in
    `VK_NV_ray_tracing` extension (public pull request 860).
  * Remove "returnedonly" from XML for
    slink:VkPhysicalDeviceInlineUniformBlockFeaturesEXT and
    slink:VkPhysicalDeviceVulkanMemoryModelFeaturesKHR (public issue 862).

Internal Issues:

  * Add to the description of the
    <<features-limits-maxComputeSharedMemorySize,
    pname:maxCompureSharedMemorySize>> feature to state the shared variables
    should be packed at least as tightly as std430 (internal issue 1386).
  * Fix and clarify various references to image and image view usage in
    flink:vkCmdBindShadingRateImageNV, flink:vkCmdBeginRenderPass, and
    slink:VkImageStencilUsageCreateInfoEXT (internal issue 1432).
  * Require that the slink:VkImage mipmap chain match the Android hardware
    buffer mipmap chain for slink:VkMemoryAllocateInfo (internal issue
    1479).
  * Fix the definition of slink:VkSwapchainCreateInfoKHR valid usage
    statement 01778 (Vulkan-ValidationLayers!15)
  * Fix descriptions of <<interfaces-builtin-variables-launchid,
    code:LaunchIDNV>> and <<interfaces-builtin-variables-launchsize,
    code:LaunchSizeNV>> to code:uvec3.

New Extensions:

  * `VK_KHR_shader_float16_int8`
  * `VK_KHR_shader_float_controls`

-----------------------------------------------------

Change log for November 25, 2018 Vulkan 1.1.94 spec update:

  * Update release number to 94.

Public Issues:

  * Use the terms "`texel block`" and "`texel block size`" instead of "`data
    element`" and "`element size`", and define "`element`" as an array slot.
    In addition to the terminology changes, retitled the <<texel-block-size,
    Representation and Texel Block Size>> section and added texel block size
    / no. of texels/block information to the
    <<features-formats-compatibility, Compatible Formats>> table. There is
    some additional work underway to make sure the compatibility language
    makes sense for all of uncompressed, compressed, and multiplanar formats
    (public issue 763).
  * Cleanup `VK_NV_ray_tracing` language (public issues 858, 859).

Internal Issues:

  * Specify in <<shaders-invocationgroups, Invocation and Derivative
    Groups>> and <<textures-output-format-conversion, Texel Output Format
    Conversion>> that derivative groups are quads when code:SubgroupSize >=
    4 (internal issue 1390).
  * Make the type of slink:VkDescriptorUpdateTemplateCreateInfo::pname:pNext
    `const` following pattern for the other stext:Vk*CreateInfo structures
    (internal issue 1459).
  * Specify that flink:vkCmdClearAttachments executes as a drawing command,
    rather than a transfer command (internal issue 1463).
  * Update `VK_NV_ray_tracing` to use code:InstanceId instead of
    code:InstanceIndex.

New Extensions:

  * `VK_KHR_swapchain_mutable_format`
  * `VK_EXT_fragment_density_map`

-----------------------------------------------------

Change log for November 18, 2018 Vulkan 1.1.93 spec update:

  * Update release number to 93.

Public Issues:

  * Add spec language for ename:VK_INDEX_TYPE_NONE_NV and fix up
    slink:VkAccelerationStructureTypeNV (public issue 848).
  * Add missing suffix in description of slink:VkSubpassDescription2KHR
    parameters (public pull request 851).
  * Fix miscellaneous typos (public pull request 855).
  * Add driver ID for Pastel (public pull request 856).
  * Add missing include directive for slink:VkMemoryWin32HandlePropertiesKHR
    implicit valid usage statements (public pull request 857).

Internal Issues:

  * Restrict the storage classes permitted for SPIR-V atomics to what is
    actually supported, in the <<spirvenv-module-validation, Validation
    Rules within a Module>> section (internal issue 1123).
  * Add a missing Valid Usage statement to slink:VkRenderPassCreateInfo for
    the case pname:stencilLoadOp == ename:VK_LOAD_OP_CLEAR, pname:layout ==
    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL (internal issue
    1408).
  * Modify optimize-pdf script and Makefile to retain non-optimized original
    PDF on errors (internal issue 1435).
  * Add <<spirvenv-module-validation, SPIR-V validation rules>> stating that
    only the listed code:BuiltIn decorations are permitted, and only when
    relevante features and extensions are enabled (internal issue 1449).
  * Remove some duplicated Valid Usage IDs created via cut & paste error
    (internal issue 1455).
  * Build HTML output for extension reference pages (internal issue 1461).
  ** Improve genRef.py handling of aliases defined inside other refpages.
  ** Emit aliases in pygenerator.py.
  ** Add XML noautovalidity flag for VkRenderPassCreateFlags until there
     are some corresponding FlagBits defined.
  ** Corrected types= attribute on some refpage blocks to 'flags'
  ** Added refpage blocks for some missing types detected by CI tests.
  * Fixed many Valid Usage statement issues in slink:VkRenderPassCreateInfo,
    slink:VkSubpassDescription, slink:VkSubpassDescription2KHR,
    slink:VkSubpassDependency2KHR, flink:vkCmdBeginRenderPass,
    flink:vkCmdBeginRenderPass2KHR, and slink:VkRenderPassBeginInfo
    discovered while adding `VK_KHR_create_renderpass2` to the validation
    layers.

New Extensions:

  * `VK_EXT_scalar_block_layout`
  * `VK_EXT_separate_stencil_usage`

-----------------------------------------------------

Change log for November 12, 2018 Vulkan 1.1.92 spec update:

  * Update release number to 92.

Public Issues:

  * Move and modify valid usage statements dealing with pname:aspectMask in
    flink:vkCmdClearColorImage, flink:vkCmdClearDepthStencilImage, and
    slink:VkClearAttachment, so they are in places where all necessary
    information is available (public issue 529).
  * Fix math markup in <<textures-texel-anisotropic-filtering, Texel
    Anisotropic Filtering>> (public pull request 840).
  * Fix misspellings (public pull request 845).

Internal Issues:

  * Add installation instructions and a Makefile "`chunked`" target for
    chunked HTML generation (internal issue 1352).
  * Fix pipeline mesh diagram style; also fix a minor bug in the classic
    pipeline diagram where vertex/index buffers wrongly fed into the vertex
    shader (internal issue 1436).
  * Make Asciidoctor ERROR output raise an error, and don't suppress
    executed command output from CI make invocation (internal issue 1454).
  * Minor typo fixes and clarifications for `VK_NV_raytracing`.
  * Cleanup extension-specific properties
  ** Remove duplicated documentation for pname:maxDiscardRectangles,
     pname:pointClippingBehavior, and pname:maxVertexAttribDivisor (they
     shouldn't be documented with the other members of
     slink:VkPhysicalDeviceLimits at all).
  ** Remove duplicate anchor for pname:maxVertexAttribDivisor
  ** Consistently document stext:VkPhysicalDevice<Extension>PropertiesKHR
  *** Always document pname:sType/pname:pNext (was inconsistent before)
  *** Always mention chaining to slink:VkPhysicalDeviceProperties2 (and not
      as slink:VkPhysicalDeviceProperties2KHR)
  *** Always include Valid Usage statements last
  * Update Makefile 'checklinks' target and associated scripts, and fix
    markup problems identified by checkLinks.py, so that we can rely on the
    checklinks script as part of Gitlab CI.

-----------------------------------------------------

Change log for November 4, 2018 Vulkan 1.1.91 spec update:

  * Update release number to 91.

Public Issues:

  * Update Ubuntu subsystem build instructions in `BUILD.adoc` (public pull
    request 624).
  * Delete the `VK_KHR_mir_surface` extension from the Specification and
    XML, due to EOL of the only driver known to have supported it, and
    near-EOL of Mir itself (public issue 814).
  * Fix options for some figures that were using old ones (public pull
    request 841).
  * Fix various accidentally repeated words (public pull request 843).
  * Use `time.process_time()`, introduced in Python 3.3, in the scripts
    instead of `time.clock()`, which will be removed in Python 3.8 (public
    pull request 844).

Internal Issues:

  * Update valid usage statements for
    `VK_ANDROID_external_memory_android_hardware_buffer` in
    slink:VkMemoryAllocateInfo,
    slink:VkImportAndroidHardwareBufferInfoANDROID, and
    flink:vkGetAndroidHardwareBufferPropertiesANDROID to actually be
    verifiable (internal issue 1419).
  * Update valid usage statements for
    `VK_ANDROID_external_memory_android_hardware_buffer` in
    slink:VkMemoryAllocateInfo, slink:VkImageCreateInfo, and
    slink:VkImageViewCreateInfo to move valid usage statements in
    doubly-nested bullet points up one level, accommodating limitations of
    the valid usage extraction script that creates `validusage.json`
    (internal issue 1434).
  * Fix typo etext:VK_ACCESS_SHADING_RATE_IMAGE_BIT_NV to the correct
    ename:VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV.
  * Add missing etext:VK_STRUCTURE_TYPE_* tokens to appendices for
    extensions missing them.

New Extensions:

  * `VK_AMD_memory_overallocation_behavior`
  * `VK_NV_ray_tracing`, replacing `VK_NVX_raytracing`

-----------------------------------------------------

Change log for October 28, 2018 Vulkan 1.1.90 spec update:

  * Update release number to 90.

Public Issues:

  * Tag flink:vkQueueWaitIdle as `externsync` in `vk.xml` (public pull
    request 815).
  * Update README (public pull request 834).
  * `VK_NV_framebuffer_mixed_samples` and `VK_AMD_mixed_attachment_samples`
    had confusing and contradictory valid usage statements when read in the
    all-extensions spec build. Change them to explicitly mention which
    extension each is for (public issue Vulkan-ValidationLayers/issues/353).

Internal Issues:

  * Update `COPYING.md` to clarify how externally generated Vulkan
    Specifications (for translations, annotations, or other reasons) must be
    copyrighted, and acknowledge the Exception Clause on the `vk.xml`
    license (internal issue 1079).
  * Specify that flink:vkGetPhysicalDeviceImageFormatProperties may: return
    pname:maxMipLevels 1 if the format is ycbcr (internal issue 1361).
  * Clarify previously underspecified language for
    flink:vkCmdPushConstants::pname:pStageFlags regarding use of push
    constants across multiple pipelines (internal issue 1403).
  * Fix typo in XML/headers for
    ename:VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT,
    which was previously
    etext:VK_STRUCTURE_TYPE_IMAGE_EXCPLICIT_DRM_FORMAT_MODIFIER_CREATE_INFO_EXT
    (internal issue 1428).
  * Fix markup of equations that were sporadically breaking the
    `optimize-pdf` step of PDF generation, due (apparently) to inconsistent
    treatment of unwrapped multicharacter terms by different LaTeX parsers
    (internal issue 1435).
  * For the <<memory-model-synchronizes-with synchronizes-with>> memory
    model relation cases involving a release barrier plus relaxed atomic
    write, treat the atomic as if it were a release atomic and allow the
    acquire side to read from its hypothetical release sequence. This is
    more consistent with how C++ defines synchronization for release fences
    (internal issue cross-api/memory-model#72).
  * Minor editorial changes to the <<memory-model, memory model>> appendix
    based on external feedback.

-----------------------------------------------------

Change log for October 21, 2018 Vulkan 1.1.89 spec update:

  * Update release number to 89.

Public Issues:

  * Clarify the reference to <<features-limits-mipmapPrecisionBits, mipmap
    precision bits>> in the <<textures-image-level-selection, Image Level(s)
    Selection>> section (public issue 660).
  * Update <<debugging-object-types,VkObjectType and Vulkan Handle
    Relationship>> table with missing types (public pull request 820).
  * Miscellaneous minor markup cleanup (public pull request 822).
  * Fix copy/paste bugs in the description of how implicit
    availability/visibility operations for atomics/barriers are ordered in
    the <<memory-model-availability-visibility-semantics, Availability and
    Visibility Semantics>> section (public issue 823).
  * Add ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV bit missing from
    the mesh shading list of the <<synchronization-pipeline-graphics,
    graphics pipeline>> (public issue 824).

Internal Issues:

  * Clarify that only statically used members of a push constant block need
    to be in the push constant range, and stop referring to block members as
    "`variables`" in the <<interfaces-resources-pushconst, Push Constant
    Interface>> section. This is related to
    https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/340
    (internal issue 1401).
  * Clarify interaction between flink:vkCmdSetDeviceMask and render pass
    control commands in the slink:VkDeviceGroupRenderPassBeginInfo section
    (internal issue 1416).
  * Miscellaneous minor markup cleanup.
  * Remove types defined by `"disabled"` extensions from
    validextensionstructs in the XML processing scripts, so downstream code
    generators don't emit them.

-----------------------------------------------------

Change log for October 13, 2018 Vulkan 1.1.88 spec update:

  * Update release number to 88.

Public Issues:

  * Make clear that
    tname:PFN_vkDebugUtilsMessengerCallbackEXT::pname:messageTypes is a
    bitmask, and correct a typo in the spelling of
    slink:VkDebugUtilsMessengerCreateInfoEXT.txt::pname:messageType (public
    pull request 800).
  * Make an ABI-compatible change of the type of
    slink:VkPhysicalDeviceDriverPropertiesKHR::pname:driverID to use the new
    elink:VkDriverIdKHR type (public issue 811).

Internal Issues:

  * Clarify for the <<features-features-shaderStorageImageExtendedFormats>>
    feature and in the <<spirvenv-capabilities-table>> that the feature
    means that all of the formats are supported, and that otherwise the
    features can be queried per-format (internal issue 1273).
  * Clarified interactions of `VK_EXT_external_memory_host` with host cache
    management commands and structures flink:vkMapMemory,
    flink:vkFlushMappedMemoryRanges, slink:VkMappedMemoryRange, and
    flink:vkUnmapMemory using the new glossary term "`Host Mapped Device
    Memory`" (internal issue 1385).
  * Update the language for flink:vkCreateViSurfaceNN.txt describing the
    pname:currentExtent of a VI surface to more accurately reflect current
    capabilities, replacing "`undefined`" with more explicit behavior
    (internal issue 1410).

New Extensions:

  * `VK_EXT_calibrated_timestamps`
  * `VK_EXT_image_drm_format_modifier` (this extension was previously
    disabled in vk.xml, and has now been enabled after some changes to fix
    performance issues).
  * `VK_EXT_pci_bus_info`
  * `VK_EXT_transform_feedback`
  * `VK_GOOGLE_hlsl_functionality1`, exposing support for
    `SPV_GOOGLE_hlsl_functionality1`.
  * `VK_GOOGLE_decorate_string`, exposing support for
    `SPV_GOOGLE_decorate_string`.

-----------------------------------------------------

Change log for October 7, 2018 Vulkan 1.1.87 spec update:

  * Update release number to 87.

Public Issues:

  * Merge flink:vkCmdPipelineBarrier self-dependency barrier VUs referring
    to the same subpass dependency (public pull request 756).
  * Describe default value of `"optional"` attribute in the registry schema
    document (public issue 769)
  * Fix links in <<VK_NVX_raytracing>> extension (public pull request 805).
  * Mark the <<VK_KHR_mir_surface>> extension obsolete (public issue 814).
  * Fix missing endif in Image Creation block (public issue 817).

Internal Issues:

  * Clarify that the compressed texture formats corresponding to
    <<features-features-textureCompressionETC2>>,
    <<features-features-textureCompressionASTC_LDR>>, and
    <<features-features-textureCompressionBC>> is not contingent on the
    feature bits, and may be supported even if the features are not enabled
    (internal issue 663).
  * Clarify that code:FragStencilRefEXT is output only in the
    <<interfaces-builtin-variables, Built-In Variables>> section (internal
    issue 1173).
  * Identify and correct many overly-aggressive uses of "`undefined`", and
    narrow them down, where straightforward to do so. Mark such resolved
    uses of "`undefined`" with the custom undefined: macro. Add a new
    <<writing-undefined, Describing Undefined Behavior>> section (internal
    issue 1267).
  * Don't require code:inline_uniform_block descriptors to be populated
    before use in the flink:vkAllocateDescriptorSets section (internal issue
    1380).
  * Allow suppressing inline SVG images by controlling this with an
    attribute set in the Makefile, rather than the explicit [%inline]
    directive (internal issue 1391).
  * Mark 'Khronos' as a registered trademark in several places, now that it
    is one.
  * Fix typo in the <<VK_KHR_shader_atomic_int64>> appendix using the GLSL
    naming of the compare exchange op when referring to the SPIR-V op.
  * Specify in the flink:vkGetPhysicalDeviceQueueFamilyProperties section
    that all implementations must support at least one queue family, and
    that every queue family must contain at least one queue.
  * Make slink:VkPipelineDynamicStateCreateInfo::pname:dynamicStateCount,
    slink:VkSampleLocationsInfoEXT::pname:sampleLocationsPerPixel, and
    slink:VkSampleLocationsInfoEXT::pname:sampleLocationsCount optional, to
    fix bogus implicit valid usage checks that were causing failures in the
    conformance tests.
  * Fix vendor tag in reserved extension 237 constants. Does not affect
    anything since it is just a placeholder, but this should avoid further
    comments.
  * Minor markup fixes in some extension appendices.

New Extensions:

  * `<<VK_FUCHSIA_imagepipe_surface>>`

-----------------------------------------------------

Change log for September 29, 2018 Vulkan 1.1.86 spec update:

  * Update release number to 86.

Internal Issues:

  * Add new <<resources-image-creation-limits, Image Creation Limits>>
    section and reference that from valid usage statements, reducing
    combinatorial complexity of extension-dependent VUs. Also fixes some
    underspecified limits (such as pname:maxMipLevels) in the VUs for
    slink:VkImageCreateInfo when
    slink:VkExternalMemoryImageCreateInfo::pname:externalMemoryHandles
    contains multiple bits, and fixes incorrectly (and underspecified)
    limits when an Android external format is used (internal issue 1370).
  * Remove unused "`Fragment Area Granularity`" glossary entry accidentally
    introduced in the 1.1.85 update.

New Extensions:

  * `VK_KHR_driver_properties`
  * `VK_KHR_shader_atomic_int64`
  * The specification sources contain text for another extension,
    `VK_EXT_image_drm_format_modifier`, but this extension is not yet
    complete, and is marked disabled in `vk.xml`. The extension will be
    enabled, and become part of the spec, only when the authors decide it is
    ready.

-----------------------------------------------------

Change log for September 19, 2018 Vulkan 1.1.85 spec update:

  * Update release number to 85.

Public Issues:

  * Add self-dependency ename:VK_DEPENDENCY_BY_REGION_BIT valid usage
    statements for slink:VkSubpassDependency(public pull request 778).
  * Apply fix from pull request 742 to slink:VkSubpassDependency and
    slink:VkSubpassDependency2 (public pull request 779).
  * Specify the units of slink:VkBufferImageCopy::pname:bufferRowLength and
    pname:bufferImageHeight as texels (public pull request 781).
  * Better specify promoted parameter mapping in the
    `<<VK_KHR_create_renderpass2>>` appendix (public pull request 782).

Internal Issues:

  * Only include the <<fundamentals-validusage-versions, Valid Usage for
    Newer Core Versions>> section in Vulkan 1.1 or later (internal issue
    1381).

Other Issues:

  * Clean up redundant valid usage language for the
    `VK_ANDROID_external_memory_android_hardware_buffer` extension
    interaction with slink:VkImageCreateInfo.
  * Fix error in a flag name within valid usage statements for
    slink:VkMemoryAllocateInfo.
  * Clarify that memory types are not totally ordered in
    slink:VkPhysicalDeviceMemoryProperties.
  * For slink:VkWriteDescriptorSetInlineUniformBlockEXT, set
    structextends="VkWriteDescriptorSet" in `vk.xml`, and make
    slink:VkDescriptorSetLayoutBindingFlagsCreateInfoEXT::pname:pBindingFlags
    optional.
  * Add documentation of 'provisional' XML attribute to registry.txt.

New Extensions:

  * `VK_NV_compute_shader_derivatives`
  * `VK_NV_corner_sampled_image`
  * `VK_NV_fragment_shader_barycentric`
  * `VK_NV_mesh_shader`
  * `VK_NV_representative_fragment_test`
  * `VK_NV_scissor_exclusive`
  * `VK_NV_shader_image_footprint`
  * `VK_NV_shading_rate_image`
  * `VK_NVX_raytracing`

-----------------------------------------------------

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.

Public Issues:

  * Use [%inline] directive for all SVGs to reduce file size (public pull
    request 734).
  * Convert XML `value` aliases into <alias> tags (public pull request
    747).
  * Fix metadoc script showing non-selected extensions (public pull request
    748).
  * Reapply public pull request 742 to make
    ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT part of the
    graphices pipeline (public pull request 749).
  * Fix numerous typos related to accidental duplication of words (public
    pull request 760).
  * Fix `vk.xml` contact typos (public pull request 761).


Internal Issues:

  * Add images to the <<Standard sample locations>> table (internal issue
    1115).
  * Add a definition of "`Inherited from`" precision in the
    <<spirvenv-precision-operation, Precision and Operation of SPIR-V
    Instructions>> section (internal issue 1314).
  * Clarify that both built-in and user-defined variables count against the
    location limits for shader interfaces in the
    <<interfaces-iointerfaces-locations, Location Assignment>> section
    (internal issue 1316).
  * Merge "`required`" capabilities into the <<spirvenv-capabilities-table,
    list of optional: SPIR-V capabilities>> (internal issue 1320).
  * Relax the layout matching rules of descriptors referring to only a
    single aspect of a depth/stencil image, by reference to the new
    <<resources-image-layouts-matching-rule, Image Layout Matching Rules>>
    section (internal issue 1346).
  * Revert extension metadoc generator warning about name mismatches to a
    diagnostic, due to annoying warnings in build output for conscious
    choices we've made (internal issue 1351).

Other Issues:

  * Reserve bits for pending vendor extensions.
  * Make Vulkan consistent with SPIR-V regarding code:DepthReplacing and
    code:FragDepth in the <<interfaces-builtin-variables, Built-In
    Variables>> section.
  * Add missing ChangeLog entries for the previous three spec updates.

-----------------------------------------------------

Change log for July 30, 2018 Vulkan 1.1.82 spec update:

  * Update release number to 82.

Public Issues:

  * Add flink:vkDestroyPipelineLayout valid usage statement that the layout
    must not have been used with command buffers still in the recording
    state (public issue 730).
  * Correct <unused> tag for elink:VkResult in `vk.xml` (public merge
    request 746).

Internal Issues:

  * Add a valid usage statement to flink:vkQueueSubmit, and similar language
    to the definitions of <<synchronization-queue-transfers-acquire, acquire
    operations>> requiring that an acquire operation follow a previous
    release of the same subresource (internal issue 1290).
  * Add <<resources-image-format-features,Image Format Features>> and
    <<resources-image-view-format-features,Image View Format Features>>
    sections that precisely define the slink:VkFormatFeatures supported by
    images and image views, and rewrite valid usage statements to reference
    these sections instead of duplicating language (internal issue 1310).
  * Reword and consolidate synchronization valid usage statements for
    flink:vkCmdPipelineBarrier such that they correctly account for multiple
    possible self-dependencies (internal issue 1322).
  * Change order of <<Standard sample locations>> for 2xMSAA (internal issue
    1347).
  * Add definitions of "`<<Correctly Rounded>>`" and "`<<ULP>>`" in the
    SPIR-V environment appendix, and "`Units in the Last Place (ULP)`" in
    the glossary.

New Extensions:

  * `VK_NV_device_diagnostic_checkpoints`

-----------------------------------------------------

Change log for July 23, 2018 Vulkan 1.1.81 spec update:

  * Update release number to 81.

Public Issues:

  * Fix missing "`valid`" phrasing in some obscure cases (public pull
    request 605).
  * Replace improper use of cannot: referring to the implementation in the
    description of the
    <<features-limits-maxUpdateAfterBindDescriptorsInAllPools,
    pname:maxUpdateAfterBindDescriptorsInAllPools>> limit (public pull
    request 738).
  * Reorder description of bits in elink:VkPipelineStageFlagBits and the
    <<synchronization-pipeline-stages-supported, Supported pipeline stage
    flags>> table to match their definition order (public pull request 740).
  * Add description of ename:VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT
    to elink:VkBufferUsageFlagBits (public pull request 741).
  * Fix value usage statement for slink:VkSubpassDependency stage mask
    parameters (public pull request 742).
  * Fix visible markup in registry schema document (public pull request
    #745).

Internal Issues:

  * Make the <<geometry-invocations, geometry shader invocation
    description>> and <<shaders-geometry-execution, Geometry Shader
    Execution>> descriptions consistent with other pipeline stages (internal
    issue 1325).
  * Mark the `VK_NV_glsl_shader` extension as deprecated.
  * Adjust the per-instance vertex attribute offset formula specified by
    `VK_EXT_vertex_attribute_divisor` for
    slink:VkVertexInputBindingDivisorDescriptionEXT so that the interaction
    between pname:firstInstance and pname:divisor matches the OpenGL
    convention (internal issue 1333).

-----------------------------------------------------

Change log for July 7, 2018 Vulkan 1.1.80 spec update:

  * Update release number to 80.

Public Issues:

  * Remove unused "`API Order`" term from glossary (public issue 657).
  * Dynamically generate the extension appendix includes based on
    information in `vk.xml`, including new metadata tags describing
    deprecated, obsoleted, and promoted extensions (public pull request
    690).

Internal Issues:

  * Add valid usage statements to flink:vkCmdBindDescriptorSets to keep
    offsets + range less than or equal to the buffer size (internal issue
    1174).

New Extensions:

  * `VK_EXT_conditional_render`
  * `VK_KHR_create_renderpass2` (public issue 736)
  * `VK_KHR_8bit_storage` (public issue 737)

-----------------------------------------------------

Change log for July 1, 2018 Vulkan 1.1.79 spec update:

  * Update release number to 79.

Public Issues:

  * Add a note to the <<features-required-format-support, Required Format
    Support>> section clarifying that the required formats don't depend on
    the used flags (public issue 671).
  * Add a valid usage statement for flink:vkUpdateDescriptors that was
    previously described for slink:VkImageSubresourceRange, but not as a
    valid usage statement (public issue 713).
  * Modify implicit valid usage generator script to not emit 'must: not be
    0' for a parameter that is a pointer to a flags field, such as
    pname:pPeerMemoryFeatures (public issue 729).

Internal Issues:

  * Add definitions of "`obsoleted`" and "`deprecated`", and modify the
    definition of "`promoted`" in the <<glossary, Glossary>> (internal issue
    988).
  * Add language for integer texel output conversions (the conversion is
    undefined) to the <<textures-output-format-conversion]] Texel Output
    Format Conversion>> section. Simplify and clarify the floating-point
    conversion language in the <<fundamentals-general, General
    Requirements>> section and the new <<fundamentals-fp-conversion,
    Floating-Point Format Conversions>> section, and remove obsolete
    language in the format-specific floating-point sections (internal issue
    1275).
  * Add the elink:VkVendorId enumerated type to the Vulkan API / XML /
    header, so reserved Khronos vendor IDs can be referred to symbolically
    by clients. Note that only Khronos vendor IDs (e.g. non-PCI vendor IDs)
    are defined (internal issue 1299).
  * Fix typo in the <<fig-non-strict-lines, Non strict lines>> table
    (internal issue 1315).
  * Clean up and simplify the
    <<formats-requiring-sampler-ycbcr-conversion, YCbCr format
    properties>> table and use symbols consistently with other tables. Add a
    column for the number of planes.
  * Add code:Float16 to the <<spirvenv-capabilities-table, List of optional
    SPIR-V capabilities>> for the `VK_AMD_gpu_shader_half_float` extension.

-----------------------------------------------------

Change log for June 18, 2018 Vulkan 1.1.78 spec update:

  * Update release number to 78.

Public Issues:

  * Change markup so parameter descriptions include links to structures,
    instead of just their names (public issue 697).
  * Resume publishing updated Vulkan 1.0 with KHR extensions and Vulkan 1.0
    with all extensions versions of the specification (public issue 722).
  * Reapply fixes from public pull request 698 for
    `VK_ANDROID_external_memory_android_hardware_buffer`, which accidentally
    were reverted at some point (public pull request 724).
  * Fix undefined format valid usage statements for slink:VkImageCreateInfo
    in the presence of the
    `VK_ANDROID_external_memory_android_hardware_buffer` extension (public
    pull request 725).
  * Miscellaneous markup consistency fixes (public pull request 728).

Internal Issues:

  * When building specifications containing vendor extensions, add terms to
    the Khronos spec copyright specifying that the result is not a ratified
    specification (internal issue 739).
  * Change the value of the
    pname:maxDescriptorSetUpdateAfterBindUniformBuffers minimum limit to 72
    (6 times pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers) in
    the <<features-limits-required, Required Limits>> table (internal issue
    1300).

Other Issues:

  * Fix link to resource image view compatibility table in the valid usage
    statements for slink:VkImageFormatListCreateInfoKHR (internal pull
    request 2711).

-----------------------------------------------------

Change log for June 10, 2018 Vulkan 1.1.77 spec update:

  * Update release number to 77.

Public Issues:

  * Remove redundant Asciidoctor ifdef in slink:VkDeviceCreateInfo valid
    usage statement (public pull request 718).

Internal Issues:

  * Require that the returned slink:VkMemoryRequirements::pname:alignment
    reflect the minimum alignment requirements for the buffer's usages, and
    make dynamic offset alignment valid usage more explicit for
    flink:vkBindBufferMemory and flink:vkCmdBindDescriptorSets (internal
    issue 1170).
  * Explicitly state that objects of type code:OpTypeImage,
    code:OpTypeSampler, and code:OpTypeSampledImage must not be stored to in
    the <<spirvenv-module-validation, Validation Rules within a Module>>
    section (internal issue 1262).
  * Clarify rules about validating descriptor set/binding against storage
    class and descriptor type in the <<spirvenv-module-validation,
    Validation Rules within a Module>> section, and add an anchor for and
    references to the <<interfaces-resources-storage-class-correspondence,
    Shader Resource and Storage Class Correspondence>> table (internal issue
    1266).
  * Use correct spelling of SPIR-V decoration code:NonWritable in several
    places (internal issue 1298).

Other Issues:

  * Update specification links to files in the old
    KhronosGroup/Vulkan-LoaderAndValidationLayers repository with
    corresponding links into the new repositories that replace it.
  * Move validity requirement for slink:VkSamplerCreateInfo into the valid
    usage block instead of the body text, and give it a VUID.
  * Use the full name of the "`style guide`" in a reference in the
    description of slink:vkGetPhysicalDeviceProperties, update the
    <<vulkan-styleguide, link to that document>>, and use the full name
    in the registry index page.

-----------------------------------------------------

Change log for May 25, 2018 Vulkan 1.1.76 spec update:

  * Update release number to 76.

Internal Issues:

  * Add an exception clause to the license on `vk.xml`, enabling its use
    with GPL-based projects (internal issue 1017).
  * Remove the generated `vulkan_ext.[ch]` files, which are no longer
    supported. Add `src/ext_loader/README.md` explaining why, and update
    files in `xml/` to not generate them by default (internal issue 1268)

Other Issues:

  * Fix typos in valid usage statements for the
    ftext:vkDrawIndexedIndirectCount* commands, replacing
    sizeof(VkDrawIndirectComment) with sizeof(VkDrawIndexedIndirectCommand).
  * Modify the <<spirvenv-module-validation, Validation Rules within a
    Module>> section to require code:NonReadable or code:NonWriteable in
    SPIR-V code for images with an image format of code:Unknown if one of
    the requisite code:shaderImageReadWithoutFormat or
    code:shaderImageWriteWithoutFormat features is disabled.

New Extensions:

  * `VK_KHR_get_display_properties2`
  * `VK_KHR_draw_indirect_count`

-----------------------------------------------------

Change log for May 16, 2018 Vulkan 1.1.75 spec update:

  * Update release number to 75.

GitHub Issues:

  * Use GitHub handles (e.g. @handle) for contact information in vk.xml,
    when available (partial fix for public issue 630).
  * Add size invariance guarantee to slink:VkMemoryRequirements for
    buffer/image memory requirements (public issue 661).
  * Correct scope (conditional constructs) in valid usage statement for
    slink:VkBindImageMemoryInfo (public pull request 684).
  * Clean up minor markup issues and typos in the
    `VK_ANDROID_external_memory_android_hardware_buffer` extension appendix
    (public pull request 698).
  * Modify registry processing script to avoid irrelevant warnings of benign
    enumerant redefinitions (public pull request 705).
  * Fix some duplicate words and some misspelled "`stagess`" (public pull
    request 712)

Internal Issues:

  * Enable continuous integration tests on the internal Khronos gitlab
    server by adding a .gitlab-ci.yml file. Note: this does not implement CI
    on the public GitHub repository (internal issue 408).
  * Add link from description of depth clamping in the <<fragops-depth,
    depth test>> section to the
    slink:VkPipelineRasterizationStateCreateInfo::pname:depthClampEnable
    parameter which enables it, making it easily searchable / findable
    (internal issue 1125).
  * Clarify that arrays of arrays of descriptors are not allowed in the
    <<interfaces-resources-descset, Descriptor Set Interface>> and
    <<interfaces-resources-setandbinding, DescriptorSet and Binding
    Assignment>> sections (internal issue 1192).
  * Comment out some redundant nested Asciidoctor conditionals in the
    slink:VkImageViewCreateInfo valid usage block, and explain in all cases
    why the redundant conditional exist and are commented out (internal
    issue 1231).
  * Move a valid usage statement from slink:VkCommandPoolCreateInfo to the
    parent flink:vkCreateCommandPool, where the device queue is known
    (internal issue 1233).
  * Add new slink:VkBaseInStructure and slink:VkBaseOutStructure types which
    can be used by extensions and implementations for handling Vulkan
    sType/pNext style structures in a more generic way (internal issue
    1265).
  * Clarify that
    slink:VkAndroidHardwareBufferFormatPropertiesANDROID::pname:formatFeatures
    only applies to external-format images. Add references to this in valid
    usage statements that previously only referred to
    slink:VkFormatProperties (internal issue 1244).
  * Fix the description of elink:VkPipelineCreateFlagBits enumerant
    ename:VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT to match the
    name (internal issue 1279).
  * Add a NOTE to the <<interfaces-resources-setandbinding, DescriptorSet
    and Binding Assignment>> section making it clear that variables sharing
    a storage class may use identical descriptor set and bindings.
    Specifically state the sometimes misunderstood ability to have one or
    more differently typed image descriptors sharing a descriptor set and
    binding (internal SPIR-V issue 264).
  * Make DynamicIndexing features and capabilities also control the
    uniformity of the descriptor used in memory access instructions in the
    <<interfaces-resources-descset, Descriptor Set Interface>> section. This
    makes them also apply to variable_pointer usage, which can bypass the
    array indexing operation (internal SPIR-V issue 289).

Other Issues:

  * Correct flink:vkCmdBlitImage limitations on cubic blits to be 2D only,
    not 3D.
  * Update valid usage statements for slink:VkRenderPassCreateInfo and
    slink:VkInputAttachmentAspectReference.
  * Move YCbCr-related VU statements from slink:VkDescriptorImageInfo to
    slink:VkWriteDescriptorSet, where all needed information is known, and
    remove redundant statements.
  * Move SPIR-V restriction that images be of either sampled or storage
    types from the <<interfaces-resources-descset, Descriptor Set
    Interface>> section to the <<spirvenv-module-validation, Validation
    Rules within a Module>> section of the SPIR-V appendix.

-----------------------------------------------------

Change log for April 21, 2018 Vulkan 1.1.74 spec update:

  * Update release number to 74.

GitHub Issues:

  * Clarify which buffer locations are accessed in
    flink:vkCmdCopyBufferToImage valid usage statements (public issue 676).
  * Refine description of <<extended-functionality-extensions-dependencies,
    extension dependencies>>, related NOTE in the
    <<extended-functionality-extensions, Extensions>> section, and
    "`Required Extensions`" glossary term (public pull request 693).
  * Add support for specifying required Vulkan core version in `vk.xml` and
    the extension metadoc generator (public issue 696).
  * Update .gitignore for directory reorganization (public pull request
    699).
  * Fix typo (public pull request 703).

Internal Issues:

  * Update valid usage of slink:VkClearRect::pname:layerCount (internal
    issue 1241).

Other Issues:

  * Fix typo in <<NV_geometry_shader_passthrough>> issues list.

-----------------------------------------------------

Change log for April 15, 2018 Vulkan 1.1.73 spec update:

  * Update release number to 73.

GitHub Issues:

  * Refine swapchain association with surface for slink:VkSwapchainKHR, with
    matching valid usage statements for slink:VkSwapchainCreateInfoKHR and
    discussion following the <<swapchain-wsi-image-create-info>> table
    (public issue 637).
  * Re-remove several valid usage statements from slink:VkImageCreateInfo
    that had previously been removed at the time that
    ename:VK_IMAGE_CREATE_EXTENDED_USAGE_BIT was introduced. These
    statements had incorrectly been restored due to an glitch while merging
    from the old `1.0` branch to the current `master` branch (public issue
    683).

Internal Issues:

  * Fix reference page generation and configure build to generate reference
    pages 1.1 with all extensions, rather than core only, as was the case
    for the 1.0 ref pages (internal issues 484, 1056, 1205).
  * Require that
    slink:VkMemoryDedicatedRequirements::pname:prefersDedicateAllocation is
    ename:VK_TRUE when
    slink:VkMemoryDedicatedRequirements::pname:requiresDedicateAllocation is
    ename:VK_TRUE (internal issue 1222).
  * Fix Ruby extension code so `diff_html` Makefile target works (internal
    issue 1230).
  * Update `genRelease` script to generate 1.1 + all extensions reference
    pages - but not the single-page HTML / PDF versions, which are even
    larger than the API spec (internal issue 1245).

Other Issues:

  * Add missing attributes to `vk.xml` for `VK_ANDROID_native_buffer`.
  * Specify that the slink:VkAttachmentDescription::pname:format member is
    the format of the image *view* that will be used for the attachment.
  * Use core sname:VkPhysicalDeviceFeatures2 in the `structextends` `vk.xml`
    attribute for sname:VkPhysicalDeviceDescriptorIndexingFeaturesEXT and
    sname:VkPhysicalDeviceDescriptorIndexingPropertiesEXT, rather than the
    KHR equivalent it was promoted from.
  * Fix the "`Fragment Input Attachment Interface`" glossary entry to match
    the specification body.
  * Clarify the interaction of sRGB images used as storage or texel buffers
    with <<textures-output-format-conversion, Texel Output Format
    Conversion>>.
  * Moved three valid usage statements from
    slink:VkRenderPassMultiviewCreateInfo up to
    slink:VkRenderPassCreateInfo, and added a new valid usage statement for
    slink:VkRenderPassInputAttachmentAspectCreateInfo.
  * Added valid usage statements for slink:VkBufferMemoryBarrier and
    slink:VkImageMemoryBarrier reflecting the global requirement that
    "`non-sparse resources must be bound to memory before being recorded to
    command`".

-----------------------------------------------------

Change log for April 5, 2018 Vulkan 1.1.72 spec update:

  * Update release number to 72.

GitHub Issues:

  * Restructure the repository to put the specification `Makefile` and
    associated spec source material at the top level, `vk.xml` and
    associated scripts material in `xml/`, and generated include and source
    files in `include/vulkan/` and `src/ext_loader/`, respectively (public
    issue 436).
  * Add missing bullet point markup to flink:vkCmdCopyImage valid usage
    statement, so it gets a VUID assigned (public issue 627).
  * Fix broken links in a couple of extension appendices (public pull
    request 665).
  * Add the <platform> tag to the index in section 4.1 of the registry
    schema documentation, and add the protect= attribute of <extension>
    tags to the comments in `registry.rnc` (public issues 673, 678).
  * Add missing valid usage statements for sparse image interactions to
    flink:VkImageCreateInfo (public pull request 675).
  * Fix improper usage and grammar of "`can: not`" (public pull request
    681).
  * Remove duplicate spec language and NOTE on present layout between the
    flink:vkAcquireNextImageKHR and flink:vkAcquireNextImage2KHR commands
    (public pull request 685).
  * Fix some typos and markup issues (public pull request 689; public issues
    642, 667, 687).
  * Fix typo etext:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_FENCE_FD_BIT ->
    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT in the
    <<external-semaphore-handle-types-compatibility, External semaphore
    handle types compatibility>> table (public pull request 691).

Internal Issues:

  * Remove the need for the "`noautovalidity`" attribute on extension
    structures in `vk.xml`. It is now implied by the "`structextends`"
    attribute instead (internal issue 942).
  * Replace uses of "`currently bound`" with "`bound`", since "`currently`"
    is redundant and distracting, and add a corresponding rule to the style
    guide (internal issue 993).
  * Fixed subtle issues with the last updates to flink:vkAcquireNextImageKHR
    language that had resulted in ambiguities (internal issue 1178).
  * Make it clear that only one query of a given type is allowed at a time
    by reordering valid usage statements for flink:vkCmdBeginQuery and
    flink:vkCmdEndQuery, and removing redundant ones (internal issue 1213).
  * Swapped OL1 and OL3 in `tessparamUL.svg` to match previous version, and
    fixed where "`(no edge)`" appears (internal issue 1215).

Other Issues:

  * Fixed a minor problem with the valid usage statement extraction script,
    and corresponding markup in the spec source.

New Extensions:

  * `VK_AMD_shader_core_properties`
  * `VK_EXT_descriptor_indexing`
  * `VK_NV_shader_subgroup_partitioned`

-----------------------------------------------------

Change log for March 16, 2018 Vulkan 1.1.71 spec update:

  * First public update for Vulkan 1.1.

GitHub Issues:

  * Refer to standard sparse image block shape format tables explicitly in
    the <<sparsememory-standard-shapes, Standard Sparse Image Block Shapes>>
    section (public issue 93).
  * Add the missing definition of the code:LocalInvocationIndex decoration
    in the <<interfaces-builtin-variables, Built-In Variables>> section
    (public issue 532).
  * Clarify dynamic state definition in the introduction to the <<pipelines,
    Pipelines>> section and the new <<pipelines-dynamic-state, Dynamic
    State>> subsection (public issue 620).
  * Clarified deprecation statement in the `VK_AMD_negative_viewport_height`
    appendix (public issue 674).
  * Fix parameter descriptions for flink:vkCreateIndirectCommandsLayoutNVX
    (public issue 677).

Internal Issues:

  * Remove description of <<primsrast-points, rasterization point size>>
    being taken from the tessellation control shader, since there are no
    circumstances under which you can have TCS without TES (internal issue
    522).
  * Define <<copies-images-format-size-compatibility, _size-compatible_
    image formats>> for flink:vkCmdCopyImage, add it to the glossary, and
    use that definition for slink:VkImageViewCreateInfo (internal issue
    771).
  * Change brief descriptions of enumerant names, and of parameters which
    are enumerants, from "`enum *indicates*`" to "`enum *specifies*`" for
    consistency, and add a markup style guide rule (internal issue 862).
  * Clarify how execution dependencies interact with
    <<synchronization-submission-order, submission order>> at numerous
    places in the <<renderpass, Render Pass>> and <<synchronization,
    Synchronization>> chapters (internal issue 1062).
  * Clarify statement in the <<interfaces-resources-setandbinding,
    DescriptorSet and Binding Assignment>> section that only interface
    variables statically used by the entry point used in a pipeline must be
    present in the descriptor set layout (internal issue 1172).
  * Flip sparse image diagrams with partially full mip levels vertically, to
    match graph origins of other image diagrams (internal issue 1176).
  * Update new SVG diagrams to have consistent style and base font size,
    increase consistency of primitive topology diagrams, and add a section
    to the style guide on creating and editing images in a consistent style
    (internal issue 1177).
  * Resolve problems with valid usage statement extraction by fixing
    existing VUID tags for interfaces promoted to version 1.1 and fixing
    conditional directives around
    VUID-VkMemoryDedicatedAllocateInfo-image-01797 (internal issue 1184).
  * Strip `KHR` suffixes from a few interfaces promoted to Vulkan 1.1 that
    were missed previously (internal issue 1185).
  * Restrict code:OpImageQuerySizeLod and code:OpImageQueryLevels to only
    work on code:Image operands with their code:Sampled operand set to 1. In
    other words, these operations are not defined to work with storage
    images (internal issue 1193).
  * Recycle extension slot for extension #82 in `vk.xml`. This extension was
    never published (internal issue 1195).
  * Add an issue to the `VK_KHR_maintenance1` appendix noting that zero
    height viewports are allowed when this extension is enabled (internal
    issue 1202).
  * Fix slink:VkDescriptorSetLayoutBinding description so that shader stages
    always use descriptor bindings, not the other way around (internal issue
    1206).
  * Fix field name for
    slink:VkInputAttachmentAspectReference::pname:inputAttachmentIndex
    (internal issue 1210).

Other Issues:

  * Fix a few broken links in the <<versions-1.1, Version 1.1>> appendix.
  * Replace a few old refBegin/refEnd tags with open block markup around
    interfaces, and remove old KHX VUID tags that were breaking the valid
    usage statement extraction.
  * Fix error codes accidentally tagged as success codes in `vk.xml` for
    flink:vkGetSwapchainCounterEXT.
  * Added valid usage statements for ftext:vkBind*Memory2 input structures
    stext:VkBind*MemoryInfo, and fix a pname:image -> pname:buffer typo in a
    couple of places.
  * Fix swapped descriptions of elink:VkDescriptorType enums
    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE and
    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE (reported via tweet).

New Extensions:

  * `VK_ANDROID_external_memory_android_hardware_buffer`

-----------------------------------------------------

Change log for March 7, 2018 Vulkan 1.1.70 spec update:

  * Vulkan 1.1 initial release. Bump API patch number and header version
    number to 70 for this update. The patch number will be used for both
    Vulkan 1.1 and Vulkan 1.0 updates, and continues to increment
    continuously from the previous Vulkan 1.0.69 update.

    NOTE: We are not publishing an updated 1.0.70 specification, or 1.1
    reference pages, along with 1.1.70. There are still minor issues to work
    out with those build targets. However, we will soon generate all three
    types of documents as part of the regular spec update cycle.

    NOTE: The GitHub KhronosGroup/Vulkan-Docs repository now maintains the
    current specification in the `master` branch. The `1.0` branch is out of
    date and will not be maintained, since we will be generating both 1.1
    and 1.0 specifications from the `master` branch in the future.

GitHub Issues:

  * Clarify how mapped memory ranges are flushed in
    flink:vkFlushMappedMemoryRanges (public issue 127).
  * Specify that <<synchronization-pipeline-stages, Pipeline Stages>> are a
    list of tasks that each command performs, rather than necessarily being
    discrete pieces of hardware that one task flows through. Add a
    "`synchronization command`" pipeline type which all synchronization
    command execute (it is just TOP + BOTTOM), with an explanatory note
    (public issue 554).

Internal Issues:

  * Regenerate all images used in the spec in Inkscape with a consistent
    look-and-feel, and adjust image size attributes so they're all legible,
    and not too large with respect to the spec body text (internal issue
    701).
  * Document in the <<extensions,extensions>> appendix and in the style
    guide that `KHX` extensions are no longer supported or used in the
    Vulkan 1.1 timeframe (internal issue 714).
  * Remove the leftover equations_temp directory after PDF build completes
    (internal issue 925).
  * Update the <<credits, Credits (Informative)>> appendix to include
    contributors to Vulkan 1.1, and to list them according to the API
    version(s) they contributed to (internal issue 987).
  * Add a NOTE to the introduction explaining that interfaces defined by
    extensions which were promoted to Vulkan 1.1 are now expressed as
    aliases of the Vulkan 1.1 type (internal issue 991).
  * Instrument spec source conditionals so spec can be built with 1.1
    features, extensions promoted to 1.1, or both (internal issues 992,
    998).
  * Modify the XML schema and tools to support explicit aliasing of types,
    structures, and commands, and use this to express the promotion of 1.0
    extensions to 1.1 core features, by making the extension interfaces
    aliases of the core features they were promoted to. Mark up promoted
    interfaces to allow still generating 1.0 + extension specifications
    (internal issue 991).
  * Platform names, along with corresponding preprocessor symbols to enable
    extensions specific to those platforms, are now reserved in vk.xml using
    the <platform> tag. Update the registry schema and schema specification
    to match (internal issue 1011).
  * Updated the <<textures-texel-replacement, Texel Replacement>> section to
    clarify that reads from invalid texels for image resources result in
    undefined values (internal issue 1014).
  * Modify description of patch version so it continues to increment across
    minor version changes (internal issue 1033).
  * Clarify and unify language describing physical device-level core and
    extension functionality in the <<fundamentals-validusage-extensions,
    Valid Usage for Extensions>>, <<fundamentals-validusage-versions, Valid
    Usage for Newer Core Versions>>, <<initialization-functionpointers
    Command Function Pointers>>, <<initialization-phys-dev-extensions,
    Extending Physical Device From Device Extensions>>
    <<extended-functionality-instance-extensions-and-devices, Instance
    Extensions and Device Extensions>> sections and for
    flink:vkGetPhysicalDeviceImageFormatProperties2. This documents that
    instance-level functionality is tied to the loader, and independent of
    the ICD; physical device-level functionality is tied to the ICD, and
    associated with device extensions; physical devices are treated more
    uniformly between core and extensions; and instance and physical
    versions can be different (internal issue 1048).
  * Updated the <<commandbuffers-lifecycle, Command Buffer Lifecycle>>
    section to clarify the ability for pending command buffers to transition
    to the invalid state after submission, and add a command buffer
    lifecycle diagram (internal issue 1050).
  * Clarify that some flink:VkDescriptorUpdateTemplateCreateInfo parameters
    are ignored when push descriptors are not supported (internal issue
    1054).
  * Specify that flink:vkCreateImage will return an error if the image is
    too large, in a NOTE in the slink:VkImageFormatProperties description
    (internal issue 1078).
  * Remove near-duplicate NOTEs about when to query function pointers
    dynamically in the <<initialization, Initialization>> chapter and
    replace by extending the NOTE in the <<fundamentals-abi, Application
    Binary Interface>> section (internal issue 1085).
  * Restore missing references to "`Sparse Resource Features`" in the
    flink:VkBufferCreateFlagBits description (internal issue 1086).
  * Tidy up definitions of descriptor types in the `GL_KHR_vulkan_glsl`
    specification, the <<descriptorsets, Resource Descriptors>> section and
    its subsections, and the <<interfaces-resources-descset, Descriptor Set
    Interface>> for consistency, reduction of duplicate information, and
    removal of GLSL correspondence/examples (internal issue 1090).
  * Correctly describe code:PrimitiveId as an Input for tessellation control
    and evaluation shaders, not an Output (internal issue 1109).
  * Relax the requirements on chroma offsets for nearest filtering in
    <<textures-implict-reconstruction, Implicit Reconstruction>> (internal
    issue 1116).

Other Issues:

  * Clarify the intended relationship between specification language and
    certain terms defined in the Khronos Intellectual Property Rights
    policy. Specific changes include:
  ** Rewrote IP/Copyright preamble and introduction to better agree with
     normative language both as laid out in the introduction, and the
     Khronos IPR policy.
  ** Added notion of fully informative sections, which are now tagged with
     "`(Informative)`" in their titles.
  ** Removed non-normative uses of the phrase "`not required`"
  ** Clarified the distinction between terms "`optional`" and "`not
     required:`" as they relate to the IPR Policy, and updated specification
     text to use terms consistent with the intent.
  ** Reduced additions to RFC 2119, and ensured the specification agreed
     with the leaner language.
  ** Removed the terms "`hardware`", "`software`", "`CPU`", and "`GPU`" from
     normative text.
  ** Moved several paragraphs that should not have been normative to
     informative notes.
  ** Clarified a number of definitions in the Glossary.
  ** Updated the document writing guide to match new terminology changes.
  * Explicitly state in the <<fundamentals-objectmodel-lifetime-acquire,
    application memory lifetime>> language that for objects other than
    descriptor sets, a slink:VkDescriptorSetLayout object used in the
    creation of another object (such as slink:VkPipelineLayout or
    slink:VkDescriptorUpdateTemplateKHR) is only in use during the creation
    of that object and can be safely destroyed afterwards.
  * Updated the <<textures-scale-factor, Scale Factor Operation>> section to
    use the ratio of anisotropy, rather than the integer sample rate, to
    perform the LOD calculation. The spec still allows use of the sample
    rate as the value used to calculate the LOD, but no longer requires it.
  * Update `vulkan_ext.c` to include all platform-related definitions from
    the Vulkan platform headers, following the split of the headers into
    platform-specific and non-platform-specific files.
  * Fix bogus anchor name in the <<commandbuffers, Command Buffers>> chapter
    which accidentally duplicated an anchor in the pipelines chapter. There
    were no reference to this anchor, fortunately.
  * Add valid usage statement for slink:VkWriteDescriptorSet and
    slink:VkCopyDescriptorSet requiring that the slink:VkDescriptorSetLayout
    used to allocate the source and destination sets must not have been
    destroyed at the time flink:vkUpdateDescriptorSets is called.
  * Document mapping of subgroup barrier functions to SPIR-V, and clarify a
    place where subgroupBarrier sounds like it is execution-only in the
    standalone `GL_KHR_shader_subgroup` specification.
  * Use an HTML stylesheet derived from the Asciidoctor `colony` theme, with
    the default Arial font family replaced by the sans-serif Noto font
    family.
  * Numerous minor updates to README.adoc, build scripts, Makefiles, and
    registry and style guide specifications to support Vulkan 1.1 outputs,
    use them as defaults, and remove mention of `KHX` extensions, which are
    no longer supported.


New Extensions:

  * `VK_EXT_vertex_attrib_divisor`

-----------------------------------------------------

Change log for February 19, 2018 Vulkan 1.0.69 spec update:

  * Bump API patch number and header version number to 69 for this update.

GitHub Issues:

  * Clean up description of synchronization for flink:vkAcquireNextImageKHR
    (public issue 626).
  * Move valid usage statements requiring offset and extent to respect image
    transfer granularity requirements of the queue family they are submitted
    against from slink:VkImageCopy and slink:VkBufferImageCopy to the
    corresponding flink:vkCmdCopyImage, flink:vkCmdCopyBufferToImage, and
    flink:vkCmdCopyImageToBuffer commands, where are relevant information is
    known (public issue 654).
  * Clarify that flink:vkGetDeviceProcAddr only supports device-level
    commands (public issue 655).

Internal Issues:

  * Associate each elink:VkDescriptorType with a type of descriptor, and
    link to descriptions of those types (internal issue 860).
  * Rework valid usage extraction script to better utilize and respond to
    spec markup, and fix some spec markup accordingly (internal issues 846,
    909, 945).
  * Rephrase flink:vkCmdPushConstants valid usage to allow overlapping push
    constant ranges in different shader stages (internal issue 1103).
  * Fix problem with diff_html target in extension.rb (internal issue 1104).
  * Modify valid usage statements for slink:VkClearDepthStencilValue,
    slink:VkGraphicsPipelineCreateInfo, slink:VkViewport, and
    flink:vkCmdSetDepthBounds, and the description of vkCmdSetDepthBias, to
    clarify that clamping is applied if and only if the
    `VK_EXT_depth_range_unrestricted` is not enabled (internal issue 1124),
    in versions of the specification built with that extension included.
  * Resolve contradictions and use of undefined "`per-sample shading`" term
    in the <<primsrast-sampleshading, Sample Shading>> and
    <<shaders-fragment-execution, Fragment Shader Execution>> sections; for
    the <<features-features-sampleRateShading, sampleRateShading feature>>;
    for code:FragCoord, code:SampleId, and code:SamplePosition; and for
    slink:sname:VkPipelineMultisampleStateCreateInfo (internal issue 1134).
  * Clarify the meaning of the ptext:maxDescriptorSet* limits in footnote 8
    of the <<features-limits-required,Required Limits>> table (internal
    issue 1139).
  * Fix broken NOTE markup in slink:VkSamplerCreateInfo.txt (internal issue
    1140).
  * Remove extend comparison language from valid usage statement for
    slink:VkImageCreateInfo, turning it into a simple validation of
    pname:mipLevels against pname:maxMipLevels (internal issue 1151).
  * Update valid usage statements for slink:VkImageCopy when the
    `VK_KHR_maintenance1` extension is enabled to allow multi-slice 2D <->
    3D copies when the pnaem:extent.depth parameter specifies the number of
    layers being copied, and matches the
    slink:VkImageSubresourceLayers.layerCount of the 2D image (internal
    issue 1152).
  * Rephrase memory / control barrier rules in the
    <<spirvenv-module-validation, Validation Rules within a Module>> section
    to avoid "`not use none`", which could be misconstrued to allow no
    synchronization semantics, and only storage class semantics (internal
    issue 1154).

Other Issues:

  * Move GLSL extension specifications to the KhronosGroup/GLSL repository
    on GitHub.
  * Add missing description of ename:VK_FILTER_CUBIC_IMG enum to
    slink:VkFilter.
  * Update description of code:PrimitiveId in the
    <<interfaces-builtin-variables,Built-In Variables>> section to clarify
    its behavior.
  * Disallow disjoint images from being used with dedicated-memory images in
    slink:VkMemoryDedicatedAllocateInfoKHR.
  * Update README to suggest older versions of "mathematical" and
    "ruby-gems" packages for use on Cygwin.
  * Fix typos

New Extensions:

  * `VK_AMD_buffer_marker`

-----------------------------------------------------

Change log for January 15, 2018 Vulkan 1.0.68 spec update:

  * Bump API patch number and header version number to 68 for this update.

GitHub Issues:

  * Added more details in the
    <<extended-functionality-extensions-compatibility, Extension
    Compatibility>> section, allowing explicit incompatibilities, and
    simplify corresponding language in the style guide, which now defers to
    the API Specification on this point (public issue 638).
  * Fix typo in description of slink:VkCommandBufferLevel::pname:level
    (public issue 651).
  * Only include extension-dependent valid usage statement for
    slink:VkImageSubresourceRange, and note that the extension names for
    header files described in the <<boilerplate-wsi-header, Window
    System-Specific Header Control>> section are only valid links, when the
    specification being viewed is built with the corresponding extensions
    enabled (public issue 652).

Internal Issues:

  * Add language to elink:VkResult specifying that when commands return an
    error, output parameter contents are undefined instead of unmodified
    (except for pname:sType and pname:pNext). Note that this is a behavior
    change. Add notes calling out slink:VkImageFormatProperties as an
    exception (internal issue 1118).
  * Add "`general-purpose`" to the style guide, and correct existing uses of
    "`general purpose`" as an adjective (internal issue 1121).
  * Add the ename:VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT token
    for the `VK_EXT_validation_cache` extension, following the same naming
    pattern as other tokens in the extension, but keep the old
    ename:VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT token around for
    backwards compatibility (internal issue 1126).

Other Issues:

  * Specify that flink:vkCmdSetDiscardRectangleEXT does not affect copies or
    clears, matching existing language for the scissor rectangle test.
  * Move the <<boilerplate-sType, pname:sType>> definition from the
    boilerplate appendix to the Fundamentals chapter, putting it together
    with the valid usage of pname:sType rather than having the definition
    split across two places.
  * Inline all of the etext:Vk*Flags definitions, moving each one from the
    boilerplate appendix to appear either after the corresponding
    etext:Vk*FlagBits value if one is defined, or after the first structure
    that includes them if not.

-----------------------------------------------------

Change log for January 5, 2018 Vulkan 1.0.67 spec update:

  * Bump API patch number and header version number to 67 for this update.
  * Update copyright dates to 2018

GitHub Issues:

  * Fix texture lookup functions in `GL_KHR_vulkan_glsl` specification
    (public pull request 363).
  * Clarify the state waited semaphores are left in when a call to
    flink:vkQueuePresentKHR fails (public issue 572).
  * Cleanup descriptions of slink:VkObjectTablePushConstantEntryNVX and
    slink:VkObjectTableDescriptorSetEntryNVX (public issue 583)
  * Remove redundant flink:vkCmdSetDiscardRectangleEXT valid usage
    statements (public pull 586).
  * Make dynamic state array length valid usage statements implicit for
    flink:vkCmdSetViewportWScalingNV, flink:vkCmdSetDiscardRectangleEXT, and
    flink:vkCmdSetViewport (public pull 589).
  * Clarify meaning of window extent (0,0) in slink:VkSwapchainKHR for the
    Windows and X11 platforms, in their respective extensions (public issue
    590).
  * Allow flink:vkGetPastPresentationTimingGOOGLE to return
    ename:VK_INCOMPLETE (public issue 604).
  * Add synchronization valid usage statements to flink:vkAcquireNextImage
    (public pull 611).
  * Fix some broken external links and internal xrefs (public pull 613).
  * Clean up slink:VkViewport valid usage statements in the presence or
    absence of relevant extensions (public pull 623).
  * Remove
    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR
    token from VK_KHR_maintenance2 from the non-extension VU path for
    slink:VkGraphicsPipelineCreateInfo (public issue 628).
  * Miscellaneous minor markup fixes - extension name strings (public pull
    631), Notes (pull 633), queue names emitted by generator scripts (pull
    634), block formatting in slink:VkDescriptorUpdateTemplateEntryKHR (pull
    635), ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG (pull
    641), quotes and apostrophes (pull 643),
  * Miscellaneous minor grammar fixes (public pull 644).
  * Fix markup macros so usage like ptext:*Src* works (public pull 647).

Internal Issues:

  * Clarify in the `VK_KHR_surface` and `VK_KHR_swapchain` extensions that
    parameter combinations which aren't supported for normal images are also
    unsupported for presentable images, even if the parameter values are
    individually supported as reported by the surface capability queries
    (internal issue 1029).
  * Fixed XML typo in the valid value field of the pname:sType member of
    slink:VkPhysicalDeviceExternalMemoryHostPropertiesEXT (internal issue
    1100).

Other Issues:

  * Add memory semantics validity rules to the <<spirvenv-module-validation,
    Validation Rules within a Module>> section of the SPIR-V environment
    appendix, and specify that sequentiality consistency is not supported.
    This forbids certain cases like "`Load+Release`" that we don't expect to
    ever be meaningful.
  * Document mapping of OpenGL Shading Language barriers to SPIR-V scope and
    semantics in the `GL_KHR_vulkan_glsl` specification.

New Extensions:

  * `VK_EXT_conservative_rasterization`

-----------------------------------------------------

Change log for November 27, 2017 Vulkan 1.0.66 spec update:

  * Bump API patch number and header version number to 66 for this update.

GitHub Issues:

  * Clarified how and when ename:VK_ERROR_TOO_MANY_OBJECTS is generated in
    flink:vkAllocate Memory, and remove incorrect valid usage statement
    about exceeding the API limit (public issue 356).
  * Minor clarification of the description of
    flink:vkUpdateDescriptorSetWithTemplateKHR::pname:descriptorUpdateTemplate
    (public issue 564).
  * Minor fixes for flink:vkCmdSetViewportWScalingNV (public pull request
    588).
  * Fix random name markup issues (public pull request 603).
  * Fix code:BuiltIn decoration typo in the <<fxvertex-attrib, Vertex
    Attributes>> section (public pull request 606).
  * Fix synchronization language following the definition of
    flink:vkAcquireNextImageKHR (public issue 607).
  * Restore descriptions of several commands and structures missing from the
    generated spec due to a mistyped Asciidoctor conditional (public issue
    612).
  * Fix 1.0.41 changelog to refer to public issues 403/404 (public issue
    618).

Internal Issues:

  * Refactor valid usage statements with internal conditionals in
    `copies.txt`, `pipelines.txt`, `renderpass.txt`, and `resources.txt` so
    each branch of the conditional appears as a standalone statement which
    can contain a separate VUID. This should have no impact on the generated
    specs, but is necessary given the present state of the VU extractor and
    the validation layer code that consumes them (internal issue 1043).
  * Fix VkQueueGlobalPriorityEXT enum values missing _EXT suffix (internal
    issue 1045).
  * Clarified initial ownership of resources bound to shared memory objects,
    (internal issue 1068).
  * Fix duplicated valid usage ID tag for flink:vkCmdCopyImage, and make the
    required layouts include ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL in
    both cases (internal issue 1084).

Other Issues:

  * Remove the noise functions from GLSL for SPIR-V for Vulkan in the
    `GL_KHR_vulkan_glsl.txt` extension.

New Extensions:

  * `VK_EXT_external_memory_host`
  * `VK_EXT_external_memory_dma_buf`
  * `VK_EXT_queue_family_foreign`

-----------------------------------------------------

Change log for October 27, 2017 Vulkan 1.0.65 spec update:

  * Bump API patch number and header version number to 65 for this update.

GitHub Issues:

  * Replaced inaccurate "`pixel`" with "`texel`" or "`compressed texel
    block`" as appropriate in the <<sparsememory, Sparse Resources>> chapter
    (public issue 86).
  * Attempt to clarify security/integrity guarantees in the
    <<fundamentals-errors, Errors>> section (public issue 147).
  * Update the <<memory-device,Device Memory>> section with clarifications
    and markup fixes (public pull request 194).
  * Fix typo VkDeviceCreateInfo -> slink:VkDebugMarkerObjectNameInfoEXT in
    sample code for `VK_EXT_debug_marker` extension (public pull request
    227).
  * Clarified slink:VkFramebufferCreateInfo language regarding concurrent
    use of attachment resources during a render pass instance (public issue
    299).
  * Added overlap rules for destination regions in <<copies,copy commands>>.
    Also unified the sparse and non-sparse source-destination overlap rules,
    since the non-sparse rules were technically inaccurate in the face of
    aliasing in flink:vkBindMemory2 - the new rules are true regardless
    (public issue 317).
  * Clarified the <<features-features-samplerAnisotropy,
    pname:samplerAnisotropy feature>> to only affect the
    slink:VkSamplerCreateInfo::pname:anisotropyEnable value, and that
    pname:maxAnisotropy is ignored when pname:anisotropyEnable is VK_FALSE
    (public issue 503).
  * Clarify pointer valid usage statements to use "`valid pointer to valid
    _object_`" terminology and update the
    <<fundamentals-validusage-pointers,Valid Usage for Pointers>> section
    accordingly (public pull request 547).
  * Some operations that use integer coordinates can also accept a LOD to
    sample from. Add a description of that selection and the validity
    conditions in the new <<textures-integer-coordinate-operations, Integer
    Texel Coordinate Operations>> section (public issue 548).
  * Update stext:VkImageSubresource* valid usage statements (public pull
    request 550).
  * Added text tying ename:VK_OUT_OF_POOL_MEMORY error for
    flink:vkAllocateDescriptorSets to the number of descriptor types in the
    allocating pool. Removed redundant "`length`" text about number of
    descriptors returned (public issue 582).
  * Update slink:VkSwapchainCreateInfoKHR descriptions (public pull request
    585).
  * Update slink:VkPipelineViewportWScalingStateCreateInfoNV and related
    structures' valid usage statements (public pull request 587).
  * Change some dates to conform to ISO 8601 as specified in the style guide
    (public pull request 601).
  * Fix some math markup problems and be more consistent in use of asciidoc
    math markup (public pull request 602).

Internal Issues:

  * Clarified that attribute reads from incomplete vertex buffer elements
    are considered out of bounds accesses, in the
    slink:VkPhysicalDeviceFeatures and flink:vkCmdBindVertexBuffers.txt
    sections (internal issue 842).

-----------------------------------------------------

Change log for October 20, 2017 Vulkan 1.0.64 spec update:

  * Bump API patch number and header version number to 64 for this update.

GitHub Issues:

  * Add chapter name to the PDF page footer (public pull request 458).
  * Fix several mistaken references to the nonexistent etext:VK_DEVICE_LOST
    status to etext:VK_ERROR_DEVICE_LOST (public pull request 502).
  * Fix description of the tlink:PFN_vkDebugReportCallbackEXT debug report
    callback function pointer to match the validation layer behavior (public
    issue 534).
  * Document experimental KHX extensions and alternate vendor author IDs
    also ending in X in more detail in the <<extensions, Layers &
    Extensions>> appendix, the extensions section of the style guide, and
    the registry schema description document (public issues 536, 580).
  * Fix references to ptext:pDepthStencil to properly refer to
    pname:pDepthStencilState or pname:pRasterizationState as appropriate in
    the slink:VkGraphicsPipelineCreateInfo description (public issue 542).
  * Fix wrong parameter name in slink:VkPipelineMultisampleStateCreateInfo
    valid usage (public pull request 571).

Internal Issues:

  * Update the style guide to describe how to write LaTeX math expressions
    in table cells (internal issue 908).
  * Define how framebuffer-local dependencies work between subpasses with
    the same or different numbers of samples, in the
    slink:VkSubpassDescription and <<synchronization-framebuffer-regions,
    Framebuffer Region Dependencies>> sections. This clarifies which samples
    in an input attachment you are allowed to access after a
    framebuffer-local dependency (internal issue 915).
  * Specify which storage classes can have an initializer in the
    <<spirvenv-module-validation, Validation Rules within a Module>> section
    (internal issue 1023).
  * Use "LOD" consistently for "level-of-detail", to eliminate spelling
    inconsistencies. The term is already standardized in the Glossary
    (internal issue 1027).

Other Issues:

  * Fix false positives in Makefile dependencies when rules fail, by
    deleting partially-made targets.

New Extensions:

  * `VK_AMD_shader_info`

-----------------------------------------------------

Change log for October 13, 2017 Vulkan 1.0.63 spec update:

  * Bump API patch number and header version number to 63 for this update.

GitHub Issues:

  * Add missing valid usage statements for ptext:maxDescriptorSets*,
    ptext:maxPerStageDescriptorInputAttachments, and
    ptext:maxPerStageResources to slink:VkPipelineLayoutCreateInfo.txt,
    flink:VkComputePipelineCreateInfo, and
    flink:VkGraphicsPipelineCreateInfo (public issue 546).
  * Fix typos in ftext:vkCmdDraw*AMD descriptions (public pull request 549).
  * Fixed flink:vkCmdWriteTimestamp so it is not unnecessarily restricted to
    queues supporting graphics or compute operations (public issue 558).
  * Improvements to valid usage generator for output `*Flags` pointer
    parameters and for some `void *` parameters (public pull requests 560,
    562).
  * Document `altlen` attribute in XML schema as valid C99 syntax and tweak
    `vk.xml` to match (public pull request 566).
  * Clarify when pname:fence is signaled by flink:vkQueueSubmit in a more
    obvious place (public issue 577).

Internal Issues:

  * Specify a list of supported SPIR-V Storage Classes in the
    <<spirvenv-module-validation, Validation Rules within a Module>>
    appendix (internal SPIR-V issue 166).
  * Relax the shared semaphore wait timeout requirement in the
    <<synchronization-semaphores-importing, Importing Semaphore Payloads>>
    section (internal issue 820).
  * Update the <<textures-image-level-selection, Image Level(s) Selection>>
    equations so that the parameters returned by the level-of-detail query
    appear explicitly, also fixing the issue that linear filtering would
    select a level below the base level for magnification (internal issue
    926).
  * Disallow creation of a swapchain with zero pname:imageExtent in
    slink:VkSurfaceCapabilitiesKHR and slink:VkSwapchainCreateInfoKHR
    (internal issue 1020).

Other Issues:

  * Clarify in <<textures-operation-validation,Image View Validation>> that
    the layout of subresources in an image view must have a layout that
    matches that written into the descriptor, and that this section is about
    validating image views, not images.

New Extensions:

  * `VK_EXT_global_priority`

-----------------------------------------------------

Change log for October 6, 2017 Vulkan 1.0.62 spec update:

  * Bump API patch number and header version number to 62 for this update.

GitHub Issues:

  * Move asciidoc conditionals for `VK_KHR_maintenance1` in
    slink:VkDescriptorSetAllocateInfo so valid usage statements for
    `VK_KHR_push_descriptor` aren't accidentally removed when the first
    extension isn't enabled (public issue 573).

Internal Issues:

  * Specify constraints on concurrent access to fences that share payload in
    the <<synchronization-fences-importing, Importing Fence Payloads>> and
    <<synchronization-semaphores-waiting-state, Semaphore State Requirements
    For Wait Operations>> sections (internal issue 820).
  * Define the term "`retired swapchain`", reorganize some swapchain
    language, and improve language for pname:oldSwapchain in
    flink:VkSwapchainCreateInfoKHR, the <<swapchain-wsi-image-create-info>>
    table, flink:vkDestroySwapchainKHR, and flink:vkAcquireNextImage2KHX
    (internal issue 869).
  * Describe in the <<writing-arrays, Describing Properties of Array
    Elements>> section of the style guide how and when to use "`each`" and
    "`any`" to refer to properties of array elements, and make those uses in
    the specification consistent (internal issue 884).
  * Clarified that events cannot be used for cross-queue synchronization in
    the <<synchronization-events, Events>> section and for
    flink:vkCmdWaitEvents (internal issue 970).
  * Add success and error codes to +vk.xml+ for
    flink:vkCreateValidationCacheEXT (internal issue 995).
  * Clarify aspect mask usage for image memory barriers of multi-plane
    images in slink:VkImageSubresourceRange, slink:VkImageMemoryBarrier, and
    the <<textures-layout-validation, Layout Validation>> section (internal
    issue 996).

Other Issues:

  * Fixed typo in flink:VkRenderPassSampleLocationsBeginInfoEXT (renamed
    field pname:pSubpassSampleLocations to
    pname:pPostSubpassSampleLocations).
  * Add missing buffer usage requirements for indirect draws in
    flink:vkCmdDrawIndirect, flink:vkCmdDrawIndirectCountAMD,
    flink:vkCmdDrawIndexedIndirect, and
    flink:vkCmdDrawIndexedIndirectCountAMD.
  * Modify Makefile to allow specification to build in git "`detached HEAD`"
    state.
  * Update valid usage ID generation script to allow recursively operating
    on all `.txt` files in a specified directory, and move the `startVUID`
    tracking information into a separate python file that is automatically
    updated by the script.
  * Fixed errors in API example code for
    flink:vkUpdateDescriptorSetWithTemplateKHR and
    flink:vkCmdPushDescriptorSetWithTemplateKHR.

New Extensions:

  * Add +vk.xml+ entries for pending `VK_ANDROID_native_buffer` extension
    (note, this extension is not yet enabled).
  * `VK_AMD_shader_image_load_store_lod`

-----------------------------------------------------

Change log for September 15, 2017 Vulkan 1.0.61 spec update:

  * Bump API patch number and header version number to 61 for this update.

GitHub Issues:

  * Provide alternate length attributes (altlen=) in the XML schema, for
    those using length attributes to generate code instead of documentation
    (public issue 555).
  * Fix erroneous references to `latex:` being used for asciidoc math
    markup, rather than `latexmath:` (public pull request 556).
  * Add author ID to XML for Kazan software renderer (public pull request
    557).

Internal Issues:

  * Add the <<fundamentals-abi,Application Binary Interface>> section
    describing platform ABI requirements and recommendations, add examples
    of function and function pointer declarations to the
    <<boilerplate-platform-specific-calling-conventions, Platform-Specific
    Calling Conventions>> section, and remove related language that existed
    elsewhere in the specification (internal issue 64).
  * Describe where to document valid usage interactions of chained
    structures in the style guide, and fix one case now appearing in
    slink:VkBufferCreateInfo instead of the child
    slink:VkDedicatedAllocationBufferCreateInfoNV structure (internal issue
    715).
  * Add example to the style guide of describing enumerated types which are
    empty when the spec is built without relevant extensions enabled, and
    apply it to existing examples for
    elink:VkDescriptorSetLayoutCreateFlagBits and
    elink:VkSubpassDescriptionFlagBits (internal issue 864).
  * Add a note to the <<fundamentals-validusage-enums, Valid Usage for
    Enumerated Types>> section that the special values suffixed with
    etext:_BEGIN_RANGE, etext:_END_RANGE, etext:_RANGE_SIZE and
    etext:_MAX_ENUM are not part of the API and should: not be used by
    applications (internal issue 872).
  * Added note to flink:vkCmdUpdateBuffers explaining the performance
    penalty for copies done in this way, and why the upper copy limit is
    what it is (internal issue 952).
  * Update `VK_KHX_device_group` to split some functionality into the new
    `VK_KHR_bind_memory2` extension, and rename that functionality (internal
    issue 969).
  * Remove *Status* fields from extension appendices, since they are by
    definition published and complete by the time they reach the public
    GitHub repository (internal issue 973).

Other Issues:

  * Update Data Format specification dependency to version 1.2 and change
    references to DF sections accordingly.
  * Update XML to make the pname:pAllocator parameter of
    flink:vkRegisterDeviceEventEXT and flink:vkRegisterDisplayEventEXT in
    the `VK_EXT_display_control` extension as optional.

New Extensions:

  * `VK_KHR_bind_memory2`
  * `VK_KHR_image_format_list`
  * `VK_KHR_maintenance2`
  * `VK_KHR_sampler_ycbcr_conversion`

-----------------------------------------------------

Change log for September 5, 2017 Vulkan 1.0.60 spec update:

  * Bump API patch number and header version number to 60 for this update.

GitHub Issues:

  * Document that <<queries-timestamps, Timestamp Queries>> can only be
    meaningfully compared when they are written from the same queue (public
    issue 216).
  * Document that the `<extension>` tag `type` attribute is required for
    non-disabled extensions (derived from, but does not close public issue
    354).
  * Clean up registry schema length attribute descriptions to be consistent
    and correct (public issue 555).

Internal Issues:

  * Replace as much of the hand-written extension appendix metadata as
    possible with asciidoc includes generated from corresponding attributes
    of +vk.xml+, and enhance the style guide to match. This avoids
    inconsistencies between +vk.xml+ and the appendices, and produces a more
    uniform style (internal issue 137).
  * Remove the generated extDependency.{py,sh} files from the tree and
    create them dynamically on demand instead, reducing merge conflicts
    (internal issue 713).
  * Add a prototype tool for generating in-place difference markup for
    sections guarded by asciidoc conditionals, and new syntax for open
    blocks to support it (internal issue 833).
  * Remove unnecessary restriction of etext:*SYNC_FD_BIT_KHR external handle
    types to the same physical device in the
    slink:VkPhysicalDeviceIDPropertiesKHR,
    flink:VkImportMemoryWin32HandleInfoKHR,
    slink:VkImportFenceWin32HandleInfoKHR, slink:VkImportFenceFdInfoKHR,
    slink:VkImportSemaphoreWin32HandleInfoKHR,
    slink:VkImportSemaphoreFdInfoKHR
    <<external-memory-handle-types-compatibility, External memory handle
    types compatibility>>, <<external-semaphore-handle-types-compatibility,
    External semaphore handle types compatibility>>, and
    <<external-fence-handle-types-compatibility, External fence handle types
    compatibility>> sections (internal issue 956).

Other Issues:

  * Remove dependency of +VK_KHX_device_group+ on +VK_KHR_swapchain+ (there
    is an interaction, but not a strict dependency), and add a new
    `extension` attribute to the `<require` XML tag to allow classifying a
    subset of interfaces of an extension as requiring another extension.
    Update the registry schema and documentation accordingly.

New Extensions:

  * `VK_AMD_shader_fragment_mask` (and related `GL_AMD_shader_fragment_mask`
    GLSL extension)
  * `VK_EXT_sample_locations`
  * `VK_EXT_validation_cache`

-----------------------------------------------------

Change log for August 19, 2017 Vulkan 1.0.59 spec update:

  * Bump API patch number and header version number to 59 for this update.

GitHub Issues:

  * Fix a few missing Implicit Valid Usage statements to indicate that a
    common parent of two objects is required (public issue 497).
  * Clarify render pass synchronization language for
    slink:VkSubpassDependency and <<renderpass,render passes>> (public
    issue 531).
  * Rename ename:VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT to
    ename:VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT for consistency, and
    add an alias for backwards compatibility (public issue 539).

Internal Issues:

  * Add an explanation to the <<interfaces-builtin-variables-layer,
    code:Layer>> description explaining that writing to invalid layers
    results may or may not result in primitives being processed and fragment
    shaders being run, and gives undefined results in the framebuffer
    (internal issue 614)
  * Add valid usage statement for slink:VkDescriptorSetLayoutBinding
    requiring that input attachment descriptor bindings must not use
    non-fragment stages (internal issue 933).

Other Issues:

  * Makes description of pname:loadOp and pname:storeOp easier to read in
    the <<renderpass-load-store-ops>> section.

New Extensions:

  * `VK_EXT_shader_stencil_export`

-----------------------------------------------------

Change log for August 14, 2017 Vulkan 1.0.58 spec update:

  * Bump API patch number and header version number to 58 for this update.

GitHub Issues:

  * Update the <<interfaces-resources-descset,Descriptor Set Interface>>
    section to allow multiple variables with the same descriptor set/binding
    decorations, and require that all variables that are statically used
    must be consistent with the pipeline layout. Allow
    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER to be used with texture
    and sampler variables (public issues 522, 524).

Internal Issues:

  * Replace networkx package used for extension dependency generation with a
    homegrown network dependency traverser (internal issue 713).
  * Specify in the <<interfaces-fragmentoutput, Fragment Output Interface>>
    section that if a fragment shader writes integers that cannot be
    represented in the format of the color attachment, then the result is
    undefined (internal issue 893).
  * Separate malformed valid usage statement for
    slink:VkPipelineRasterizationStateCreateInfo into two (internal issue
    918).
  * Fix cases where the term 'pNext chain' is incorrectly used in reference
    to functions, rather than their parameters. Replace 'pNext list' with
    'pNext chain'. Fixed typo in the example code of
    +VK_KHR_dedicated_allocation+ (internal issue 944).
  * Fix typo in elink:VkExternalSemaphoreHandleTypeFlagBitsKHR enum
    descriptions, replacing
    etext:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_FENCE_FD_BIT_KHR with
    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR, and make the
    description more consistent with
    VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR (internal issue 950).

Other Issues:

  * Clarify how pipeline stage masks affect
    <<synchronization-pipeline-stages-masks, access and synchronization
    scopes>>.
  * Clarify that dedicated allocations do not allow aliasing in the
    flink:vkBindBufferMemory and flink:vkBindImageMemory valid usage
    statements.
  * Correct specification of pname:dynamicCount for push_constant token in
    slink:VkIndirectCommandsLayoutNVX.

New Extensions:

  * `VK_EXT_shader_viewport_index_layer`

-----------------------------------------------------

Change log for August 1, 2017 Vulkan 1.0.57 spec update:

  * Bump API patch number and header version number to 57 for this update.

GitHub Issues:

  * Fix error in description of ename:VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK
    block size (public issue 342).
  * Update documentation of ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT
    to explicitly mention both graphics and compute pipelines (public issue
    525).

Internal Issues:

  * Document that
    slink:VkPhysicalDeviceLimits::pname:framebufferColorSampleCounts does
    not cover integer formats (internal issue 550).
  * Add a note under slink:VkImageViewCreateInfo describing how values meant
    for one format can be sanitized when used via another format (internal
    issue 927).
  * Add valid usage statements to ftext:vkCmd* documenting that image
    subresources used as attachments must not be accessed as non-attachments
    in a render pass (internal issue 929).
  * Remove obsolete 'validextensionstructs' attribute from +vk.xml+, the XML
    schema, and the schema documentation (internal issue 946).

New Extensions:

  * `VK_AMD_mixed_attachment_samples`
  * `VK_EXT_post_depth_coverage`
  * `VK_KHR_relaxed_block_layout`

-----------------------------------------------------

Change log for July 21, 2017 Vulkan 1.0.56 spec update:

  * Bump API patch number and header version number to 56 for this update.

GitHub Issues:

  * Add valid usage statements for commands introduced by
    `VK_EXT_debug_report` and `VK_EXT_debug_marker` extensions, regarding
    the valid pname:object and pname:objectType values (public issue 495).
  * Modify `GL_KHR_vulkan_glsl` specification to document that uniform and
    buffer block arrays each take only a single binding (public issue 514).
  * Add `KHX` author tag to +vk.xml+ (public issue 526).

Internal Issues:

  * Document use of code: macro for non-Vulkan APIs in the style guide
    (internal issue 863).
  * Document that reference page open block delimiters must not contain
    asciidoc section markup in the style guide (internal issue 898).
  * Fix <<spirvenv,SPIR-V appendix>> to say
    code:VariablePointersStorageBuffer instead of
    code:VariablePointersUniformBufferBlock (internal issue 928).

Other Commits:

  * Add missing extension structures to dependency attributes in +vk.xml+.

New Extensions:

  * `VK_EXT_depth_range_unrestricted`

-----------------------------------------------------

Change log for July 15, 2017 Vulkan 1.0.55 spec update:

  * Bump API patch number and header version number to 55 for this update.

GitHub Issues:

  * Removed unintended optional parameter in +vk.xml+ from the
    pname:pWaitSemaphores member of slink:VkPresentInfoKHR, which resulted
    in the generation of an incorrect implicit valid usage clause allowing
    pname:pWaitSemaphores to be NULL even when pname:waitSemaphoreCount is
    non-zero (public issue 491).
  * Add missing attribute to +vk.xml+ documenting that
    slink:VkSwapchainCounterCreateInfoEXT extends
    slink:VkSwapchainCreateInfo (public issue 510).
  * Add const qualifier for some `VK_EXT_debug_market` extension command
    parameters that were missing it (public issue 513).
  * Fix definition of q and level~base~ in
    <<textures-image-level-selection,Image Level(s) Selection>> (public
    issue 515).
  * Clarify lifetime requirement for slink:VkRenderPass objects used in
    object creation (public issue 516).
  * Fix link to floating/normalized fixed-point conversion from
    <<interfaces-fragmentoutput,Fragment Output Interface>> (public issue
    521).

Internal Issues:

  * Update the style guide to include the general structure of a Vulkan
    command name, the specific rule for using "`Get`" vs. "`Enumerate`" in
    names, and a table of verbs commonly used in command names (spinoff of
    internal issue 753).
  * Clarified the behavior of automatic layout transitions in case of
    attachment views that are 2D or 2D array views of 3D images. In
    addition, restructured the valid usage clauses corresponding to the
    members of the slink:VkImageSubresourceRange structure and added missing
    valid usage clauses for its pname:baseMipLevel and pname:baseArrayLayer
    members (internal issues 803, 849).
  * Modify `GL_KHR_vulkan_glsl` specification to allow explicit std430 on a
    push_constant declaration (internal issue 919).

Other Commits:

  * Modify <<synchronization-framebuffer-regions, Framebuffer Region
    Dependencies>> to use synchronization scope terminology.
  * Add ename:VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT to the
    `VK_EXT_swapchain_colorspace` extension.
  * Replace XML comments with `comment` attributes and/or tags, to enable
    tools which transform the XML without loss of information.
  * Replace `validextensionstructs` with `structextends`, which is tagged in
    the child structure instead of the parent. This makes it slightly
    simpler to add new structs to the XML, causes fewer merge conflicts, and
    the information is kept localized to the extension structures where it
    belongs. The old `validextensionstructs` attributes will be retained
    until we're certain this doesn't cause problems with known consumers of
    +vk.xml+.

-----------------------------------------------------

Change log for July 13, 2017 Vulkan 1.0.54 spec update:

  * Bump API patch number and header version number to 54 for this update.

GitHub Issues:

Internal Issues:

  * Fix tessellation domain to have an upper-left origin in the
    <<img-tessellation-topology-ul, tessellation toplogy image>> and related
    language. CTS and all implementations were already doing this, it was
    just a documentation bug that it was flipped to lower-left (internal
    issue 603).
  * Add a section to the style guide describing how VUID tags are changed
    and removed when the corresponding Valid Usage statements are modified
    (internal issue 829).
  * Add explicit Valid Usage statement to
    slink:VkPipelineDynamicStateCreateInfo to require that members of
    pname:pDynamicStates must be unique (internal issue 851).

New Extensions:

  * `VK_KHR_16bit_storage`
  * `VK_KHR_dedicated_allocation`
  * `VK_KHR_external_fence`
  * `VK_KHR_external_fence_capabilities`
  * `VK_KHR_external_fence_fd`
  * `VK_KHR_external_fence_win32`
  * `VK_KHR_get_memory_requirements2`
  * `VK_KHR_storage_buffer_storage_class`
  * `VK_KHR_variable_pointers`

Extensions Promoted From KHX To KHR Status:

  * `VK_KHR_external_memory`
  * `VK_KHR_external_memory_capabilities`
  * `VK_KHR_external_memory_fd`
  * `VK_KHR_external_memory_win32`
  * `VK_KHR_external_semaphore`
  * `VK_KHR_external_semaphore_capabilities`
  * `VK_KHR_external_semaphore_fd`
  * `VK_KHR_external_semaphore_win32`
  * `VK_KHR_win32_keyed_mutex`

-----------------------------------------------------

Change log for June 24, 2017 Vulkan 1.0.53 spec update:

  * Bump API patch number and header version number to 53 for this update.

GitHub Issues:

Internal Issues:

  * Clarify mappings of coordinates for mutable, compatible image views in
    slink:VkImageViewCreateInfo (internal issue 815).
  * Make ename:VK_BIND_SFR_BIT require a logical device with multiple
    physical devices, so that standard sparse image block dimensions are
    only required on systems that support multi-GPU (internal issue 835).
  * Convert all files from use of // refBegin .. // refEnd comments to
    delimit ref pages, to use of open blocks, and update style guide
    accordingly (internal issue 839).
  * Add valid usage for slink:VkWriteDescriptorSet when performing updates
    to a ename:VK_STORAGE_IMAGE descriptor with layout
    ename:VK_IMAGE_LAYOUT_GENERAL.
  * Add a hack to the validity generator script to support an odd
    interaction between flink:vkCmdFillBuffer and an extension (internal
    issue 853).
  * Remove redundant text describing slink:VkBufferCreateInfo::pname:usage,
    which was already covered by implicit valid usage (internal issue 854).
  * Update implicit validity generator script to properly handle the
    pname:sType and pname:pNext members of "returnedonly" structures
    (internal issue 874).
  * Note that slink:VkApplicationInfo::pname:pApplicationName &
    slink:VkApplicationInfo::pname:pEngineName are optional, and add missing
    implicit valid usage statements for flink:vkDestroyInstance.
  * Added missing valid usage for flink:vkCmdWriteTimestamp to require a
    timestamp query pool.
  * Simplify and/or split "`non-atomic`" valid usage statements.

New Extensions:

  * `VK_AMD_gpu_shader_int16`
  * `VK_EXT_blend_operation_advanced`
  * `VK_EXT_sampler_filter_minmax`
  * `VK_NV_framebuffer_mixed_samples`

-----------------------------------------------------

Change log for June 13, 2017 Vulkan 1.0.52 spec update:

  * Bump API patch number and header version number to 52 for this update.

GitHub Issues:

Internal Issues:

  * Clarify behavior when non-coherent memory has
    <<memory-device-unmap-does-not-flush, not been flushed before being
    unmapped>> (internal issue 819).
  * Fix description of code:WorkgroupSize builtin to note it decorates an
    object, not a variable (internal issue 836).
  * Fix asciidoc attributes so that trailing '{plus}' symbols in [eq] style
    equations are rendered properly (internal issue 845).
  * Add language to the "`Extension Handles, Objects, Enums, and Typedefs`"
    section of the Procedures and Conventions document stating that any new
    handle type requires a corresponding entry in the elink:VkObjectType
    enumerated type (internal issue 856).
  * Update style guide to use slink macro for Vulkan handle type names, and
    define narrow conditions under which to use the *name and *text macros
    instead of *link (internal issue 886).
  * Add a dependency of the <<VK_KHX_device_group,VK_KHX_device_group>>
    extension on VK_KHX_device_group_creation to +vk.xml+ and the extension
    appendix.
  * Change the copyright on Vulkan specification asciidoc *source* files to
    CC-BY 4.0, and update the proprietary Khronos copyright applied to the
    generated *output* formats (internal issue 327). This enables broader
    reuse and modification of the Vulkan specification sources, while not
    affecting the Reciprocal IP License between Vulkan Adopters and Working
    Group Members.

New Extensions:

  * `VK_NV_fill_rectangle`
  * `VK_NV_fragment_coverage_to_color`

-----------------------------------------------------

Change log for June 4, 2017 Vulkan 1.0.51 spec update:

  * Bump API patch number and header version number to 51 for this update.

GitHub Issues:

  * Add Valid Usage statement to flink:vkCmdResolveImage to require that
    source and destination image formats match (public issue 492).
  * Specify that a code:char* parameter must: be a valid null-terminated
    string in the <<fundamentals-implicit-validity, implicit valid usage>>
    section (public issue 494).
  * Removed unnecessary VU for slink:VkPhysicalDeviceFeatures which is
    covered by ename:VK_ERROR_FEATURE_NOT_PRESENT already (public issue
    496).
  * Clarify valid usage of pname:pQueueFamilyIndices in
    slink:VkBufferCreateInfo, slink:VkImageCreateInfo, and
    slink:VkSwapchainCreateInfoKHR (public issue 501).
  * Document that dependencies of enabled extensions must also be enabled in
    the <<extended-functionality-extensions-dependencies, Extension
    Dependencies>> section (public issue 507).

Internal Issues:

  * Change slink:VkMappedMemoryRange valid usage to allow pname:offset
    {plus} pname:size == size of the allocation. Also, if
    ename:VK_WHOLE_SIZE is used, require the end of the mapping to be
    aligned to a multiple of pname:nonCoherentAtomSize (internal issue 611).
  * Add issue to `VK_KHR_win32_surface` about reusing window objects from a
    different graphics API or Vulkan ICD (internal issue 639).
  * Require locations on user in/out in `GL_KHR_vulkan_glsl` (internal issue
    783).
  * Added version info to the json validation output, and updated the schema
    to match (internal issue 838).
  * Restructure enumerated type descriptions separately from the command or
    structure they are used in, allowing better reference page generation
    (internal issue 841).
  * Re-sort extension appendices to be in alphabetical order within each
    author ID section.
  * Fix enum naming and clarify behavior for
    `VK_NVX_device_generated_commands` extension.

-----------------------------------------------------

Change log for May 20, 2017 Vulkan 1.0.50 spec update:

  * Bump API patch number and header version number to 50 for this update.

GitHub Issues:

  * Fix numerous minor issues with the VK_EXT_debug_report extension (public
    issues 478, 483, 486, 489, 490).

Internal Issues:

  * Update flink:vkAllocateDescriptorSets to specify conditions under which
    to return ename:VK_ERROR_FRAGMENTED_POOL or
    ename:VK_ERROR_OUT_OF_POOL_MEMORY instead of
    out-of-host/out-of-device-memory, and improve the
    <<fundamentals-errorcodes, description of those errors (internal issue
    654).
  * Add a NOTE documenting that flink:vkAcquireNextImageKHR can only signal
    a single semaphore, and how to deal with that when multiple physical
    devices in a logical device need to wait on it (internal issue 730).
  * Improve description of pname:pNext chains of
    slink:VkPhysicalDeviceImageFormatInfo2KHR and
    slink:VkImageFormatProperties2KHR (internal issue 814).
  * Clean up math markup issues in the <<textures, Image Operations>>
    chapter (internal issue 818).
  * Update validusage target to use more robust code for preprocessing, by
    making direct use of Asciidoctor's preprocessor. Added uniqueItems check
    to JSON vu schema and add clean_validusage target (internal issue 826).
  * Update style guide to prohibit writing non-self-contained (on a single
    bullet point) Valid Usage statements, and modify offending Valid Usage
    statements in the Specification to match, to assist with automatic
    extraction for the validation layers (internal issue 828).
  * Add ename:VK_VALIDATION_CHECK_SHADERS_EXT to elink:VkValidationCheckEXT
    of the `VK_EXT_validation_flags` extension, to selectively disable
    shader validation.
  * Remove duplicate valid usage statement for slink:VkImageMemoryBarrier.
  * Modify reflow.py script to place VUID tag anchors standalone on a line
    following their corresponding bullet point, and reflow the spec text
    accordingly (this had been pending since the initial tag deployment).

New Extensions:

  * `VK_AMD_texture_gather_bias_lod`

-----------------------------------------------------

Change log for May 12, 2017 Vulkan 1.0.49 spec update:

  * Bump API patch number and header version number to 49 for this update.

GitHub Issues:

  * Modify reference page extraction script to make internal links to spec
    anchors refer to the core specification instead of being dangling links
    (public issue 455).
  * Fix GL_KHR_vulkan_glsl typo and add a nor-normative mapping to the newly
    published StorageBuffer class (public issue 466).
  * Both flink:vkEnumerateInstanceExtensionProperties and
    flink:vkEnumerateDeviceExtensionProperties return
    ename:VK_ERROR_LAYER_NOT_PRESENT, which covers the error case of an
    application providing a layer name that wasn't returned by
    ftext:vkEnumerate{Instance|Device}LayerProperties (public issue 487).
  * The specification for flink:VkApplicationInfo::apiVersion says that the
    driver must return ename:VK_ERROR_INCOMPATIBLE_DRIVER in the case that
    pname:apiVersion specifies a non-supported version. That means that the
    valid usage should not also state that, and so the VU statement is
    removed. The VU had language about "`an effective substitute`" that
    would have been lost, and so it was moved to the pname:apiVersion
    description (public issue 488).

Internal Issues:

  * Modify implicit validity generator script to assign asciidoc anchors to
    all valid usage statements it generates, and reflow.py script to insert
    Valid Usage ID (VUID) tags into the specification source files for
    explicit valid usage statements. This has no semantic effects on the
    specification, but will support the validation layer's detection of
    valid usage violations and allow it to link into the corresponding part
    of the specification (internal issue 583).
  * Assign VUID tags to all explicit VU statements and document
    the process and tag format in the style guide (internal issue 583).
  * Clarify the rules of whether to structure new functionality as instance
    extensions, device extensions, or both in the
    <<extended-functionality-instance-extensions-and-devices, Instance
    Extensions and Device Extensions>> section (internal issue 749).
  * Require that SPIR-V run-time arrays are only used with the
    code:BufferBlock decoration (internal issue 750).
  * Fix implicit and explicit valid usage statements for
    slink:VkWriteDescriptorSet::pname:dstSet (internal issue 767)
  * Fix SPIR-V code sample for ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
    in the <<descriptorsets-uniformtexelbuffer, Uniform Texel Buffer>>
    section (internal issue 770).
  * Clarify that disabling depth testing also disables depth writes in the
    <<fragops-ds-state, Depth and Stencil Operations>> section (internal
    issue 775).
  * flink:VkDescriptorImageInfo::pname:imageLayout must match the actual
    imageLayout at the time the image is accessed. This was in the spec
    text, but needed an associated valid usage statement.
  * Note that only 32-bit atomic operations are supported in the
    <<spirvenv-module-validation, Validation Rules within a Module>>
    section.
  * Note that code:UniformConstant variables must not have initializers in
    the <<spirvenv-module-validation, Validation Rules within a Module>>
    section.
  * Add a new elink:VkObjectType enumeration to the core API, promoted from
    elink:VkDebugObjectTypeEXT, since it is used for much more than just the
    debug_report extension.

New Extensions:

  * `VK_KHR_get_surface_capabilities2`
  * `VK_KHR_shared_presentable_image`

-----------------------------------------------------

Change log for April 15, 2017 Vulkan 1.0.48 spec update:

  * Bump API patch number and header version number to 48 for this update.

Internal Issues:

  * Add missing VU statements for flink:vkUpdateDescriptorSets (internal
    issue 333).
  * Correct swapped ifdef/ifndef blocks for `VK_KHR_maintenance1` extension
    (internal issue 776).

-----------------------------------------------------

Change log for April 8, 2017 Vulkan 1.0.47 spec update:

  * Bump API patch number and header version number to 47 for this update.

GitHub Issues:

  * Allow <<synchronization-pipeline-barriers-subpass-self-dependencies,
    self-dependencies>> (also described for slink:VkSubpassDependency) to
    have earlier stages depend on later stages if all stages are
    framebuffer-space (public issue 125).
  * Clarify when pipeline state structures are ignored in the
    slink:VkGraphicsPipelineCreateInfo structure, when the tessellation
    structure must be valid, and remove 'if `NULL`' descriptions from the
    valid usage statements (public issue 445).
  * Remove the obsolete "validextensionstructs" attribute for
    flink:VkPresentRegionsKHR. This caused a pname:pNext valid usage
    statement to be generated which wasn't consistent with what is stated in
    the spec (public issue 481).

Internal Issues:

  * Clarify facingness of non-polygon fragments for slink:VkStencilOpState
    and in the code:FrontFacing <<interfaces-builtin-variables,built-in
    variable description>>. Define 'facingness' of a fragment as a distinct
    term from facingness of a polygon (internal issue 662).
  * Clarify that the texture compression features (e.g.
    pname:textureCompressionBC) means that all formats of that type
    (<<features-features-textureCompressionASTC_LDR,ASTC>>,
    <<features-features-textureCompressionETC2,ETC2>>,
    <<features-features-textureCompressionBC,BC>>) are supported, and that
    support for individual formats may: queried separately (internal issue
    663).
  * Clarify in the valid usage for slink:VkBindImageMemoryInfoKHX that each
    SFR rectangle must be a multiple of the sparse block size for each
    aspect, e.g. in a depth/stencil image using separate depth/stencil
    planes (internal issue 721).
  * Re-remove KHX variants of KHR structure types after promotion (internal
    issue 762).

-----------------------------------------------------

Change log for March 31, 2017 Vulkan 1.0.46 spec update:

  * Bump API patch number and header version number to 46 for this update.

GitHub Issues:

  * Add language to the <<fundamentals-validusage-enums, Valid Usage for
    Enumerated Types>> section allowing values to be returned from Vulkan
    that are not present in extensions explicitly enabled by the
    application, similar to existing language for bit flags in the
    <<fundamentals-validusage-flags, Valid Usage for Flags>> section (public
    issue 442).
  * *Important*: run `gem update --pre asciidoctor-pdf` before trying to
    build this version of the spec - 1.5.0.alpha15 is required for this
    change. Removes the monkey patch currently used to draw valid usage
    blocks across multiple pages which had numerous issues. A fixed version
    was incorporated into asciidoctor-pdf for the latest release, so the
    monkey patch or any variant thereof is no longer required (public issue
    465).

Internal Issues:

  * Add ename:VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT
    to `VK_EXT_debug_report` extension
  * Fix ptext:pNext member of
    slink:VkPhysicalDeviceDiscardRectanglePropertiesEXT to be a non-const
    pointer. Properties structures return values, so the chain should be
    non-const.
  * Explicitly remove gl_NumSamples from the `GL_KHR_vulkan_glsl` extension,
    against 1.0 (internal issue 612).
  * Add Valid Usage statements requiring that each structure type valid in a
    ptext:pNext chain must: not appear more than once in a chain (internal
    issue 752).
  * Use ename:VK_USE_PLATFORM_WIN32_KHX in the
    `VK_KHX_external_memory_win32` extension, rather than etext:_KHR
    (internal issue 754).

New Extensions:

  * `VK_KHR_incremental_present`

-----------------------------------------------------

Change log for March 24, 2017 Vulkan 1.0.45 spec update:

  * Bump API patch number and header version number to 45 for this update.

GitHub Issues:

  * Defined the lifetime of the memory pointed to by
    slink:VkDisplayPropertiesKHR::pname:displayName to be equal to that of
    its associated display handle (public issue 460).
  * Correct several cases where the sparse memory feature name
    pname:residencyNonResidentStrict was written as
    pname:sparseResidencyNonResidentStrict (public issue 475).

Internal Issues:

  * Fix ptext:pNext member of slink:VkPhysicalDeviceGroupPropertiesKHX to be
    a non-const pointer. Properties structures return values, so the chain
    should be non-const.
  * Clarify definition of memory aliasing to consistently use the terms
    "linear" and "non-linear" when referring to resources, and define what
    those terms mean.
  * Modified XML schema and implicit validity scripts to generate language
    for all ptext:pNext values in a ptext:pNext chain instead of just the
    top level struct, and made `noautovalidity` functional for ptext:sType
    and ptext:pNext (internal issue 535).
  * Add more detail for BT2020 and scRGB color spaces in
    `VK_EXT_swapchain_colorspace` extension (internal issue 632).
  * Add naming rules for Extension Structure Names (structures added to the
    ptext:pNext chain of a base structure) to the style guide (internal
    issue 706).
  * Define the glossary term "ptext:pNext chain", and use it consistently in
    the spec (internal issue 744).

-----------------------------------------------------

Change log for March 17, 2017 Vulkan 1.0.44 spec update:

  * Bump API patch number and header version number to 44 for this update.

GitHub Issues:

  * Fix description of <<features-extentperimagetype, Allowed Extent Values
    Based On Image Type>> (public issue 290).
  * Better specify VK_DEVICE_LOST behavior around flink:vkQueueSubmit,
    flink:vkWaitForFences, and flink:vkGetFenceStatus (public issue 423).
  * Clarify definition of flink:vkGetQueryPoolResults::pname:queryCount
    (public issue 441).
  * Simplify and clean up normative language. Remove shall and replace
    recommend and variants with should wherever possible (public issue 448).
  * Fix all dangling internal cross-references in the 1.0-extensions
    specification, and add scripts/checkXrefs to find these in the future
    (public issue 456).
  * Reverse order of ChangeLog.txt entries so the most recent version is
    documented first (public issue 463)
  * Removes "become invalid" which clashes with invalid state for command
    buffers. (public issue 467)
  * Disallowed pending state in spec text for vkResetCommandBuffer, matching
    valid usage (public issue 468)
  * Removes sentence describing invalid state "like initial state". (public
    issue 469)
  * Disallows begin command buffer from resetting command buffers in the
    "recording" state. (public issue 470)
  * Removes mention of state from description of
    VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT (public issue 471)
  * Removed extra valid usage statement in VkSubmitInfo (public issue 472)

Internal Issues:

  * Clarify description of the pname:imageLayout member of
    sname:VkDescriptorImageInfo.
  * Fix typos where etext:VK_VIEW_TYPE* was used instead of
    etext:VK_IMAGE_VIEW_TYPE.
  * Removed the <<VK_KHR_display>> and <<VK_KHR_display_swapchain>> example
    code from the specification and noted it has been moved to the Vulkan
    SDK cube demo (internal issue 179).
  * Reorder VkExternalMemoryHandleTypeFlagBitsNV description (internal issue
    480).
  * Clarify than an implementation is
    <<fundamentals-validusage-flags,permitted to return 'undefined' bit
    flags>> in a bitfield (internal issue 640).
  * Break Valid Usage statements describing unrelated parameters into
    separate statements, and add a style guide entry to follow this approach
    (internal issue 685).
  * Move valid usage statement for slink:VkImageCreateInfo from spec body to
    the explicit valid usage block (internal issue 693).
  * Fix typos in the descriptions of slink:VkDisplaySurfaceCreateInfoKHR,
    flink:vkCreateDisplayModeKHR, and
    flink:vkGetDisplayPlaneSupportedDisplaysKHR in the <<display,Presenting
    Directly to Display Devices>> section (internal issue 698, 704, 716).
  * Clarified that mandatory depth/stencil formats are only a requirement
    for 2D images (internal issue 719).
  * Clarify that variables decorated with DeviceIndex/ViewIndex must be in
    the Input storage class (internal issue 733).
  * Work around generator script problem with removal of Unicode literals
    from Python 3.0-3.2 using `future` package (internal issue 737).
  * Remove nonexistent structure type enums from vk.xml (internal issue
    738).
  * Fix validextensionstructs attributes for structures in the pname:pNext
    chain for VkPresentInfoKHR, fixing implicit valid usage statements for
    those structures (internal issue 740).

-----------------------------------------------------

Change log for March 10, 2017 Vulkan 1.0.43 spec update:

  * Bump API patch number and header version number to 43 for this update.

GitHub Issues:

  * Make clearer that color write mask is applied regardless of whether
    blending is enabled, by referring to the
    <<framebuffer-color-write-mask,Color Write Mask>> section (public issue
    241).
  * Fix public issue 414:
  ** Added two new command buffer states (invalid, pending), and an explicit
     "command buffer lifecycle" section to explain them.
  ** Replaced "pending execution" with "in the pending state".
  ** Replaced a bunch of "this will invalidate the command buffer" language
     with "this will move the command buffer to the invalid state", and added
     validation language for what state those command buffers should be in.
  ** Added additional validation language about what state a command buffer
     should be in for various commands that affect it.
  ** Added invalidation language to destroy commands in the lifetimes section
     of fundamentals.
  ** Added command buffers to list of objects which must not be deleted
     whilst a (primary) command buffer is in the recording or pending state.
  * Update `GL_KHR_vulkan_glsl` extension to allow anonymous push constant
    blocks (public issue 428).

Internal Issues:

  * Document rules about extension interactions in the style guide (internal
    issue 579).
  * Require ename:VK_PRESENT_MODE_MAILBOX_KHR support in queries of surfaces
    created with flink:vkCreateWaylandSurfaceKHR using the
    VK_KHR_wayland_surface extension (internal issue 666).
  * Remove Valid Usage constraints for flink:vkAllocateDescriptorSets when
    the `VK_KHR_maintainance1` extension is present (internal issue 686).
  * Remove undocumented KHX-variants of vkGetPhysicalDeviceProperties2KHR
    and vkGetPhysicalDeviceImageFormatProperties2KHR from the
    <<VK_KHX_external_memory_capabilities>> and
    <<VK_KHX_external_semaphore_capabilities>> extensions.

New Extensions:

  * `VK_EXT_hdr_metadata`
  * `VK_GOOGLE_display_timing`

-----------------------------------------------------

Change log for February 27, 2017 Vulkan 1.0.42 spec update:

  * Bump API patch number and header version number to 42 for this update
    (the first anniversary edition).

GitHub Issues:

  * Changed Asciidoctor macros so cross-page links in the standalone
    reference pages function properly (public issue 462).

Internal Issues:

  * Clarified host visibility discussion for slink:VkMemoryType,
    flink:vkInvalidateMappedMemoryRanges, elink:VkAccessFlagBits, and the
    <<synchronization-framebuffer-regions,Framebuffer Region Dependencies>>
    section, removing duplicated information and adding a central definition
    in the access types section (internal issue 552).
  * Change description of
    slink:vkGetPhysicalDeviceSurfacePresentModesKHR::pname:pPresentModes to
    return an array of values, not structures (internal issue 699).

New Extensions:

  * Add a NOTE to the <<extensions,Layers & Extensions>> chapter describing
    the experimental status of `KHX` extensions.
  * Add new Khronos, Khronos Experimental, and vendor Vulkan extensions for
    release at GDC:
  ** VK_KHR_descriptor_update_template
  ** VK_KHR_push_descriptor
  ** VK_KHX_device_group
  ** VK_KHX_device_group_creation
  ** VK_KHX_external_memory
  ** VK_KHX_external_memory_capabilities
  ** VK_KHX_external_memory_fd
  ** VK_KHX_external_memory_win32
  ** VK_KHX_external_semaphore
  ** VK_KHX_external_semaphore_capabilities
  ** VK_KHX_external_semaphore_fd
  ** VK_KHX_external_semaphore_win32
  ** VK_KHX_multiview
  ** VK_KHX_win32_keyed_mutex
  ** VK_EXT_discard_rectangles
  ** VK_MVK_ios_surface
  ** VK_MVK_macos_surface
  ** VK_NVX_multiview_per_view_attributes
  ** VK_NV_clip_space_w_scaling
  ** VK_NV_geometry_shader_passthrough
  ** VK_NV_sample_mask_override_coverage
  ** VK_NV_viewport_array2
  ** VK_NV_viewport_swizzle
  * Add new GLSL vendor extensions to support new builtin variables:
  ** GL_EXT_device_group
  ** GL_EXT_multiview

-----------------------------------------------------

Change log for February 17, 2017 Vulkan 1.0.41 spec update:

  * Bump API patch number and header version number to 41 for this update.

GitHub Issues:

  * Made all uses of `NULL` vs. code:VK_NULL_HANDLE consistent (public issue
    276).
  * Clarify render pass compatibility in different usage scenarios (public
    issues 403 and 404).
  * Add valid usage statements to slink:VkFramebufferCreateInfo requiring
    that the width, height, and number of layers of the framebuffer all be
    nonzero (public issue 432).
  * Allow `offset` and `align` in any GLSL version for the
    `GL_KHR_vulkan_glsl` extension (public issue 435).
  * Specify lifetime of string objects passed to the
    tlink:PFN_vkDebugReportCallbackEXT user callback in the
    +VK_EXT_debug_report+ extension (public issue 446).
  * Fix inter-page links in multi-file reference pages (public issue 454).

Internal Issues:

  * Update valid usage language for slink:VkImageCreateInfo to disallow
    creating images that have ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
    set without other attachment usage bits
    (ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,
    ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, or
    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) (internal issue 540).
  * Disable `VK_EXT_swapchain_colorspace` extension until internal issues
    640 and 661 are mutually resolved.
  * Allow alternative mipmap level selection when [eq]#lambda == 0.5# during
    texture <<textures-image-level-selection,Image Level(s) Selection>>
    (internal issue 680).

Other Issues:

  * Add a clarification to the style guide that the extension revision
    number is treated as a patch number, so that changes to published
    extensions should only include bug fixes and spec clarifications.

-----------------------------------------------------

Change log for February 10, 2017 Vulkan 1.0.40 spec update:

  * Bump API patch number and header version number to 40 for this update.
  * There is a major build change in this release. We are now using the
    Ruby-based ``asciidoctor'' implementation, rather than the Python-based
    ``asciidoc'' implementation, to process the specification. While the
    actual specification markup changes were minimal, this requires a new
    set of build tools and a very different installation process, especially
    because we now use an experimental direct-to-PDF backend for Asciidoctor
    instead of Docbook->dblatex->PDF. It is no longer possible to build the
    Specification using asciidoc. See doc/specs/vulkan/README.adoc
    for some guidance on installing the new toolchain components.
  * There are some minor rendering issues in the PDF output due to teething
    problems with the Asciidoctor toolchain, especially with mathematical
    equations. We are aware of these and working on them.

GitHub Issues:

  * Updated sample code for the <<sparsememory-examples-basic,sparse
    resource binding example>> (public issue 97).
  * Modify line and point clipping behavior in the
    <<vertexpostproc-clipping, Primitive Clipping>> section to allow for
    pop-free behavior. The ability to check for which behavior is
    implemented may be added a future feature or extension (public issue
    113).
  * Unify the discussions of implicit ordering throughout the spec, in
    particular in the new sections <<drawing-primitive-order, Primitive
    Order>>, <<primsrast-order, Rasterization Order>>, and
    <<synchronization-implicit, Implicit Synchronization Guarantees>>; the
    discussion of <<synchronization-submission-order, submission order>>;
    and references elsewhere to these sections (public issue 133).
  * Clarify <<descriptorsets-compatibility,Pipeline Layout Compatibility>>
    language and introduce the term ``identically defined'' (public issue
    164).
  * Add a dependency to the +VK_EXT_debug_marker+ extension that is needed to
    reuse the object type enum from +VK_EXT_debug_report+, and moves the
    definition of that enum into +VK_EXT_debug_report+ where it should be
    (public issue 409).
  * Remove redundant valid usage statement from slink:VkImageBlit (public
    issue 421).
  * Update GL_KHR_vulkan_glsl to allow the ternary operator to result in a
    specialization constant (public issue 424).
  * Fix valid usage for flink:VkPipelineShaderStageCreateInfo (public issue
    426).
  * Correct typo in New Objects list for <<VK_EXT_debug_report>> (public
    issue 447).

Internal Issues:

  * Moved to Asciidoctor for spec builds (internal issue 121).
  * Update style guide to describe where to put new extensions-specific
    asciidoc files, and what to name them (internal issue 626).
  * Add src/spec/indexExt.py to autogenerate registry index entries linking
    into the 1.0-extensions specification, instead of maintaining the index
    manually. (internal issue 642).
  * Autogenerate extension dependencies and lists of all extensions and all
    KHR extensions from the "supported" attributes in +vk.xml+. Execute
    +make config/extDependency.sh+ from +doc/specs/vulkan+ when a supported
    extension is added to vk.xml, to regenerate the dependency script. The
    consequence is that specifying a single extension to the +makeExt+
    script will automatically enable all extensions it depends on as well,
    and that the +makeAllExts+ and +makeKHR+ scripts do not need to be
    updated when a new extension is supported (internal issue 648).
  * Put extension appendices all at the same asciidoc section level, so KHR
    WSI extensions show up in the HTML index (internal issue 648).

Other Issues:

  * Imbed images in the generated HTML specs instead of loading them from
    the images/ directory.
  * Fix missing EXT in extension name
    (ename:VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME).
  * Add new +VK_EXT_SMPTE_2086_metadata+ extension.
  * In the <<platformCreateSurface_xlib,Xlib Surface>> section of the
    `VK_KHR_xlib_surface` specification, add language warning users that
    they always need to call code:XinitThreads.
  * Use the term "presentable image" (rather than "swapchain image")
    consistently in `VK_KHR_swapchain` and related extensions, and add a
    glossary term defining it.
  * Relocate the valid usage for samples of
    flink:vkGetPhysicalDeviceSparseImageFormatProperties2KHR::pname:pFormatInfo
    to be below the flink:VkPhysicalDeviceSparseImageFormatInfo2KHR
    structure.

-----------------------------------------------------

Change log for January 23, 2017 Vulkan 1.0.39 spec update:

  * Bump API patch number and header version number to 39 for this update.

GitHub Issues:

  * Clarified that only accesses via the specified buffer/image subresource
    ranges are included in the access scopes (public issue 306).
  * Add missing valid usage statements for flink:vkCreateComputePipelines
    and flink:vkCreateGraphicsPipelines (public issue 427).

Internal Issues:

  * Add a Note to the <<invariance,Invariance>> appendix about a difference
    between OpenGL and Vulkan with regards to how primitives derived from
    offsets are handled (internal issue 355).
  * Add the +<<VK_KHR_get_physical_device_properties2>>+,
    +<<VK_KHR_maintenance1>>+, and +<<VK_KHR_shader_draw_parameters>>+
    extensions (internal issue 448).
  * Add the +<<VK_EXT_shader_subgroup_vote>>+ and
    +<<VK_EXT_shader_subgroup_ballot>>+ extensions (internal issue 449).
  * Update the texture level-of-detail equation in the
    <<textures-scale-factor,Scale Factor Operation>> section to better
    approximate the ellipse major and minor axes (internal issue 547).
  * Forbid non-explicitly allowed uses of interface decorations in the
    introduction to the <<interfaces,Shader Interfaces>> chapter (internal
    issue 607).
  * Replace use of MathJax with KaTeX, for improved load-time performance as
    well as avoiding the scrolling-and-scrolling behavior due to MathJax
    asynchronous rendering when loading at an anchor inside the spec. This
    change also requires moving to HTML5 output for the spec instead of
    XHTML, and there is a visible difference in that the chapter navigation
    index is now in a scrollable sidebar instead of at the top of the
    document. We may or may not retain the nav sidebar based on feedback
    (internal issue 613).
  * Improve consistency of markup and formatting in extension appendices
    (internal issue 631).

Other Issues:

  * Add explicit valid usage statements to slink:VkImageCopy requiring that
    the source and destination layer ranges be contained in their respective
    source and destination images.
  * Add valid usage language for swapchain of flink:vkAcquireNextImage. If
    the swapchain has been replaced, then it should not be passed to
    flink:vkAcquireNextImage.
  * Add a valid usage statement to flink:vkCreateImageView, that the image
    must have been created with an appropriate usage bit set.
  * Noted that slink:VkDisplayPresentInfoKHR is a valid extension of
    slink:VkPresentInfoKHR in the <<wsi_swapchain,WSI Swapchain>> section.
  * Update valid usage for flink:vkCmdSetViewport and flink:vkCmdSetScissor
    to account for the multiple viewport feature. If the feature is not
    enabled, the parameters for these functions have required values that
    are defined in the <<features-features-multiViewport,multiple
    viewports>> section of the spec but were not reflected in the valid
    usage text for these functions.
  * Add the +<<VK_EXT_swapchain_colorspace>>+ extension defining common
    color spaces.

-----------------------------------------------------

Change log for December 16, 2016 Vulkan 1.0.38 spec update:

  * Bump API patch number and header version number to 38 for this update.

GitHub Issues:

  * Make ename:VK_PIPELINE_STAGE_HOST_BIT invalid for all stage masks,
    except for flink:vkCmdWaitEvents (public issue 261).

Internal Issues:

  * Added validation language for flink:vkQueueBindSparse,
    slink:VkPresentInfoKHR, and slink:VkSubmitInfo, and a note to the
    <<synchronization-semaphores-waiting,Semaphore Waiting and Unsignaling>>
    section to clarify that semaphores must be signaled and waited on in a
    1:1 fashion (internal issue 546).
  * Modify valid usage for slink:VkBufferImageCopy to only require
    pname:bufferOffset to be a multiple of the image format's element size
    when the format is not depth/stencil (internal issue 594).

Other Issues:

  * Vulkan is now a registered trademark symbol, and this is reflected in
    documents and copyright statements.

-----------------------------------------------------

Change log for December 10, 2016 Vulkan 1.0.37 spec update:

  * Bump API patch number and header version number to 37 for this update.

GitHub Issues:

  * Add usability guarantees on the values returned by
    flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR in the
    slink:VkSurfaceCapabilitiesKHR structure and by
    flink:vkGetPhysicalDeviceSurfaceFormatsKHR in the
    pname:pSurfaceFormatCount parameter (public issue 385).
  * Add elink:VkDebugReportObjectTypeEXT enumerants for new object types
    introduced by new extensions (public issue 408).
  * Add +VK_NVX_device_generated_commands+ etext:ACCESS bits and define how
    they are used (public issue 415).
  * Fix indentation for slink:VkDebugReportCallbackCreateInfoEXT member
    descriptions (public issue 419).

Internal Issues:

  * Expand requirements memory binding of non-sparse images and buffers from
    the <<resources-association,Resource Memory Association>> section into
    valid usage statements for all of the applicable API calls (internal
    issue 508).
  * Explicitly state that valid usage of flink:vkCreateImage requires that
    flink:vkGetPhysicalDeviceImageFormatProperties would return
    ename:VK_SUCCESS for the requested image configuration (internal issue
    598).

-----------------------------------------------------

Change log for December 1, 2016 Vulkan 1.0.36 spec update:

  * Bump API patch number and header version number to 36 for this update.

GitHub Issues:

  * Fix "recorded with" terminology in the valid usage language for the
    flink:vkCmdExecuteCommands::pname:pCommandBuffers parameter (public
    issue 390).
  * Modify +genvk.py+ to support specifying extensions to remove from output
    generators, allowing the extension loader +vulkan_ext.c+ to be created
    without WSI extensions which are statically exported by the Vulkan
    loader (public issue 412).
  * Added validation language for slink:VkSubpassDependency and in the
    <<synchronization-access-types-supported,supported access types>>
    section to catch access masks that include bits which are not supported
    by pipeline stages in the stage masks (partially addresses
    github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues/1006 ).

Internal Issues:

  * Added validation language for flink:vkCmdWaitEvents,
    flink:vkQueueSubmit, flink:VkRenderPassCreateInfo, and in the
    <<synchronization-pipeline-stages-supported>> section to prevent
    recording stage dependencies that aren't supported on the queue
    (internal issue 516).
  * Make a few changes that generalize spec language for use with possible
    future extensions by adding glossary terms and generalizing ``feature''
    to ``feature or extension'' where relevant (internal issues 448, 590).
  * Added "pipeline type" attribute to +vk.xml+ for relevant commands and
    utilize it in automatic generation of the Command Properties table
    (internal issue 517).
  * Specify that WSI implementations must provide both UNORM and sRGB
    formats in the description of slink:VkColorSpaceKHR (internal issue
    529).
  * Remove nesting of explicit valid usage statements where it is not
    meaningful (internal issue 583).

Other Issues:

  * Add validity language requiring that
    slink:VkPushConstantRange::pname:offset be a multiple of 4, as stated in
    the spec language.

-----------------------------------------------------

Change log for November 25, 2016 Vulkan 1.0.35 spec update:

  * Bump API patch number and header version number to 35 for this update.

GitHub Issues:

  * Document in the <<memory-device-hostaccess,Host Access>> section that
    mapping and unmapping does not invalidate or flush the mapped memory
    (public issues 27, 126).
  * Redefine the entire <<synchronization>> chapter in terms of consistent
    and well defined terminology, that is called out at the start of the
    chapter. This terminology is applied equally to all synchronization
    types, including subpass dependencies, submissions, and much of the
    implicit ordering stuff dotted around the spec. Key terms are laid out
    in the <<synchronization-dependencies,Execution and Memory
    Dependencies>> section at the top of the rewritten chapter (public
    issues 128, 131, 132, 217, 299, 300, 302, 306, 322, 346, 347, 371, 407).
  * Specify order of submission for batches in the
    <<vkQueueSubmit,vkQueueSubmit>> and
    <<vkQueueBindSparse,vkQueueBindSparse>> commands (public issue 371).
  * Add valid usage statements to each of the WSI extension sections
    indicating that the WSI-specific structure parameters must be valid, and
    remove automatically generated valid usage statements now covered by the
    manual sections (public issue 383).
  * Clarify render pass compatibility for flink:vkCmdExecuteCommands (public
    issue 390).

Internal Issues:

  * Update +vk.xml+ to make previously explicit valid usage statements for
    <<vkDebugReportMessageEXT,vkDebugReportMessageEXT>> implicit instead
    (internal issue 553).
  * Add valid usage statement for slink:VkCreateImageInfo preventing
    creation of 1D sparse images (internal issue 573).
  * Fix Python scripts to always read/write files in utf-8 encoding, and a
    logic error in reflib.py which could cause a fatal error for
    malstructured asciidoc (internal issues 578, 586).

-----------------------------------------------------

Change log for November 18, 2016 Vulkan 1.0.34 spec update:

  * Bump API patch number and header version number to 34 for this update.

GitHub Issues:

  * Allow vkUpdateDescriptorSets overflow to skip empty bindings. Clarify
    that unused bindings have a descriptorCount of zero. Improve some valid
    usage for vkUpdateDescriptorSets (public issue 256).
  * Require that slink:VkImageSubresourceRange always define a non-empty
    range of the resource (public issue 303).
  * Added valid usage for slink:VkPresentInfoKHR on the layout of presented
    images (public issue 397).

Internal Issues:

  * Add dependency in src/spec/Makefile so specversion.txt is regenerated
    when needed (internal issue 462).
  * Shorten the table of contents in the single-page ref page HTML output.
    Still working on the PDF (internal issue 536).

-----------------------------------------------------

Change log for November 11, 2016 Vulkan 1.0.33 spec update:

  * Bump API patch number and header version number to 33 for this update.

GitHub Issues:

  * Added implicit external synchronization parameters to
    vkBegin/EndCommandBuffer, and fixed missing command pool host
    synchronization from per-command lists (public issue 398).
  * Started using git tags including the spec release number, such as
    'v1.0.32-core', instead of tags including the date of release, such as
    'v1.0-core-20161025' (public issue 405).

Internal Issues:

  * Add validity constraint for
    slink:VkImportMemoryWin32HandleInfoNV::pname:handle (internal issue
    #480).
  * Add scripts to compare two Vulkan HTML specifications, derived from W3
    htmldiff service (internal issue 525).
  * Relax requirement that memoryTypeBits can't depend on format, to allow
    it to differ only for depth/stencil formats (internal issue 544).
  * Add a new generator script to create a simple extension loader for
    Vulkan based on +vk.xml+ (internal issue 558).
  * Add the overlooked requirement that buffer and image memory
    alignment requirements must be a power of two in the
    <<resources-association,Resource Memory Association>> section
    (internal issue 569).

Other Issues:

  * Add a naming rule to the style guide for members of extension structures
    defining array lengths which are the same as array lengths of the core
    structure they are chained from.
  * Add a new generator to create a simple extension loader in
    +src/ext_loader/vulkan_ext.[ch]+ from +vk.xml+. This code can be
    included in your project, and is expected to be packaged in the Vulkan
    SDK provided by LunarG in the future.

-----------------------------------------------------

Change log for October 25, 2016 Vulkan 1.0.32 spec update:

  * Bump API patch number and header version number to 32 for this update.

GitHub Issues:

  * Add automatic visibility operations to the presentation engine when
    doing a queue present in flink:vkAcquireNextImageKHR. Removed all
    references to MEMORY_READ that referenced WSI - they no longer make
    sense (some aspects of public issues 128, 131, 132, 261, and 298).
  * Document valid non-boolean +externsync+ attribute values for <param>
    tags in +vk.xml+ (public issue 265).
  * Add valid usage to slink:VkImageCreateInfo requiring that
    pname:arrayLayers be 1 for images of type ename:VK_IMAGE_TYPE_3D
    (public issue 319).
  * Add missing captions to figures in the <<textures,Image Operations>>
    chapter (public issue 334).
  * Clarify WSI interaction with exclusive sharing mode (public issue
    344).
  * Added explicit language clarifying the allowed queue usage of
    resources created with ename:VK_SHARING_MODE_CONCURRENT (public
    issue 386).
  * Require that the
    slink:VkDescriptorSetLayoutCreateInfo::pname:binding members of the
    pname:pBindings array passed to
    flink:vkDescriptorSetLayoutCreateInfo all be distinct (public issue
    391).

Internal Issues:

  * Remove empty validity blocks from +vk.xml+ and suppressed broken
    validity statements and added missing statements to explicit
    validity. Doesn't affect output, other than some statements
    appearing in another block now (internal issue 513).

-----------------------------------------------------

Change log for October 14, 2016 Vulkan 1.0.31 spec update:

  * Bump API patch number and header version number to 31 for this update.

GitHub Issues:

  * Clarifying wording of slink:VkGraphicsPipelineCreateInfo parameters and
    adding Valid Usage statements on render pass compatibility to the
    <<drawing,drawing commands>> (public issue 375).
  * Replace 'texel size' with 'element size', and add a definition to the
    glossary (public issue 382).
  * Clarify the description of ename:VK_ERROR_NATIVE_WINDOW_IN_USE_KHR to
    make it accurate, but still generic (non-exhaustive). Remove two Valid
    Usage statements describing error situations that will return
    ename:VK_ERROR_NATIVE_WINDOW_IN_USE_KHR (public issue 387).
  * Fix refBegin tag for elink:VkDebugReportFlagBitsEXT (public issue 392).
  * The <<interfaces-builtin-variables,built-in variable>> code:PrimitiveId
    in a fragment shader needs the code:Input storage class (public issue
    393).

Internal Issues:

  * Unused ({y,z} and {height,depth} for 1D, z and depth for 2D) offsets
    must be 0 and unused extents must be 1. Added basic offset and extent
    valid usage for slink:VkImageResolve to match that of slink:VkImageCopy
    (internal issue 413).
  * Describe what flink:vkGetPhysicalDeviceImageFormatProperties returns for
    pname:sampleCounts when for pname:usage only includes transfer-related
    flags (internal issue 478).
  * Remove mention of
    slink:VkPhysicalDeviceLimits::pname:maxImageArrayLayers from the valid
    usage for slink:VkImageCreateInfo::pname:arrayLayers (internal issue
    520).
  * Tag usages of ``dynamically uniform'' as glossary terms and add a
    glossary entry pointing to the SPIR-V Specification's definition of the
    term (internal issue 531).

-----------------------------------------------------

Change log for October 7, 2016 Vulkan 1.0.30 spec update:

  * Bump API patch number and header version number to 30 for this update.

GitHub Issues:

  * Document missing pname:sType and pname:pNext parameters for
    slink:VkCommandBufferInheritanceInfo (public issue 224).
  * As promised, we are removing the example code, from the appendix, for
    the VK_KHR_surface and VK_KHR_swapchain extensions. The cube demo
    (shipped in the official Khronos SDK) has been updated, and is the
    example code that we want people to look at for how to use these two
    extensions (public issues 279, 308, and 311).
  * Clarify the formats for which the slink:VkClearColorValue pname:float32
    member is used. Also clean up related language for flink:vkCmdBlitImage
    (public issue 369).
  * Reword the <<invariance, Invariance>> appendix chapter to better match
    Vulkan terminology (public issue 372).

Internal Issues:

  * Update slink:VkMemoryRequirements to not require a host_visible memory
    type exists that can be bound to sparse buffers (internal issue 494).
  * Modify the <<features-supported-sample-counts,Supported Sample Counts>>
    language to allow multisampled depth-stencil images (internal issue
    521).

-----------------------------------------------------

Change log for September 30, 2016 Vulkan 1.0.29 spec update:

  * Bump API patch number and header version number to 29 for this update.

GitHub Issues:

  * Remove redundant constraint on
    slink:VkCommandBufferInheritanceInfo::pname:queryFlags (public issue
    224).
  * Fix typo and remove link in Note in the
    <<extended-functionality-instance-extensions-and-devices, Instance
    Extensions and Device Extensions>> section (public issue 359).
  * Fix erroneous validation statement for the pname:layout member of
    slink:VkComputePipelineCreateInfo (public issue 362).

Internal Issues:

  * Restore long figure captions using asciidoc sidebar blocks, due to
    restrictions of asciidoc syntax (internal issue 101).
  * Replace most latexmath equations with comparable markup in straight
    asciidoc, which significantly improves time required to fully load and
    process the HTML forms of the Specification. There are known minor font
    and alignment inconsistencies with MathJax and PDF rendering of
    latexmath equations. Please do not file GitHub Issues about these. We
    are aware of the inconsistencies and will make refinements over time,
    while the performance improvements are compelling in at least some major
    browsers (internal issue 313).
  * Move handcoded validity statements from +vk.xml+ into the Specification
    body, easing work in the single-branch model. Specify the distinction
    between these explicit statements, and the implicit validity statements
    inferred from vk.xml. Validity statements now appear in two blocks for
    each command and structure - handcoded "Valid Usage" and the implicit
    "Valid Usage (Implicit)" (internal issue 392).
  * Add the +returnedonly="false"+ attribute to WSI output structures,
    removing incorrectly generated implicit validity statements for
    slink:VkDisplayPropertiesKHR, slink:VkDisplayPlanePropertiesKHR,
    slink:VkDisplayModePropertiesKHR, slink:VkDisplayPlaneCapabilitiesKHR,
    slink:VkSurfaceCapabilitiesKHR, and slink:VkSurfaceFormatKHR structures
    (internal issue 486).
  * Update slink:VkImageLayout to require the
    ename:VK_IMAGE_USAGE_SAMPLED_BIT be set for sampled depth/stencil images
    (internal issue 487).
  * Use an explicit format specifier string for the date command invocation
    in the +Makefile+ instead of the shorthand -R option, which doesn't work
    on BSD and MaxOS X date commands (internal issue 500).

Other Issues:

  * Use the terms ``allocation scope'' and ``extension scope'' instead of
    just ``scope'', and add them to the glossary.

-----------------------------------------------------

Change log for September 23, 2016 Vulkan 1.0.28 spec update:

  * Bump API patch number and header version number to 28 for this update.

GitHub Issues:

  * Minor spelling and typography cleanup, add definitions of
    ename:VK_FALSE and ename:VK_TRUE as just what their names say
    (public issues 220, 318, 325, 365; internal issues 451, 496)
  * Clarify that the pname:maxDescriptorSet limits in the
    <<features-limits-required,Required Limits>> table are n *
    maxPerStage limit (where n=number of supported stages) (public issue
    254).
  * Minor cleanup to <<boilerplate-platform-macros,Platform-Specific
    Macro Definitions>> appendix (public issue 314).
  * Add valid usage statement to slink:VkPipelineLayoutCreateInfo
    disallowing multiple push constant ranges for the same shader stage
    (public issue 340).
  * Clarify the elink:VkSharingMode description of what executing the
    "same" barriers means in case of ownership transfer (public issue
    347).
  * Rename copyright.txt and add COPYING.md to try and reduce confusion
    about applicable copyrights (public issue 350).
  * Extend the table in the <<boilerplate-wsi-header, Window System-Specific
    Header Control>> section to describe the external headers included when
    each etext:VK_USE_PLATFORM_* macro is defined (public issue 376).

Internal Issues:

  * Add "Revision History" to the PDF outputs following the table of
    contents, to match HTML outputs (internal issue 43).
  * Clarified that flink:vkMapMemory may fail due to virtual address
    space limitations (internal issue 346).
  * Add +refBody+ comment markup for ref page autoextraction when required
    (internal issue 400).
  * Document proper use of "mipmap" and "mip" in the style guide API
    naming rules, matching the spelling rules (internal issue 471).
  * Tweak the <<extensions,Layers and Extensions>> appendix to note that
    the Specification may be built with arbitrary combinations of
    extensions (internal issue 483).
  * Remove incorrect statement allowing
    slink:VkClearAttachment::pname:colorAttachment to be >=
    slink:VkSubpassDescription::pname:colorAttachmentCount (internal
    issue 488).
  * The <<features-limits-viewportboundsrange,viewportBoundsRange>> is
    expressed in terms of the pname:maxViewportDimensions but this is
    actually two values. Clarify that it is based on the larger of the two
    (if they differ) (internal issue 499).

Other Issues:

  * Reflowed text of the entire spec using the 'reflow' Makefile target, to
    (hopefully) reduce future internal git churn as edits are made and
    extensions added in return for one-time pain. This has no perceptible
    effect on the spec outputs, but considerable changes on the asciidoc
    source (internal issue 367).

-----------------------------------------------------

Change log for September 16, 2016 Vulkan 1.0.27 spec update:

  * Bump API patch number and header version number to 27 for this update.

GitHub Issues:

  * Weaken flink:vkGetPipelineCacheData invariance conditions; previous
    conditions were stronger than agreed and can't be guaranteed (public
    issue 280).
  * Add link to "Vulkan Loader Specification and Architecture Overview"
    document to Normative References section (public issue 359).

Internal Issues:

  * Be more clear in the <<interfaces-resources-layout-std140, uniform
    buffer layout>> section that block offsets can be out of order
    (internal issue 396).
  * Document that extension authors should add support for their extensions
    to the validation layers (internal issue 398).
  * Clarify that the valid range of depth clear values should be limited
    to the 0..1 range and that copies to depth aspect must also be in this
    range (internal issue 412).
  * Specify ``a'' vs. ``an'' use in the style guide (internal issue 432).
  * Increase the maximum pname:nonCoherentAtomSize value in the
    <<features-limits-required,Required Limits>> section from 128 to 256
    (internal issue 435).
  * Fix vk_platform.h for compiler errors on some Android platforms
    (internal issue 441).
  * Clarify that slink:VkPhysicalDeviceFeatures::pname:pEnabledFeatures ==
    `NULL` disables all features, including the "required" feature
    pname:robustBufferAccess (internal issue 479).

Other Issues:

  * Expand style guide and make it more self-consistent.
  * Use ISO 8601 date format everywhere.
  * Emphasise the correct way of using
    slink:VkSurfaceCapabilitiesKHR::pname:maxImageCount.
  * Added +VK_EXT_validation_flags+ extension for validation flag mechanism.
  * Fix an <<credits,author credit>> to include their current employer.

-----------------------------------------------------

Change log for September 6, 2016 Vulkan 1.0.26 spec update:

  * Bump API patch number and header version number to 26 for this update.

GitHub Issues:

  * Bring sample code in the `VK_KHR_surface` and `VK_KHR_swapchain`
    extension summary appendices up to date, and note they will be replaced
    with pointers to the LunarG SDK examples in the future (public issue
    279).
  * Add a new <<fundamentals-commandsyntax-results-lifetime,Lifetime of
    Retrieved Results>> section specifying that ftext:vkGet* and
    ftext:VkEnumerate* results are invariant unless otherwise specified, and
    specify behavior for individual commands which are not invariant (public
    issue 280).
  * Remove conflicting definition of
    slink:VkDisplayPlaneCapabilitiesKHR::pname:maxSrcPosition and clean up
    language of the remaining definition (public issue 351).
  * Fix many minor spelling errors and add rules to the style guide to
    prevent recurrences (public issue 352).

Internal Issues:

  * Remove redundant descriptions of the etext:VK_USE_PLATFORM_* macros from
    the <<wsi,Window System Integration>> chapter in favor of the
    description in the <<boilerplate-wsi-header,Window System-Specific
    Header Control>> appendix (internal issue 6).
  * Replace misleading 'can: be destroyed when not X' with more correct
    'must: not be destroyed while X' in the
    <<fundamentals-objectmodel-lifetime,Object Lifetime>> section. Disallow
    destroying a pipeline layout while a command buffer using it is
    recording (internal issue 241).
  * Clarify that ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT is valid for
    all images used as attachments in elink:VkImageUsageFlagBits and the
    slink:VkImageLayout validity language (internal issue 320).
  * Note that <<extended-functionality-layers,Layers>> may wrap object
    handles, but that this is a generally discouraged. A link to additional
    information in the documentation for layer authors is provided (issue
    398)
  * Replace the mustnot: and shouldnot: macros with equivalent must: not and
    should: not to get rid of non-English words while still highlighting
    normative language (internal issue 407).
  * Disallow creating multisampled images with
    ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT in the slink:VkImageLayout
    validity language and the <<features-supported-sample-counts,Supported
    Sample Counts>> section (internal issue 445).
  * Fix typo so that flink:vkCmdDrawIndexedIndirect is defined in terms of
    flink:vkCmdDrawIndexed rather than flink:vkCmdDrawIndirect (internal
    issue 446).
  * Reorganize the per-extension information sections to all be in the
    <<extensions,Layers & Extensions>> appendix. Also fix a typo in
    +VK_IMG_filter_cubic+ which incorrectly identified it as a +KHR+
    extension (internal issue 461).

Other Issues:

  * Use asciidoc markup instead of latexmath to simplify diagrams in the
    <<features-formats-non-packed,byte mapping tables>> for color formats.
  * Fix a markup problem with the wildcarded enumerant names in a NOTE in
    the <<textures-texel-replacement,Texel Replacement>> section.
  * Fix missing attributes in the XML interface for
    elink:VkExternalMemoryHandleTypeFlagBitsNV and
    elink:VkExternalMemoryFeatureFlagBitsNV (KhronosGroup/Vulkan-Hpp issue
    25)
  * Cleanup reference page builds so only core pages are built for releases.

-----------------------------------------------------

Change log for August 26, 2016 Vulkan 1.0.25 spec update:

  * Bump API patch number and header version number to 25 for this update.
  * Structurally change the specification so that multiple extensions are
    included in the +1.0+ git branch, and specifications will include or not
    include those extensions at build time based on options passed to the
    Makefile. See +doc/specs/vulkan/README.html+ and the ``Layers and
    Extensions'' section of the ``Vulkan Documentation and Extensions''
    document for more information on this change.
  * Register and publish new extensions in the single-branch form:
  ** +VK_NV_external_memory_capabilities+
  ** +VK_NV_external_memory+
  ** +VK_NV_external_memory_win32+
  ** +VK_NV_win32_keyed_mutex+

GitHub Issues:

  * Clarify description of GetInstanceProcAddr and GetDeviceProcAddr (public
    issue 212).
  * Add SPIR-V <<textures-operation-validation, instruction validation>> for
    single-sampled images (public issue 316).
  * Fix spelling of ``tesselation'' in a few places and note it as an
    exception to the American spelling rules convention (public issue
    327).
  * Fix Makefile to create output directory for ``styleguide''
    target (public issue 329).
  * Fix numerous minor issues with incorrectly tags on enumerant names and
    table titles (public issue 330).
  * Generate specversion.txt date in UTC time and RFC 2822 format
    (public issue 335).
  * Convert link to the SPIR-V Specification for
    flink:VkShaderModuleCreateInfo into an internal link to the normative
    reference (public issue 336).
  * Add ename:VK_ERROR_OUT_OF_MEMORY error code to
    flink:vkCreateDebugReportCallbackEXT (public issue 337).

Internal Issues:

  * Update style guide regarding use of code:NULL and dname:VK_NULL_HANDLE
    (internal issue 393).
  * Change the definition of latexmath:[$q$] in the
    <<textures-image-level-selection,texture image level selection>> section
    to be the index of the maximum defined level for the view, not the
    number of levels in the view (internal issue 406).
  * Allow developers to override dname:VK_DEFINE_NON_DISPATCHABLE_HANDLE
    with their own binary-compatible definition (internal issue 439).
  * Fix +vk_platform.h+ conditional logic causing compile failure with some
    Android compilers (internal issue 441).
  * Implement the single-branch model as described above (internal issue
    461).

-----------------------------------------------------

Change log for August 12, 2016 Vulkan 1.0.24 spec update:

  * Bump API patch number and header version number to 24 for this update.

GitHub Issues:

  * Fix type mismatch in swapchain image equivalency table (public issue
    289).
  * Fix a copy-and-paste error in the description of
    flink:vkGetSwapchainImagesKHR::pname:pSwapchainImages, that said it
    was an array of ``sname:VkSwapchainImageKHR structures'' instead of
    an array of ``sname:VkImage handles'' (public issue 292).
  * Specify that ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT is only valid
    for ename:VK_IMAGE_TYPE_2D images (public issue 293).
  * Add a valid usage statement to flink:vkCmdExecuteCommands saying
    that when called outside a render pass instance, the secondary
    command buffers must not have been created with the
    ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT (public issue
    297).
  * Fix description of +VK_NO_STDINT_H+ in the
    <<boilerplate-platform-macros,platform macros>> section (public
    issue 314).

Internal Issues:

  * Normalize the language for the remaining built-in variables in the
    <<interfaces-builtin-variables,Built-In Variables>> section. Fix
    code:FrontFacing and code:HelperInvocation, as they should be of
    code:boolean type rather than code:integer (internal issue 323).
  * Clarify that when ename:VK_WHOLE_SIZE is used for a buffer
    descriptor range, the effective range must still be within the max
    buffer range (internal issue 426).
  * Clarify that command buffers and descriptor sets are allocated
    rather than created. Also clarify when the recording state of a
    command buffer is relevant (internal issue 434).

-----------------------------------------------------

Change log for August 5, 2016 Vulkan 1.0.23 spec update:

  * Bump API patch number and header version number to 23 for this update.

GitHub Issues:

  * Add explicit valid value attributes to pname:sType members in vk.xml
    (public issue 34).
  * Clarify usage of flink:vkGetInstanceProcAddr and
    flink:vkGetDeviceProcAddr (public issue 225).
  * Fix a copy-and-paste error in the description of
    pname:pSwapchainImageCount saying that it was the count of ``format
    pairs'' instead of ``swapchain images'' (public issue 292).
  * flink:vkCmdExecuteCommandBuffers requires all command buffers to be
    allocated from command pools created for the same queue family (public
    issue 296).
  * Remove bogus +optional+ attribute for
    flink:vkEnumerateDeviceLayerProperties::pname:physicalDevice from vk.xml
    (public issue 301).
  * Clean up the <<resources-image-views-compatibility,image and image view
    compatibility table>> reference and contents. Use full enumerant names.
    Refer to pname:layerCount in the ``view parameters'' column instead of
    pname:arrayLayers. Require N >= 1 for the cube array subview row, not
    just arrayLayers >= 6 N (public issue 304).
  * Modify description of <<resources-memory-aliasing,memory aliasing>> to
    be consistent with the description of
    <<resources-bufferimagegranularity,buffer image granularity>> (public
    issue 307).

Internal Issues:

  * Describe remaining +vk_platform.h+ macros in the <<boilerplate,API
    Boilerplate>> appendix (internal issue 6).
  * Clarify
    <<features-features-robustBufferAccess, pname:robustBufferAccess>>
    feature behavior; what memory can be accessed, how bounds checking is
    performed, and allowing for vectorization (internal issue 332).
  * Document markup for automatic extraction of reference pages from the
    spec sources in the style guide (internal issue 395).
  * Allow flink:vkCreateDisplayModeKHR to return
    ename:VK_ERROR_INITIALIZAION_FAILED_KHR if the user requests mode
    parameters that the specified display does not support (internal issue
    411).
  * Remove atomic counters (atomic_uint style) from KHR_vulkan_glsl, and
    more clearly remove the subroutine keyword alongside it (internal issue
    421).
  * Clarify behavior of flink:vkCmdBindDescriptorSets for descriptor sets
    not contained in the layout (internal issue 427).

Other Commits:

  * Change the order in which members of sname:VkAttachmentDescription and
    sname:VkPipelineInputAssemblyStateCreateInfo are described to match
    their order in the structures.

-----------------------------------------------------

Change log for July 22, 2016 Vulkan 1.0.22 spec update:

  * Bump API patch number and header version number to 22 for this update.

GitHub Issues:

  * Translate the subpass self-dependency language into concrete
    validity statements, and added a validity statement about the
    restrictions on layout parameters (public issue 267).
  * Add validity requirement that
    slink:VkAttachmentDescription::pname:finalLayout and
    slink:VkAttachmentReference::pname:layout must not be
    ename:VK_IMAGE_LAYOUT_UNDEFINED or
    ename:VK_IMAGE_LAYOUT_PREINITIALIZED (public issue 268).
  * Clarify that slink:VkSubpassDescription::pname:pResolveAttachments
    layouts are used. Make language consistent with other attachment
    arrays (public issue 270).
  * Changed 64-bit definition for
    dname:VK_DEFINE_NON_DISPATCHABLE_HANDLE to work for x32 platform in
    +vk.xml+ and the resulting +vulkan.h+ (public issue 282).
  * Add missing error return code for
    flink:vkEnumerateInstanceExtensionProperties and
    flink:vkEnumerateDeviceExtensionProperties (public issue 285)
  * Fix several cases of stext::VkStructName.memberName markup to
    stext::VkStructName::pname:memberName, to match other usage in the
    spec, and describe this markup in the style guide (public issue
    286).
  * Modified validity language generation script to avoid redundant
    common ancestor language if covered by generic parent language, and
    used `Both' instead of `Each' when appropriate (public issue 288).

Internal Issues:

  * Add language about behavior of flink:vkAllocateDescriptorSets when
    allocation fails due to fragmentation, a new error
    ename:VK_ERROR_FRAGMENTED_POOL, and a Note explaining the situation
    (internal issue 309).
  * For the features of code:PointSize, code:ClipDistance, and
    code:CullDistance, the SPIR-V capability is required to be declared
    on use (read or write) rather than on decoration (internal issue
    359).
  * Have desktop versions of GLSL respect precision qualification
    (code:mediump and code:lowp) when compiling for Vulkan. These will
    get translated to SPIR-V's code:RelaxedPrecision decoration as they
    do with OpenGL ES versions of GLSL (ESSL). The default precision of
    all types is code:highp when using a desktop version (internal issue
    360).
  * Add validity statement for slink:VkImageCreateInfo specifying that
    multisampled images must be two-dimensional, optimally tiled, and
    with a single mipmap level (internal issue 369).
  * Add validity statements to slink:VkImageViewCreateInfo disallowing
    creation of images or image views with no supported features. Made
    some slink:VkImageViewCreateInfo validity statements more precise
    and consistent. Added a Note to the <<features,features>> chapter
    about formats with no features (internal issue 371).
  * Remove +manpages+ from default build targets. Nroff outputs
    containing imbedded latexmath will not render properly. Fixing this
    is a lot of work for limited use cases (internal issue 401).

Other Commits:

  * Fix flink:vkRenderPassBeginInfo::pname:clearValueCount validity
    statement to be based on attachment indices rather than the number
    of cleared attachments
    (Vulkan-LoaderAndValidationLayers/issues/601).
  * Convert registry documentation from LaTeX to asciidoc source and
    rename from +src/spec/readme.tex+ to +src/spec/registry.txt+.
  * Fix lack of Oxford commas in validity language.
  * Lots of cleanup of generator scripts and Makefiles to move extension
    list for generator into the script arguments instead of the body of
    genvk.py, and express better dependencies between XML, scripts, and
    generated files.

-----------------------------------------------------

Change log for July 15, 2016 Vulkan 1.0.21 spec update:

  * Bump API patch number and header version number to 21 for this update.

GitHub Issues:

  * Clarify how <<features-supported-sample-counts,sample count queries>>
    relate to the limits in slink:VkPhysicalDeviceLimits. (public issue
    185).
  * Clarify in the <<interfaces-iointerfaces,Shader Input and Output
    Interfaces>> section that shader output variables have undefined values
    until the shader writes to them (public issue 240).
  * Specify the implicit value of image parameters that cannot be set in
    slink:VkSwapchainCreateInfo::pname:flags, pname:imageType,
    pname:mipLevels, pname:samples, pname:tiling, and pname:initialLayout
    (public issue 243).
  * Make use of code:NULL and code:VK_NULL_HANDLE consistent in the
    VK_KHR_swapchain extension (public issue 276).

Internal Issues:

  * Clarify that presenting an image to a display surface swapchain applies
    the display surface's mode, and that destroying a display surface
    swapchain may reset the display's mode, in the VK_KHR_display_swapchain
    extension (internal issue 247).
  * Better describe what a slink:VkSurfaceKHR is, and that creating one does
    not set a mode, in the VK_KHR_display extension. This is a round-about
    way of pointing out that mode setting is not covered by the extension,
    but rather is performed as a side effect of presentation (internal issue
    247).
  * Add more valid usage statements to flink:vkQueuePresentKHR command when
    the VK_KHR_display_swapchain extension is present (internal issue
    247).
  * Add more includes to the VK_KHR_swapchain extension to better document
    interactions with VK_KHR_display_swapchain (internal issue 247).
  * Clarify restrictions on location aliasing in the
    <<fxvertex,Fixed-Function Vertex Processing>> section (internal issue
    370).
  * Add mathematical description of blitting to flink:vkCmdBlitImage, and
    link it to the <<textures,Image Operations>> chapter. Use mathematical
    notation for ranges of texel coordinates in the <<textures,Image
    Operations>> chapter. Fixed miscellaneous validity statements for
    flink:vkCmdBlit and slink:VkImageBlit (internal issue 382).

Other Commits:

  * Added a valid usage rule to flink:VkGraphicsPipelineCreateInfo that the
    ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST topology must only be used when
    tessellation shaders are used.
  * Expand the style guide into a formal "Procedures and Conventions"
    document. Add a API Naming Conventions section, move most of the API
    Specification Appendix C (Layers and Extensions) content into the new
    document, and define the resulting procedures as mandatory (where
    relevant). This more clearly separates use vs. specification of Vulkan
    APIs.
  * Update vk_platform.h to handle 32-bit ARMv8 binaries.
  * Various minor cleanups to the Makefile and build process.

-----------------------------------------------------

Change log for July 8, 2016 Vulkan 1.0.20 spec update:

  * Bump API patch number and header version number to 20 for this
    update.

GitHub Issues:

  * Replaced existing reference pages by text automatically extracted from
    the specification source, or generated from vk.xml in some cases. This
    is not a complete solution for the reference pages, but puts them in a
    much better state. The ref pages (only) are now placed under a CC BY
    open source license, which is more current than the obsolete license
    previously used. Various minor tweaks to the Specification sources were
    made to enable this, and a new ``API Boilerplate'' chapter added to
    include definitions of all the entities in the API and +vulkan.h+ which
    were not already described in some form in the document.

    Further improvements to the pages should not edit them directly, but
    instead concentrate on the specification source from which the ref pages
    are being extracted (public issues 44, 55, 160; internal issue 389).

-----------------------------------------------------

Change log for July 1, 2016 Vulkan 1.0.19 spec update:

  * Bump API patch number and header version number to 19 for this
    update.

GitHub Issues:

  * Clarified how flink:vkGetImageSubresourceLayout interacts with image
    layouts (public issue 247).
  * Remove ename:VK_IMAGE_LAYOUT_PREINITIALIZED from valid usage rule for
    slink:VkImageMemoryBarrier::pname:oldLayout. It is only valid if it is
    the current layout (public issue 248).
  * Modify valid usage for flink:vkBindBufferMemory so implementations are
    free to require a different backing memory size than the buffer size
    (public issue 251).
  * Clarify that filtering rules for flink:vkCmdBlitImage always apply, and
    are usually no-ops if the formats are the same (public issue 253).
  * Remove 'non-sparse' from description of
    flink:vkGetBufferMemoryRequirements and
    flink:vkGetImageMemoryRequirements (public issue 257).
  * Remove ename:VK_ERROR_LAYER_NOT_PRESENT error code from
    flink:vkCreateDevice (public issue 259).
  * Change "must: not" to "should: not" in constraint on when
    flink:vkAcquireNextImageKHR is called in the VK_KHR_swapchain branch
    (public issue 262).
  * Change type of flink:vkCmdUpdateBuffer::pname:pData from
    basetype:uint32_t* to basetype:void* (public issue 263).
  * Change should: to must: in description of where additional segments are
    placed in the <<tessellation-tessellator-spacing,Tessellator Spacing>>
    section (public issue 264).

Internal Issues:

  * Normalize the language of all the compute shader built-ins in the
    <<interfaces-builtin-variables,Built-in Variables>> section (internal
    issue 323).
  * Remove definition of presentation engine internal queue lengths
    associated with ename:VK_PRESENT_MODE_FIFO_KHR and
    ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR in the <<Window System
    Integration,wsi>> chapter (internal issue 374).
  * The language of a Note was too broad, and implied that loaders for a
    given OS would statically export functions for WSI extensions that
    were not relevant to (or supported on) the OS. Also, removed
    "Khronos-provided" since the Android loader is not (internal issue 380)

Other Commits:

  * Add ename:VK_INCOMPLETE to list of return values for
    flink:vkGetPipelineCacheData. Spec says this value is returnable, but it
    was not listed in the error codes.
  * Fix "corresponds" typo in member definitions for
    slink:VkSubpassDescription.

-----------------------------------------------------

Change log for June 24, 2016 Vulkan 1.0.18 spec update:

  * Bump API patch number and header version number to 18 for this
    update.

GitHub Issues:

  * Added "queue operation" terminology, and modified spec to actually
    use this terminology (public issue 155). The act of submitting a
    piece of work to a queue now generates "operations" for the queue to
    execute, including operations to wait on/signal semaphores and
    fences. Synchronization waits on these operations, making execution
    dependency chains more obvious for semaphores and fences (though
    additional work is still needed here). These changes include:
  ** Overview of "queue submission" commands in chapter
     <<devsandqueues-submission>>.
  ** Updated descriptions for fence and semaphore waits and signals in
     the synchronization chapter <<synchronization-semaphores-waiting>>,
     <<synchronization-semaphores-signaling>> and
     <<synchronization-fences-waiting>>.
  ** Clarifications to semaphore and fence operation within queue
     submission functions.
  ** New glossary terms.
  ** Moved device idle and queue wait idle to synchronization chapter in
     order to describe them in terms of other synchronization
     primitives.
  ** Clarifications to semaphore and fence operation allowed removal of
     the "implicit ordering guarantees" section, as this information is
     now wholly covered where these primitives are described.
  *** The "host writes" section of this is still there for now - in its
      own section. This could probably be merged into other sections
      later.
  *** Modified fundamentals chapter on queue ordering to make sense in
      context of the new changes, and avoid duplication.
      <<fundamentals-queueoperation>>
  * Added "aspect" and "component" definitions to the glossary, and made
    sure these terms are referenced correctly (public issue 163).
  * Update valid usage for ftext:vkGet*ProcAddr to only include
    conditions that must be met to get a valid result. In particular,
    it is okay to call flink:vkGetDeviceProcAddr with any string and will
    get a code:NULL if that string is not a core Vulkan function or an
    enabled extension function (addresses but does not fully close
    public issue 214).
  * Change the WSI extension dependencies to refer to version 1.0 of the
    Vulkan API, instead of the pre-1.0-release internal revisions
    numbers (public issue 238).
  * Specified that <<interfaces-fragmentoutput,undeclared fragment
    shader outputs>> result in undefined values input to the blending
    unit or color attachment (public issue 240).
  * Fix latexmath:[$\leq$] operators turning into Unicode left arrow symbols
    (public issue 245).

Internal Issues:

  * Better documented that the registry XML "optional" tag for values
    only applies when that value is the size of an array (internal issue
    335).
  * Add a stronger definition for the valid usages of
    VkSpecializationMapEntry.size in the
    <<pipelines-specialization-constants,Specialization Constants>>
    section (internal issue 345).
  * Change code:OpName to code:OpDecorate (along with appropriate
    syntax) for vertex shader built-ins (internal issue 368).
  * Add missing ref pages (those which are not currently stubs) to
    apispec.txt for the single-page version of the ref pages (internal
    issue 378).

Other Commits:

  * Fix example in the <<descriptorsets,Descriptor Sets>> section to use
    M, N, and I, describing set, binding, and index, consistently
    throughout the example code.

-----------------------------------------------------

Change log for June 17, 2016 Vulkan 1.0.17 spec update:

  * Bump API patch number and header version number to 17 for this
    update.

GitHub Issues:

  * Update description of vertex shader reuse in
    <<shaders-vertex-execution>> (public issue 106).
  * Simplify validity language around pname:ppEnabledExtensionNames and
    pname:ppEnabledLayerNames (in the <<initialization-instances>> and
    <<devsandqueues-device-creation>> sections) (public issue 214).
  * Add missing validity rule to flink:vkCmdBeginRenderPass requiring
    compatibility between slink:VkAttachmentDescription pname:initalLayout
    members and the corresponding attached framebuffer images (public issue
    233).
  * Fix Unicode arrows appearing in output instead of relational operators
    (public issue 239).
  * Correctly describe the required number of elements for
    code:TessLevelInner and code:TessLevelOuter arrays in the
    <<interfaces-builtin-variables,Built-In Variables>> section as two and
    four, respectively, instead of the other way around, and refer to this
    section from the <<tessellation,Tessellation>> chapter (public issue
    246).

Internal Issues:

  * Document deprecation of ename:VK_COLORSPACE_SRGB_NONLINEAR_KHR in the
    VK_KHR_surface extension, and of
    ename:VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT in the
    VK_EXT_debug_report extension (internal issue 328).
  * Added language to define what a valid usage statement is and should be,
    with a note about some apparent weirdnesses this might entail (internal
    issue 357).

Other Commits:

  * Added missing ename:VK_ERROR_DEVICE_LOST error to
    flink:vkQueueBindSparse.

-----------------------------------------------------

Change log for June 10, 2016 Vulkan 1.0.16 spec update:

  * Bump API patch number and header version number to 16 for this
    update.

GitHub Issues:

  * Clarify that integer border values are meant to be 0/1, and that
    integer texture lookups are sign-extended in the
    <<textures-format-conversion,Format Conversion>> and
    <<textures-texel-replacement,Texel Replacement>> sections (public
    issue 52).
  * Add logic to generate spec boilerplate without using the 'git'
    command-line client, needed when building from a tarball or another
    source of the Vulkan tree rather than a cloned git repo. Remove
    boilerplate as part of 'clean' target (public issue 195).
  * Document that color writes and clears to unused attachments have no
    effect for slink:VkClearAttachment and
    elink:VkColorComponentFlagBits (public issue 198).
  * Fixed flink:vkCmdExecuteCommands validity statement for
    sname:VkCommandBufferInheritanceInfo::pname:framebuffer. If used, it
    must match the framebuffer in the current renderpass instance
    (public issue 226).
  * Added valid usage language to require for all functions that set
    dynamic state that the currently bound graphics pipeline has the
    corresponding dynamic state enabled (public issue 235).

Internal Issues:

  * Clarify for flink:vkEnumerateInstanceExtensionProperties, in the
    <<extended-functionality-instance-extensions-and-devices, Instance
    Extensions and Device Extensions>> section, and in the
    <<glossary,Glossary>> section when functionality should be exposed
    as an instance extension, as a device extension, or as both
    (internal issue 109).
  * Place WorkgroupSize in alphabetical order in the
    <<interfaces-builtin-variables,Built-in Variables>> section
    (internal issue 323).
  * Corrects valid usage in vkEndRenderPass to only affect primary
    render passes, as secondaries may be entirely within a render pass,
    and should be able to be ended (previous language disallowed that)
    (internal issue 338).
  * Fix relational operator from <= to >= in the
    <<features-extentperimagetype,Allowed Extent Values>> section
    (internal issue 343).
  * Disallow recursion under SPIR-V entry points in the
    <<spirvenv-module-validation,Validation Rules within a Module>>
    section (internal SPIR-V issue 37).

Other Commits:

  * Use standard Python ElementTree package instead of lxml.etree in
    header / validation layer / include autogeneration from XML,
    reducing platform dependencies.

-----------------------------------------------------

Change log for May 27, 2016 Vulkan 1.0.15 spec update:

  * Bump API patch number and header version number to 15 for this
    update.

GitHub Issues:

  * Fixed the <<glossary,Glossary>> entry for Fragment Input Attachment
    Interface to specify code:UniformConstant storage class (public issue
    156).
  * Disallow lazily allocated memory for buffers in the description of
    slink:VkMemoryRequirements::pname:memoryTypeBits (public issue 196).
  * Add numbered figure captions (public issue 219).
  * Fix output variable names in the <<fundamentals-fpfixedconv,Conversion
    from Floating-Point to Normalized Fixed-Point>> section and related
    minor normative language and markup cleanup (public issue 220).

Internal Issues:

  * Fix reference to nonexistent etext:VK_IMAGE_LAYOUT_TRANSFER_{SRC,DST}BIT
    to the actual etext:VK_IMAGE_LAYOUT{SRC,DST}_OPTIMAL (internal issue
    296).
  * Update the <<sparsememory-sparse-memory-aliasing,Sparse Resource
    Implementation Guidelines>> to refer to the correct feature names
    (internal issue 305).

-----------------------------------------------------

Change log for May 20, 2016 Vulkan 1.0.14 spec update:

  * Bump API patch number and header version number to 14 for this
    update.

GitHub Issues:

  * Fix validity language for sname:VkCommandBufferAllocateInfo to
    impose range limits on pname:commandBufferCount (public issue 178).
  * Fix validity language for flink:vkCmdExecuteCommands to refer to the
    correct structure names (public issue 179).
  * Fix two copy-and-paste errors in the WSI queries, where the wrong
    term was used for what was being returned (public issue 206).
  * Add a note in the documentation of
    flink:vkGetPhysicalDeviceSurfaceFormatsKHR, about what it means if
    ename:VK_FORMAT_UNDEFINED is returned (public issue 207).

Internal Issues:

  * Clarify the usage and correct the name for the bitmask referenced in
    <<queries-pipestats,Pipeline Statistics Queries>> (internal issue
    334).

Other Commits:

  * Fix the names of decorations listed in the
    <<interfaces-builtin-variables,Built-in Variables>> section such
    that they match the SPIR-V specification.

-----------------------------------------------------

Change log for May 13, 2016 Vulkan 1.0.13 spec update:

  * Bump API patch number and header version number to 13 for this
    update.

GitHub Issues:

  * Improve the description of ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR in the
    VK_KHR_surface extension (public issue 174).
  * Clarify use of etext:*_SIMULTANEOUS_USE_BIT for secondary command
    buffers (public issue 182).
  * Fix typos in VK_KHR_wayland_surface extension where code:wl_device was
    used instead of code:wl_display (public issue 193).
  * Replaced {apiname} with ``Vulkan'' in XML validity statements (public
    issue 199).
  * Fix dead links for WSI handle types (public issue 200).
  * Use "signaled" instead of "signalled" spelling everywhere (public issue
    201).
  * Move readme.pdf target directory for XML schema documentation into the
    target generation directory, instead of leaving it checked into the spec
    source tree (public issue 203).
  * Fix duplicate 'which which' typo in description of
    elink:VkCommandPoolResetFlagBits (public issue 204).
  * Move the <<Programmable Primitive Shading>> section up one level, out of
    the <<drawing-primitive-topologies,Primitive Topologies>> section
    (public issue 209).

Internal Issues:

  * Clarify in the <<pipelines-cache,Pipeline Cache>> section that
    implementations should not manage the size of pipeline cache (internal
    issue 192).
  * Deprecate the concept of device layers and associated commands (internal
    issue 255).
  * Remove ename:VK_INCOMPLETE from the list of possible result codes of
    flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR (internal issue 314).
  * Add missing std140/std430 rule: the base alignment of a member following
    a structure is a multiple of the structure's base alignment (internal
    issue 321).
  * Fixes naming of the single elink:VkColorSpaceKHR enum from
    ename:VK_COLORSPACE_SRGB_NONLINEAR_KHR to
    ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR in XML/header and the
    VK_KHR_swapchain and VK_KHR_surface extensions to match the style of the
    typename (space and color are two words, not one) (internal issue 322).
  * Make it clear that code:LocalInvocationID should only be applied to an
    input variable and normalize the language describing
    code:LocalInvocationID to the language for other compute shader
    variables in the <<interfaces-builtin-variables,Built-in Variables>>
    section, and add normative language (internal issue 323).
  * Clarify in the <<fundamentals-returncodes,Return Codes>> section that
    the result pointer may be modified for specific commands, even if a
    runtime error is returned (internal issue 324).

-----------------------------------------------------

Change log for April 29, 2016 Vulkan 1.0.12 spec update:

  * Bump API patch number and header version number to 12 for this
    update.

GitHub Issues:

  * Change valid usage statements intended to be "sub-points" to
    be actual sub-points (public issue 66).
  * Replace double negation in description of
    slink:VkRenderPassBeginInfo::pname:pClearValues (based on public
    merge 142).
  * Cleanup minor typos in spec, ref pages and XML, including those
    proposed in public pull requests 144, 150, 151, 167, 168, 181, and
    186.
  * Use *strict subset* in describing the partial order of memory
    property types for slink:VkMemoryType, and update the style guide
    accordingly (public issue 190).
  * Fix various "a image" -> "an image" typos (public issue 191).
  * Note in the <<fundamentals-validusage,Valid Usage>> and
    <<extensions-interactions,Extension Interactions>> sections that
    structures defined by extensions which may be passed in structure
    chains using the ptext:pNext member must include initial
    ptext:sType and ptext:pNext members (public issue 192).

Internal Issues:

  * Remove duplicate language from the description of the pname:fence
    parameter to flink:vkQueueSubmit and improve validity language
    (internal issue 91).
  * Added documentation for "optional" attribute to XML readme.tex/pdf
    (internal issue 149).
  * Clarify the host-side data validity rules and behavior of
    flink:vkFlushMappedMemoryRanges and
    flink:vkInvalidateMappedMemoryRanges (internal issue 266).

Other Commits:

  * Added clarification to flink:vkCmdFillBuffer regarding the use of
    ename:VK_WHOLE_SIZE.
  * Fixed and documented implementation of "validextensionstructs"
    attribute. in XML processing scripts and readme.tex/pdf.
  * Add missing validity statements to flink:vkResetEvent and
    flink:vkCmdResetEvent.
  * Fix validity for the
    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag.
    Correct all the draw/dispatch commands to mention optimally tiled
    images as well as linear tiled images, and say image VIEWS instead
    of images. Add validity statement to flink:vkCmdBlitImage
  * Replace the {apiname} macro with hardcoded "Vulkan", now that we have
    committed to that name.
  * Add the VK_AMD_rasterization_order extension to vk.xml.

-----------------------------------------------------

Change log for April 22, 2016 Vulkan 1.0.11 spec update:

  * Bump API patch number and header version number to 11 for this
    update.

GitHub Issues:

  * Clarify the WSI extension language by switching from the fuzzier
    "ownership" language to more-consistent "acquire" language (public
    issue 117).
  * Clarify that memory barriers apply to all commands in the dependency
    chains in the flink:vkGetRenderAreaGranularity command and the
    <<synchronization-execution-and-memory-dependencies,Execution And
    Memory Dependencies>> section (public issue 132).
  * Clarify that a queue family is a set of queues in the
    <<fundamentals-execmodel,Execution Model>> section (public issue
    166).
  * Removed requirement from valid usage language that
    VkPresentInfoKHR::waitSemaphoreCount must be greater than 0 (public
    issue 171).
  * Fix broken internal links, describe structures consistently, use
    consistent style for SPIR-V codewords, and tag normative terms that
    were missing asciidoc tags (public issue 183 and ancillary
    markup/normative language fixes).
  * Fix typos for slink:VkPhysicalDeviceLimits member names in
    slink:VkImageCreateInfo validity language (public issue 184).

Internal Issues:

  * Document that the requested patch version number specified as part
    of slink:VkApplicationInfo::pname:apiVersion is ignored when
    creating an instance (internal issue 176).
  * Clarify handling of extension structs in the
    <<fundamentals-validusageValid Usage>> section (internal issue 254).
  * Update required slink:VkImageFormatProperties::pname:maxMipLevels to
    be limited to the maximum allowed mipmap pyramid size corresponding
    to the actual maximum supported size for the format (internal issue
    256).
  * Modify the <<features-extentperimagetype,Allowed Extent Values Based
    On Image Type>> section so the allowed maximum extent is the maximum
    image dimension supported for each dimension of the type of texture
    being queried (internal issue 257).
  * Clarify in the <<spirvenv-module-validation,Validation Rules within
    a Module>> section that at least one of the code:LocalSize execution
    mode or code:WorkgroupSize decoration is required for each compute
    shader entry point in a shader module (internal issue 279).
  * Add validity rules for formats in flink:vkCmdClearColorImage and
    flink:vkCmdClearDepthStencilImage (internal issue 283).
  * Clarify that slink:VkImageFormatProperties::pname:maxResourceSize is
    an upper bound, and that it may not be possible to create an image
    anywhere near that size (internal issue 284).

Other Commits:

  * Fix various minor markup errors reported by validation scripts.
  * Change copyright from Khronos Free Use License to Apache 2.0 license
    on relevant script/XML/header files. This does not affect the
    specification source copyright.

-----------------------------------------------------

Change log for April 15, 2016 Vulkan 1.0.10 spec update:

  * Bump API patch number and header version number to 10 for this
    update.

GitHub Issues:

  * Slightly tweak the <<memory-allocation,Host Memory>> allocator language
    so that an application wrapping the standard C alloc/free/realloc
    functions is still correct - the previous language was too strong with
    regards to freeing memory. Also made certain scenarios clearer - an
    implementation may now continue without error if an allocation failed
    and it is able to continue correctly (public issue 21).
  * Require that etext:VK_*_CREATE_SPARSE_BINDING_BIT is set when the
    corresponding etext:VK_*_CREATE_SPARSE_RESIDENCY_BIT is used, in the
    <<sparsememory-miptail,Mip Tail Regions>> section and related commands
    flink:vkCreateBuffer and flink:vkCreateImage (public issue 84).
  * Update the <<features,Features, Limits, and Formats>> chapter to clarify
    interactions between optional features and dynamic state for the
    pname:depthBiasClamp and pname:wideLines features (public issue 89).
  * Describe the code:WorkgroupSize builtin in the
    <<interfaces-builtin-variables,Built-In Variables>> section, and update
    the <<compute-shaders,Compute Shaders>> section to further clarify how
    to set the number of workgroups to execute in a compute shader (public
    issue 145).
  * Use the term *image subresource* everywhere instead of *subresource*,
    except for the special case of *host-accessible subresource*, which may
    be either an image subresource or buffer range (public issue 120)
  * Add a note to the <<features,Features, Limits, and Formats>> section
    about extensibility of structures (Public issue 165).
  * Fix return code flink:vkAcquireNextImageKHR when the timeout parameter
    is 0 to ename:VK_NOT_READY instead of ename:VK_TIMEOUT (public issue
    170).
  * Fix typo in slink:VkLayerProperties::pname:apiVersion field (public
    issue 172).

Internal Issues:

  * Fix a few minor internally-detected typos.
  * Minor formatting tweaks to pseudocode in the <<resources,Resource
    Creation>> chapter (internal issue 179).
  * Fix typo in the definition of point sampling for
    elink:VkCullModeFlagBits (internal issue 268).

-----------------------------------------------------

Change log for April 8, 2016 Vulkan 1.0.9 spec update:

  * Bump API patch number and header version number to 9 for this
    update.

GitHub Issues:

  * Fix memory type preorder definition and clarify example list and source
    code for slink:VkMemoryRequirements and slink:VkMemoryHeap (public issue
    26).
  * Ensure slink:VkAllocationCallbacks are properly defined (public issue
    73).
  * Clarify the WSI extension language by switching from the fuzzier
    "ownership" language to more-consistent "acquire" language (public issue
    117).
  * Add language allowing allocation and freeing of memory scoped to the
    duration of any API command in the <<memory-allocation,Memory
    Allocation>> section (public issue 136).
  * Clarify the explicit location assignment always overrides the inherited
    location in the <<interfaces-iointerfaces-locations,Location
    Assignment>> section, even for the first member of a block (public issue
    141).
  * Fixed references to
    slink:VkCommandBufferInheritanceInfo::pname:pipelineStatistics (public
    issue 158).
  * Fix name of slink:VkBufferCopy::pname:size field in validity language
    for flink:vkCmdCopyBuffer (public issue 162).

Internal Issues:

  * Update GL_KHR_vulkan_glsl specification to clarify disallowance of
    spec-const arrays in initializers (internal issue 248).
  * Clarify <<interfaces-iointerfaces-matching,Interface Matching>> section
    to state that user-defined variable interface must match too (internal
    issue 250).

-----------------------------------------------------

Change log for April 1, 2016 Vulkan 1.0.8 spec update:

  * Bump API patch number and header version number to 8 for this
    update.

GitHub Issues:

  * Specify in the validity language for flink:vkBeginCommandBuffer that
    pname:commandBuffer must not currently be pending execution (public
    issue 96).
  * Describe depth comparison using the correct temporary variable names
    in the <<textures-depth-compare-operation,Depth Compare Operation>>
    section (public issue 100).
  * Clarify the order of descriptor update operations in the
    flink:vkUpdateDescriptorSets command (public issue 115).
  * Specify in the VK_KHR_swapchain extension that
    flink:vkAcquireNextImageKHR's pname:semaphore and pname:fence
    parameters cannot both be sname:VK_NULL_HANDLE (partly addresses,
    but does not fully close, public issue 117 / internal issue 246).
  * Change reference to the "lifetime" of a Vulkan command to
    "duration", and define the "duration" term (public issue 135).
  * Added valid usage language for slink:VkImageLayout to require both
    pname:height and pname:depth to be 1 for 1D images and pname:depth
    to be 1 for 2D images (public issue 137).
  * Fix SPIR-V example code in the
    <<descriptorsets-inputattachment,Input Attachment>> section to
    properly decorate the code:InputAttachmentIndex (public issue 139).
  * Fix reference to nonexistent pname:imageInfo in the description of
    flink:VkWriteDescriptorSet to refer to pname:pImageInfo (public
    issue 140).

Internal Issues:

  * Link to the fixed-function vertex chapter from the drawing chapter
    (internal issue 110)
  * Fix typo in slink:VkImageCreateInfo validity language:
    ptext:maxExtent.sampleCounts -> pname:sampleCounts (internal issue
    249).
  * Explain why the non-core token etext:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
    is used in the example in the
    <<synchronization-semaphores,Semaphores>> section (internal issue
    251).
  * Attempt to clarify in the VK_KHR_android_surface extension's
    <<platformQuerySupport_android,Android Platform Support>> section
    that there is no Android-specific WSI query, and why (internal issue
    252).

Other Commits:

  * Add missing language about ename:VK_INCOMPLETE being returned from
    array queries when the passed array is too short, in the
    VK_KHR_display, VK_KHR_swapchain, and VK_KHR_surface extensions.

-----------------------------------------------------

Change log for March 25, 2016 Vulkan 1.0.7 spec update:

  * Bump API patch number and header version number to 7 for this
    update.

GitHub Issues:

  * Fix slink:VkSpecializationMapEntry example to avoid C/C++ strict
    aliasing issues (public issue 14).
  * Clarify the meaning of "matching" in flink:vkCmdBindDescriptorSets
    validity language (public issue 33).
  * Add stub reference pages so xrefs to not-yet-written pages do not
    generate 404 errors. However, the actual content of these pages
    still needs to be filled in as time allows (public issue 44, but
    does not close that issue out).
  * Remove incorrect validity statement for
    flink:vkGetImageSparseMemoryRequirements (public issue 85).
  * Reword the
    <<features-limits-bufferImageGranularity,bufferImageGranularity>>
    feature in terms of "aliasing", and clarify that it applies to
    bindings in the same memory object (public issue 90).
  * Clarify the relationship of the slink:VkPhysicalDeviceLimits
    pname:maxViewportDimensions and pname:viewportBoundsRange limits
    (public issue 92).
  * Specify sparse unbound texture replacement in the
    <<textures-texel-replacement,Texel Replacement>> section
    independently of robust buffer access language (public issue 100).
  * Add the <<fundamentals-architecture-model,Architecture Model>>
    section to explain architecture constraints Vulkan has chosen to
    accept in order to enable portable and performant code (public issue
    122).
  * State that an object must not be destroyed until *all* (not *any*)
    uses of that object have completed (public issue 123).
  * Minor editorial cleanup (public issues 129, 134, 146, 148).
  * Add validity language for layer and extension names to
    slink:VkDeviceCreateInfo matching that used for
    slink:VkInstanceCreateInfo (public issue 130).
  * Clean up terminology for the case when the bits set in one bitmask
    are a subset of the bits set in another bitmask (public issue 138).
  * Document that input attachments are UniformConstant not Input, in
    the <<interfaces-inputattachment,Fragment Input Attachment
    Interface>> section (public glslang bug 169).

Internal Issues:

  * Add max enum values to "flag bits" enums (internal issue 136).
  * Clarify language around the various uses of the term "block" in the
    <<appendix-compressedtex-bc,Block Compressed Image Formats>> section
    (internal issue 202).
  * Removed "expand" dependency from <enums> groups in vk.xml and added
    auto-generation code in the scripts to infer it instead, to ensure
    consistency. This caused renaming of sname:VkColorSpaceKHR and
    sname:VkPresentModeKHR etext:BEGIN_RANGE (etc.) tokens, but those
    tokens are metadata, not part of the API, and the Vulkan WG is OK
    with this change. This change adds ranges to two additional enums
    that were missing them due to not defining the "expand" attribute
    (internal issue 217).
  * Tweak makefile to generate ref page nroff (.3) files in the right
    output directory, working around an a2x limitation (internal issue
    223).

Other Commits:

  * Add validity requirements for flink:vkCmdCopyQueryPoolResults
    pname:dstBuffer parameter.
  * Fix ref page build to generate .3 targets in the right output
    directory.

-----------------------------------------------------

Change log for March 10, 2016 Vulkan 1.0.6 spec update:

  * Bump API patch number and header version number to 6 for this
    update.

GitHub Issues:

  * Define 'invocation group' for compute and graphics shaders. Cleanup
    definition and use of 'workgroup', and add glossary entries (public
    issue 1).
  * Various minor editorial fixes (public issue 33).
  * Clarify locations for block members in the
    <<interfaces-iointerfaces-locations,Location Assignment>>
    section (public issue 45).
  * Editorial fixes for <<commandbuffer-allocation,Command Buffer
    Allocation>> section (public issues 54, 59).
  * Clarify behavior of depth test in the <<fragops-depth,Depth Test>>
    section (public issues 80, 81).
  * Remove discussion of return codes from
    flink:vkGetPhysicalDeviceSparseImageFormatProperties and
    flink:vkGetImageSparseMemoryRequirements, which do not return values
    (public issue 82).
  * Allow flink:vkCmdDrawIndirect and flink:vkCmdDrawIndexedIndirect
    pname:drawCount of 0, as well as 1, when the multiDrawIndirect
    feature is not supported (public issue 88).
  * Remove confusing wording in the <<features-limits, Limits>>
    section describing the slink:VkPhysicalDeviceLimits
    pname:minTexelBufferOffsetAlignment,
    pname:minUniformBufferOffsetAlignment, and
    pname:minStorageBufferOffsetAlignment members as both minimums and
    maximums (public issue 91).
  * Clarified that only the RGB components should be affected in places
    where sRGB is referred to in the spec, such as ASTC formats. Minor
    re-wording to avoid "color space" when actively incorrect, now that
    we refer to the Data Format Spec which actually makes a distinction
    between color space and transfer function (public issue 94).
  * Treat pname:pPropertyCount == 0 consistently in
    flink:vkEnumerateInstanceLayerProperties and
    flink:vkEnumerateDeviceLayerProperties (public issue 99)
  * Cleanup minor editorial issues in chapters 14-17 (public issue 100).
  * Clarify definition of flink:vkEnumerateInstanceExtensionProperties
    and flink:vkEnumerateDeviceExtensionProperties (public issue 101).
  * Define the flink:vkEnumerateInstanceExtensionProperties and
    flink:vkEnumerateDeviceExtensionProperties pname:pLayerName
    parameter to be a pointer to a null-terminated UTF-8 string (public
    issue 101).
  * Rearrange "Missing information" references in mandatory format
    tables (public issue 101).
  * Clarify that the enumerated extensions returned by
    flink:vkEnumerateInstanceExtensionProperties and
    flink:vkEnumerateDeviceExtensionProperties will only include
    extensions provided by the platform or extensions implemented in
    implicitly enabled layers (public issue 101).
  * Miscellaneous editorial fixes. Include the Vulkan spec patch number
    in the PDF title. Fix label on <<fig-non-strict-lines,Non
    strict lines>> diagram. Use more easily distinguished symbols in
    tables in the <<features-required-format-support, Required
    Format Support>> section. Do not require FQDNs used as layer names be
    encoded in lower case if not possible, in the
    <<extensions-naming-conventions, Extension and Layer Naming
    Conventions>> section (public issues 101, 119, 121).

Internal Issues:

  * Fixed excessive spacing in tables in XHTML (internal issue 18).
  * Clarify that ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
    applies to secondary command buffers. Previously spec only referred
    to the members of pname:pCommandBuffers being affected by this bit.
    Added a separate slink:VkSubmitInfo Valid Usage restriction
    specifying that ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
    also applies to any secondary command buffers that are recorded into
    the primary command buffers in pname:pCommandBuffers (internal issue
    106).
  * Clarify that slink:VkDeviceCreateInfo::pname:pEnabledFeatures can be
    NULL (internal issue 117).
  * Remove "the value of" where it is redundant (e.g. speaking of an API
    parameter, struct member, or SPIR-V variable, but not when speaking
    of color components) (internal issue 175).
  * Forced patch version to always be 0 in the header. Add a
    "VK_API_VERSION_<major>_<minor>" macro for people to use to do the
    right thing. Add a VK_HEADER_VERSION which captures the header
    release number independent of the spec patch number (internal issue
    176).
  * Correct description of
    slink:VkPipelineShaderStageCreateInfo::pname:pName to "a pointer to
    a null-terminated UTF-8 string" (internal issue 197).

Other Commits:

  * Updated DataFormat spec reference to the new date for revision 5 of
    that spec.
  * Fixed KEEP option (to retain LaTeX intermediate files) in the
    Makefile to be included when edited there, as well as set on the
    command line.
  * Reserve and add "VK_IMG_filter_cubic" to the registry, and implement
    script functionality to add and remove validity from existing
    functions. Includes schema and readme changes.
  * Update GL_KHR_vulkan_glsl so push_constants do not have descriptor
    sets.

-----------------------------------------------------

Change log for March 4, 2016 Vulkan 1.0.5 spec update:

  * Bump API patch number to 5 for this update.

GitHub Issues:

  * Correctly describe slink:VkPhysicalDeviceProperties pname:deviceName
    member as a string, not a pointer to a string. Also one typo fix for
    "hetereogeneous" (public issue 4).
  * Replace maynot: macro with may: not, and "may: or maynot:" with
    "may:" (public issue 4).
  * Clarify that redundantly setting the state of a fence or event has
    no effect (public issue 4).
  * Minor fixes to ref pages to track descriptions of memory bits that
    changed in the core spec. Fix name of a member in the description of
    sname:sname:VkPipelineMultisampleStateCreateInfo (public issues 8,
    13).
  * Remove redundant validity statement for
    sname:VkGraphicsPipelineCreateInfo::pname:stageCount (public issue
    14).
  * Fix typos in chapters 7-9 (public issue 14).
  * Clarify the example demonstrating the behavior of
    code:OpMemoryBarrier in the
    <<shaders-execution-memory-ordering,shader memory access
    ordering>> section (public issue 16).
  * Specify that freeing mapped memory implicitly unmaps the memory in
    the description of flink:vkFreeMemory (public issue 17).
  * Forbid allocation callbacks from calling into the API in the
    <<memory-allocation,memory allocation>> section (public issue
    20).
  * Add missing validity rules about size being greater than 0 and
    offset being less than size of object. Fix
    flink:VkMappedMemoryRange's misinterpretation of offset (public
    issues 27, 31).
  * Add validity rule disallowing overlapping source/destination
    descriptors in flink:VkCopyDescriptorSet (public issue 32).
  * Clarify that array and matrix stride has to be a multiple of the
    base alignment of the array or matrix in the
    <<interfaces-resources-layout,Offset and Stride Assignment>>
    section (public issue 38).
  * Correct parenthesis floor nesting error in equation for
    <<textures-RGB-sexp,RGB to shared exponent conversion>>.
    Clarify case of when exp' is forced to 0, avoiding log2(0) undefined
    problem (public issue 40).
  * Remove redundant statement from the code:FragDepth description in
    the <<interfaces-builtin-variables,Built-In Variables>>
    section (public issue 47).
  * Define the clamping of the
    <<textures-level-of-detail-operation,bias added to the scale
    factor>> by linking to the slink:VkPhysicalDevice feature
    pname:maxSamplerLodBias (public issue 64).
  * Fix typo "optimal linear resources" and clarify the set of resources
    <<features-limits-bufferImageGranularity,the
    pname:bufferImageGranularity resource>> applies to (public issue
    67).
  * Replace 'descriptor accessed by a pipeline' language for
    sname:VkDescriptorSetAllocateInfo with more precise phrasing about
    binding a descriptor set before a command that invokes work using
    that set (public issue 69).
  * tstripadj.svg contained an Inkscape tag which caused Firefox and IE
    11 to fail to render it, and was illegal SVG. Generating Plain SVG
    from the Inkscape SVG source fixes this (public issue 70).
  * Fix validity for sname:VkVertexInputBindingDescription and
    sname:VkVertexInputAttributeDescription numbers (public issue 72).

Internal Issues:

  * Clarify the meaning of
    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT in
    elink:VkFormatFeatureFlagBits with respect to depth compare
    (internal issue 107).
  * Added a note explaining that ename:VK_QUEUE_TRANSFER_BIT may or may
    not be reported for a queue family that already supports
    ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT as the
    former is a strict subset of the latter ones (internal issue 116).
  * Add validity language for sname:VkDescriptorSetAllocateInfo about
    exceeding the descriptor pool capacity (internal issue 140).
  * Add ename:VK_INCOMPLETE success code for
    flink:vkEnumeratePhysicalDevices query (internal issue 163).

Other Commits:

  * Add the VK_NV_glsl_shader extension definitions to the API.
  * Update GL_KHR_vulkan_glsl with 1) origin_upper_left as default 2)
    specialization array constant semantics.
  * Corrected/updated Data Format Specification date.

-----------------------------------------------------

Change log for February 25, 2015 Vulkan 1.0.4 spec update:

  * Bump API patch number from 3 to 4 for the first public update to the
    spec. Add patch number to the spec title (this will be done
    automatically from XML, later).
  * Fixes for numerous editorial issues. Regularize descriptions of
    variable-length array queries. Properly tag enumerants so they come
    out in the right font (many were mislabeled in usage tags in vk.xml,
    or not tagged). Spelling and markup corrections (public issue 4).
  * Fix typos and clearly separate description of different types of
    memory areas (public issue 5).
  * Use standards-compliant preprocessor guard symbols on headers
    (public issue 7).
  * Note that GitHub users cannot currently set labels on issues, and
    recommend a fallback approach (public issue 15).
  * Use latexmath prefix on len= attributes (public issue 29).
  * Make flink:vkCmdUpdateBuffer pname:dataSize limit consistent (public
    issue 65).
  * Add VK_KHR_mirror_clamp_to_edge extension to core API branch, as an
    optional feature not introducing new commands or enums (internal
    issue 104).
  * Cleanup invariance language inherited from the GL specification to
    not refer to nonexistent (GL-specific) state (internal issue 111).
  * Modify the flink:vkCmdDrawIndexed pname:vertexOffset definition to
    not be the "base offset within the index buffer" but rather the
    "value added to the vertex index before indexing into the vertex
    buffer" (internal issue 118).
  * Fix drawing chapter in the "Programmable Primitive Shading" section
    where it described categories of drawing commands. It referenced
    flink:vkCmdDrawIndexed twice. Replace the second reference with
    flink:vkCmdDrawIndexedIndirect (internal issue 119).
  * Typo fixed in <<sparsememory-examples-advanced,Advanced Sparse
    Resources>> sparse memory example (internal issue 122).
  * Add flink:VkDisplayPlaneAlphaFlagsKHR to <require> section of
    VK_KHR_display extension (internal issue 125)
  * Add missing optional="false,true" to
    flink:vkGetImageSparseMemoryRequirements
    pname:pSparseMemoryRequirementCount parameter (internal issue 132)
  * Rename ename:VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT to
    ename:VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT
    (internal issue 133)
  * Fix a handful of broken cross-references in the
    <<samplers,Samplers>> chapter (internal issue 134).
  * Fix "Input Attachment" GLSL example to use correct syntax (internal
    issue 135).
  * Update XML schema and documentation to accommodate recently added
    attributes for validity. Add some introductory material describing
    design choices and pointing to the public repository to file issues.
  * Put include of validity in the core spec extensions chapter on its
    own line, so that asciidoc is happy.
  * Fix vertexOffset language to specify that it is the value added to
    the vertex index before indexing into the vertex buffer, not the
    base offset within the index buffer.
  * Fix error in the description of flink:vkCmdNextSubpass.

-----------------------------------------------------

February 16, 2016 - Vulkan 1.0 initial public release

