Copyright 2016-2021 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.

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

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`" rather than "`cubemap`" 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 accomodate 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 missiong `optional` attribute to
    flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR::pname:pVideoFormatPropertyCount
    in `vk.xml` (public pull request 1514).
  * Add additional header dependecies 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 interger 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:

  * Specifiy 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 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 staement 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 returing 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:kWaitSemaphores 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), don'
    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. dditionally, the definition
    of "`color sample mask`" and discussions of it have been removed in
    favour 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 is 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).
  * 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 handle literal block delimiters and lines containing
    only whitespace properly (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's of enough scope to create a
    and 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).
  * Synchronize 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 an
    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 required core versions and/or extensions 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>> 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 insures 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.
  * 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).

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:

  * 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>> 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 competed 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::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
    accomodate, 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 imcompatible change to an EXT
    that's very recently released; 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's 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::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, accomodating 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 (see public issue 814
    - does not close this, however).
  * 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's 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 mutiple
    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 + KHR extensions and Vulkan 1.0 +
    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's 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 correspondance/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's 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 colour 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 Extenions:

  * `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
    re-use 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 +
    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 strucure, 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's 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's 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 engineE 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's 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 "correponds" 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 acces
    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 Attachement" 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

