diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index fb6aeb1b2..8e71e4348 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -21,8 +21,8 @@ jobs: runs-on: ubuntu-latest # We now refer to the container by its SHA instead of the name, to prevent # caching problems when updating the image. - # container: khronosgroup/docker-images:asciidoctor-spec - container: khronosgroup/docker-images@sha256:42123ba13792c4e809d037b69152c2230ad97fbf43b677338075ab9c928ab6ed + # container: khronosgroup/docker-images:asciidoctor-spec.20240702 + container: khronosgroup/docker-images@sha256:4aab96a03ef292439c9bd0f972adfa29cdf838d0909b1cb4ec2a6d7b2d14a37f steps: - uses: actions/checkout@v4 @@ -32,12 +32,12 @@ jobs: terminology-check: name: Run various checker scripts on the spec and XML sources runs-on: ubuntu-latest - container: khronosgroup/docker-images@sha256:42123ba13792c4e809d037b69152c2230ad97fbf43b677338075ab9c928ab6ed + container: khronosgroup/docker-images@sha256:4aab96a03ef292439c9bd0f972adfa29cdf838d0909b1cb4ec2a6d7b2d14a37f steps: - uses: actions/checkout@v4 - name: Internal self-test of the check_spec_links script - run: py.test-3 test*.py + run: pytest test*.py working-directory: scripts - name: Generate a summary of problems for CI logs (if any) run: | @@ -48,7 +48,7 @@ jobs: spec-core: name: Build the core-only spec, to try and catch ifdef errors in extension markup runs-on: ubuntu-latest - container: khronosgroup/docker-images@sha256:42123ba13792c4e809d037b69152c2230ad97fbf43b677338075ab9c928ab6ed + container: khronosgroup/docker-images@sha256:4aab96a03ef292439c9bd0f972adfa29cdf838d0909b1cb4ec2a6d7b2d14a37f steps: - uses: actions/checkout@v4 @@ -57,7 +57,7 @@ jobs: spec-generate: name: Build the vulkan specification and generate any associated files (such as vulkan.h) runs-on: ubuntu-latest - container: khronosgroup/docker-images@sha256:42123ba13792c4e809d037b69152c2230ad97fbf43b677338075ab9c928ab6ed + container: khronosgroup/docker-images@sha256:4aab96a03ef292439c9bd0f972adfa29cdf838d0909b1cb4ec2a6d7b2d14a37f steps: - uses: actions/checkout@v4 @@ -185,7 +185,7 @@ jobs: cts-framework-tests: name: Run Vulkan CTS framework tests to validate against XML changes runs-on: ubuntu-latest - container: khronosgroup/docker-images@sha256:42123ba13792c4e809d037b69152c2230ad97fbf43b677338075ab9c928ab6ed + container: khronosgroup/docker-images@sha256:4aab96a03ef292439c9bd0f972adfa29cdf838d0909b1cb4ec2a6d7b2d14a37f continue-on-error: true steps: diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 02708cc7c..8c986ce25 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,8 +6,8 @@ # All stages use the same Docker image, so there are no prerequisites # Refer to the container by its SHA instead of the name, to prevent # caching problems when updating the image. -# image: khronosgroup/docker-images:asciidoctor-spec -image: khronosgroup/docker-images@sha256:91a1b62399f9804e17110e89d85d62e90bc8d2ad7b94a329bee87784158368a9 +# image: khronosgroup/docker-images:asciidoctor-spec.20240702 +image: khronosgroup/docker-images@sha256:4aab96a03ef292439c9bd0f972adfa29cdf838d0909b1cb4ec2a6d7b2d14a37f # Specify which gitlab runner to use default: @@ -31,7 +31,7 @@ terminology_check: # Nothing, all prerequisites are in the Docker image script: # Internal self-test of the check_spec_links script - - ( cd scripts && py.test-3 test*.py ) + - ( cd scripts && pytest test*.py ) - mkdir -p gen/out/checks # Generate a summary of problems for CI logs (if any) # Override CHECK_XREFS to avoid building a redundant HTML target at this stage diff --git a/.reuse/dep5 b/.reuse/dep5 index e2486a3bb..be2270049 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -2,7 +2,7 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: Vulkan-Docs Source: https://github.com/KhronosGroup/Vulkan-Docs -Files: images/*.svg config/chunkindex/custom.patch config/CI/contractions* config/CI/writing config/CI/txt-files-allowed config/*/docinfo-header.html build_tests/expectations/* build_tests/images/*.svg images/proposals/*.svg +Files: images/*.svg config/chunkindex/custom.patch config/CI/* config/*/docinfo-header.html build_tests/expectations/* build_tests/images/*.svg images/proposals/*.svg Copyright: 2015-2024 The Khronos Group Inc. License: CC-BY-4.0 diff --git a/BUILD.adoc b/BUILD.adoc index b9c2b3674..16187430e 100644 --- a/BUILD.adoc +++ b/BUILD.adoc @@ -426,7 +426,7 @@ image name. The SHA256 can be determined from which will print a line like - image: khronosgroup/docker-images@sha256:42123ba13792c4e809d037b69152c2230ad97fbf43b677338075ab9c928ab6ed + image: khronosgroup/docker-images@sha256:4aab96a03ef292439c9bd0f972adfa29cdf838d0909b1cb4ec2a6d7b2d14a37f Everything following `image: ` is the to use. The first time you try to run a container with this , as is done by the `runDocker` @@ -520,7 +520,7 @@ https://github.com/KhronosGroup/Vulkan-Docs/pull/2286 for more. * 2017-01-06 - Replace MathJax with KaTeX. * 2016-08-25 - Update for the single-branch model. * 2016-07-10 - Update for current state of spec and ref page generation. - * 2015-11-11 - Add new can: etc. + * 2015-11-11 - Add new *can* etc. macros and DBLATEXPREFIX variable. * 2015-09-21 - Convert document to asciidoc and rename to README.md in the hope the gitlab browser will render it in some fashion. diff --git a/ChangeLog.adoc b/ChangeLog.adoc index d0bd71f2c..2f4c099f6 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -14,6 +14,50 @@ appears frequently in the change log. ''' +Change log for July 12, 2024 Vulkan 1.3.290 spec update: + + * Explicitly state that PackHalf2x16 rounding is implementation-dependent + <> section (public + issue 1825). + * Update `asciidoctor-spec` Docker build image to one based on ruby:3.3.3 + to reduce the number of reported CVEs on the image and update toolchain + components (public MR 2073, internal MR 6754). + * Fix display/encoding statements and interchanged concepts of EOTF and + OETF for the VK_EXT_swapchain_colorspace extension (partially addresses + public issue 2312). + * Fix < image + equations>> and corresponding common validity statements for block image + formats (public issues 2377 and 2378). + * Clarify that the query LOD is relative to the base level in the + <> section (public issues + 2383). + +Internal Issues + + * Improve cross-referencing links in refpages, primarily by adding + crosslinks for all corresponding VkFlags* / VkFlagBits* types (internal + issue 861). + * Clarify VUs for OpCooperativeMatrixMulAdd (internal issue 3708). + * Add CI check for consistency of Vk*Flags and corresponding Vk*FlagBits + type names and sizes (internal issue 3716). + * Add CI check to prevent custom macro use in proposal documents (internal + issue 3919). + * Remove references to "`reference monitor`" in the VK_EXT_hdr_metadata + extension and replace with "`display used to optimize the content`" + (internal MR 6566). + * Add new <> + section summarizing behavior of commands which query arrays (internal MR + 6685). + * Fix incorrect description of + VkDisplaySurfaceCreateInfoKHR::VkDisplayPlaneAlphaFlagBitsKHR in + `vk.xml` (internal MR 6704). + * Add additional terminology checks to CI (internal MR 6747). + * Fix VkFramebufferCreateInfo VU 04587 (internal MR 6756). + * Remove redundant VU 08921 (internal MR 6766). + * Fix a/an typos (internal MR 6773). + +''' + Change log for June 28, 2024 Vulkan 1.3.289 spec update: Internal Issues @@ -3177,7 +3221,7 @@ Public Issues: elink:VK_COLOR_SPACE_PASS_THROUGH_EXT for a linear or non-gamma transfer function color space (public merge request 1729). * Fix clamp expression for d_{lo} in the - <> + <> section (partial fix for public issue 1836). * Update <> to add explicit valid usage statements for code:Uniform @@ -8576,7 +8620,7 @@ GitHub Issues: Internal Issues: * Clarify range and precision of code:OpImageQueryLod in the discussion of - scale factor and level-of-detail operation in the + scale factor and LOD operation in the <> section (internal issues 926, 1719). * Fix framebuffer layer valid usage statements for @@ -10978,7 +11022,7 @@ Internal Issues: * Specify which storage classes can have an initializer in the <> section (internal issue 1023). - * Use "LOD" consistently for "level-of-detail", to eliminate spelling + * Use "LOD" consistently for "level{nbsp} of detail", to eliminate spelling inconsistencies. The term is already standardized in the Glossary (internal issue 1027). @@ -11024,7 +11068,7 @@ Internal Issues: <> section (internal issue 820). * Update the <> - equations so that the parameters returned by the level-of-detail query + equations so that the parameters returned by the LOD query appear explicitly, also fixing the issue that linear filtering would select a level below the base level for magnification (internal issue 926). @@ -11453,7 +11497,7 @@ GitHub Issues: Internal Issues: * Fix tessellation domain to have an upper-left origin in the - <> and related + <> 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). @@ -12182,7 +12226,7 @@ Internal Issues: extensions (internal issue 448). * Add the +<>+ and +<>+ extensions (internal issue 449). - * Update the texture level-of-detail equation in the + * Update the texture LOD equation in the <> section to better approximate the ellipse major and minor axes (internal issue 547). * Forbid non-explicitly allowed uses of interface decorations in the @@ -13880,10 +13924,9 @@ GitHub Issues: * Remove redundant statement from the code:FragDepth description in the <> section (public issue 47). - * Define the clamping of the - <> by linking to the slink:VkPhysicalDevice feature - pname:maxSamplerLodBias (public issue 64). + * Define the clamping of the <> by linking to the slink:VkPhysicalDevice + feature pname:maxSamplerLodBias (public issue 64). * Fix typo "optimal linear resources" and clarify the set of resources <> applies to (public issue diff --git a/Makefile b/Makefile index 1b07c6e39..41708476a 100644 --- a/Makefile +++ b/Makefile @@ -82,6 +82,7 @@ allchecks: check-copyright-dates \ check-links \ check-consistency \ check-undefined \ + check-custom-macros \ check-txtfiles \ $(CHECK_XREFS) @@ -138,7 +139,7 @@ VERBOSE = # ADOCOPTS options for asciidoc->HTML5 output NOTEOPTS = -a editing-notes -a implementation-guide -PATCHVERSION = 289 +PATCHVERSION = 290 BASEOPTS = ifneq (,$(findstring VKSC_VERSION_1_0,$(VERSIONS))) @@ -437,7 +438,7 @@ reflow: # 'ci-allchecks' targets or individually. # Look for disallowed contractions -CHECK_CONTRACTIONS = git grep -i -F -f $(ROOTDIR)/config/CI/contractions | egrep -v -E -f $(ROOTDIR)/config/CI/contractions-allowed +CHECK_CONTRACTIONS = git grep -n -i -F -f $(ROOTDIR)/config/CI/contractions | egrep -v -E -f $(ROOTDIR)/config/CI/contractions-allowed check-contractions: if test `$(CHECK_CONTRACTIONS) | wc -l` != 0 ; then \ echo "Contractions found that are not allowed:" ; \ @@ -453,11 +454,13 @@ check-duplicates: exit 1 ; \ fi -# Look for typos and suggest fixes -CODESPELL = codespell --config $(ROOTDIR)/config/CI/codespellrc -S '*.js' -S './antora*/*' -S 'ERRS*,*.pdf,*.html' +# Look for typos and unpreferred terms, and suggest fixes. +# Harder to detect (e.g. case-sensitive) typos are handled in the +# check-writing target below. +CODESPELL = codespell --config $(ROOTDIR)/config/CI/codespellrc check-spelling: if ! $(CODESPELL) > /dev/null ; then \ - echo "Found probable misspellings. Corrections can be added to config/CI/codespell-allowed:" ; \ + echo "Found probable misspellings. Corrections can be added to config/CI/codespell-allowed, or files excluded in config/CI/codespellrc if there is no other option:" ; \ $(CODESPELL) ; \ exit 1 ; \ fi @@ -465,7 +468,7 @@ check-spelling: # Look for old or unpreferred language in specification language. # This mostly helps when we make global changes that also need to be # made in outstanding extension branches for new text. -CHECK_WRITING = git grep -E -f $(ROOTDIR)/config/CI/writing $(SPECDIR)/registry.adoc $(SPECDIR)/vkspec.adoc $(SPECDIR)/chapters $(SPECDIR)/appendices +CHECK_WRITING = git grep -n -E -f $(ROOTDIR)/config/CI/writing $(SPECDIR)/registry.adoc $(SPECDIR)/vkspec.adoc $(SPECDIR)/chapters $(SPECDIR)/appendices check-writing: if test `$(CHECK_WRITING) | wc -l` != 0 ; then \ echo "Found old style writing. Please refer to the style guide or similar language in current main branch for fixes:" ; \ @@ -474,7 +477,7 @@ check-writing: fi # Look for bullet list items not preceded by exactly two spaces, per styleguide -CHECK_BULLETS = git grep -E '^( | +)[-*]+ ' $(SPECDIR)/chapters $(SPECDIR)/appendices $(SPECDIR)/style $(SPECDIR)/[a-z]*.adoc +CHECK_BULLETS = git grep -n -E '^( | +)[-*]+ ' $(SPECDIR)/chapters $(SPECDIR)/appendices $(SPECDIR)/style $(SPECDIR)/[a-z]*.adoc check-bullets: if test `$(CHECK_BULLETS) | wc -l` != 0 ; then \ echo "Bullet list item found not preceded by exactly two spaces:" ; \ @@ -508,10 +511,20 @@ check-links: check-consistency: $(PYTHON) $(SCRIPTS)/xml_consistency.py -# Looks for untagged use of 'undefined' in spec sources +# Look for untagged use of 'undefined' in spec sources check-undefined: $(SCRIPTS)/ci/check_undefined +# Look for use of custom macros in the proposals and other +# non-Specification document (except for the ChangeLog*.adoc) markup +CHECK_CUSTOM_MACROS = git grep -n -E -f $(ROOTDIR)/config/CI/custom-macros [A-Z][A-Z]*.adoc proposals/ +check-custom-macros: + if test `$(CHECK_CUSTOM_MACROS) | wc -l` != 0 ; then \ + echo "Found use of specification macros in proposal or repository metadocumentation, where they are not allowed. Please use straight asciidoc markup like *must* for fixes:" ; \ + $(CHECK_CUSTOM_MACROS) ; \ + exit 1 ; \ + fi + # Look for '.txt' and '.asciidoc' files, which should almost all be .adoc now CHECK_TXTFILES = find . -name '*.txt' -o -name '*.asciidoc' | egrep -v -E -f $(ROOTDIR)/config/CI/txt-files-allowed check-txtfiles: @@ -523,7 +536,7 @@ check-txtfiles: # Check for valid xrefs in the output html check-xrefs: $(HTMLDIR)/vkspec.html - $(SCRIPTS)/check_html_xrefs.py $(HTMLDIR)/vkspec.html + $(PYTHON) $(SCRIPTS)/check_html_xrefs.py $(HTMLDIR)/vkspec.html # Clean generated and output files diff --git a/appendices/VK_EXT_device_address_binding_report.adoc b/appendices/VK_EXT_device_address_binding_report.adoc index d1f8f9535..ce4997cc2 100644 --- a/appendices/VK_EXT_device_address_binding_report.adoc +++ b/appendices/VK_EXT_device_address_binding_report.adoc @@ -50,7 +50,7 @@ such as buffers and images? *RESOLVED*: The extension covers all Vulkan objects, and is not restricted to objects backed by VkDeviceMemory objects. -3.) Should reallocation be identified explicitly, or as a unbind/bind pair? +3.) Should reallocation be identified explicitly, or as an unbind/bind pair? *RESOLVED*: Reallocation should be represented as an unbind/bind pair. diff --git a/appendices/VK_EXT_device_memory_report.adoc b/appendices/VK_EXT_device_memory_report.adoc index 6fce4e795..93d619911 100644 --- a/appendices/VK_EXT_device_memory_report.adoc +++ b/appendices/VK_EXT_device_memory_report.adoc @@ -148,7 +148,7 @@ like size and heap index reported? This fits in well with the callback infrastructure added in this extension, and implementation touches the same code and has the same overheads as the rest of the extension. -It could help debugging things like getting an +It could help debugging things like getting a ename:VK_ERROR_OUT_OF_HOST_MEMORY error when ending a command buffer. Right now the allocation failure could have happened anywhere during recording, and a callback would be really useful to understand where and diff --git a/appendices/VK_EXT_hdr_metadata.adoc b/appendices/VK_EXT_hdr_metadata.adoc index 0dd9c2ef2..7f86b52ea 100644 --- a/appendices/VK_EXT_hdr_metadata.adoc +++ b/appendices/VK_EXT_hdr_metadata.adoc @@ -7,50 +7,59 @@ include::{generated}/meta/{refprefix}VK_EXT_hdr_metadata.adoc[] === Other Extension Metadata *Last Modified Date*:: - 2018-12-19 + 2024-03-26 *IP Status*:: No known IP claims. *Contributors*:: - Courtney Goeltzenleuchter, Google + - Sebastian Wick, Red Hat Inc. + - Tobias Hector, AMD + === Description This extension defines two new structures and a function to assign SMPTE (the Society of Motion Picture and Television Engineers) 2086 metadata and CTA (Consumer Technology Association) 861.3 metadata to a swapchain. -The metadata includes the color primaries, white point, and luminance range -of the reference monitor, which all together define the color volume -containing all the possible colors the reference monitor can produce. -The reference monitor is the display where creative work is done and -creative intent is established. -To preserve such creative intent as much as possible and achieve consistent -color reproduction on different viewing displays, it is useful for the -display pipeline to know the color volume of the original reference monitor -where content was created or tuned. -This avoids performing unnecessary mapping of colors that are not -displayable on the original reference monitor. -The metadata also includes the pname:maxContentLightLevel and -pname:maxFrameAverageLightLevel as defined by CTA 861.3. - -While the intended purpose of the metadata is to assist in the -transformation between different color volumes of different displays and -help achieve better color reproduction, it is not in the scope of this -extension to define how exactly the metadata should be used in such a -process. -It is up to the implementation to determine how to make use of the metadata. + +SMPTE 2086 metadata defines the color volume of the display on which the +content was optimized for viewing and includes the color primaries, white +point, and luminance range. +When such content is reproduced on another display, this metadata can be +used by the presentation engine to improve processing of images. +For instance, values in the image can first be clamped to the color volume +described in the metadata, and then what remains can be remapped to the +color volume of the presentation engine. + +CTA 861.3 metadata additionally includes the maximum intended luminance for +the content and the maximum average light level across frames. + +This extension does not define exactly how this metadata is used, however, +it simply provides a mechanism to provide it to the presentation engine. +Presentation engines may process the image based on the metadata before +displaying it, resulting in the image being modified outside of Vulkan. +For example, the clamping of colors in the image to the color volume may +change those values in the image itself. + +The metadata does not override or otherwise influence the color space and +color encoding. + include::{generated}/interfaces/VK_EXT_hdr_metadata.adoc[] + === Issues -1) Do we need a query function? +1) Do we need a query function for the currently specified metadata? + +No, Vulkan does not provide queries for state that the application can track +on its own. -*PROPOSED*: No, Vulkan does not provide queries for state that the -application can track on its own. +2) Should we specify default metadata if not specified by the application? -2) Should we specify default if not specified by the application? +No, the metadata is optional and the absence of the metadata is +well-defined. -*PROPOSED*: No, that leaves the default up to the display. === Version History @@ -58,3 +67,5 @@ application can track on its own. ** Initial version * Revision 2, 2018-12-19 (Courtney Goeltzenleuchter) ** Correct implicit validity for VkHdrMetadataEXT structure + * Revision 3, 2024-03-26 (Tobias Hector & Sebastian Wick) + ** Clarifications and removal of erroneous "reference monitor" term diff --git a/appendices/VK_EXT_subgroup_size_control.adoc b/appendices/VK_EXT_subgroup_size_control.adoc index 394c60610..4b28278a3 100644 --- a/appendices/VK_EXT_subgroup_size_control.adoc +++ b/appendices/VK_EXT_subgroup_size_control.adoc @@ -58,9 +58,9 @@ For compute shaders, this requires the developer to query the and ensure that: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ s = { WorkGroupSize.x \times WorkGroupSize.y \times WorkgroupSize.z \leq SubgroupSize \times maxComputeWorkgroupSubgroups } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ Developers can also specify a new pipeline shader stage create flag that requires the implementation to have fully populated subgroups within local diff --git a/appendices/VK_EXT_swapchain_colorspace.adoc b/appendices/VK_EXT_swapchain_colorspace.adoc index 73d44f593..a927d2c58 100644 --- a/appendices/VK_EXT_swapchain_colorspace.adoc +++ b/appendices/VK_EXT_swapchain_colorspace.adoc @@ -60,3 +60,7 @@ described by separate extension. ** Clarify color space transfer function usage. ** Refer to normative definitions in the Data Format Specification. ** Clarify DCI-P3 and Display P3 usage. + + * Revision 5, 2024-03-16 (Zehui Lin) + ** Fix interchanged concepts of EOTF and OETF. + ** Clarify that the presentation engine can accept the color spaces. diff --git a/appendices/VK_INTEL_performance_query.adoc b/appendices/VK_INTEL_performance_query.adoc index 595b0a4a0..001f49117 100644 --- a/appendices/VK_INTEL_performance_query.adoc +++ b/appendices/VK_INTEL_performance_query.adoc @@ -22,7 +22,7 @@ interpreted by an external application or library. Such a library is available at : https://github.com/intel/metrics-discovery Performance analysis tools such as -link:++https://software.intel.com/content/www/us/en/develop/tools/graphics-performance-analyzers.html++[Graphics +link:++https://www.intel.com/content/www/us/en/developer/tools/graphics-performance-analyzers/overview.html++[Graphics Performance Analyzers] make use of this extension and the metrics-discovery library to present the data in a human readable way. diff --git a/appendices/VK_NV_geometry_shader_passthrough.adoc b/appendices/VK_NV_geometry_shader_passthrough.adoc index 3c398b83d..6fabd89d0 100644 --- a/appendices/VK_NV_geometry_shader_passthrough.adoc +++ b/appendices/VK_NV_geometry_shader_passthrough.adoc @@ -82,7 +82,7 @@ following table. *RESOLVED*: This is described in <>. -In GL when using passthough geometry shaders in separable mode, all inputs +In GL when using passthrough geometry shaders in separable mode, all inputs must also be explicitly assigned location layout qualifiers. In Vulkan all SPIR-V shader inputs (except built-ins) must also have location decorations specified. diff --git a/appendices/VK_QCOM_ycbcr_degamma.adoc b/appendices/VK_QCOM_ycbcr_degamma.adoc index e03848f18..c56d209ae 100644 --- a/appendices/VK_QCOM_ycbcr_degamma.adoc +++ b/appendices/VK_QCOM_ycbcr_degamma.adoc @@ -75,11 +75,11 @@ significant. Performing the "`sRGB degamma`" prior to range expansion can introduce artifacts if the content uses ename:VK_SAMPLER_YCBCR_RANGE_ITU_NARROW encoding. -Nevertheless, using sRGB can make sense for certain use-cases where camera +Nevertheless, using sRGB can make sense for certain use cases where camera YCbCr images are known to be encoded with sRGB (or a pure gamma 2.2) transfer function and are known to use full-range encoding. -For those use-cases, this extension leverages the GPU ability to enable sRGB +For those use cases, this extension leverages the GPU ability to enable sRGB degamma at little cost, and can improve quality because texture filtering is able to occur in linear space. diff --git a/appendices/glossary.adoc b/appendices/glossary.adoc index d2e8083ea..178b5dc1c 100644 --- a/appendices/glossary.adoc +++ b/appendices/glossary.adoc @@ -2029,7 +2029,7 @@ Info:: Information LOD:: - Level of Detail + Level{nbsp} of Detail Log:: Logarithm diff --git a/appendices/spirvenv.adoc b/appendices/spirvenv.adoc index 09ee48628..eb53768cf 100644 --- a/appendices/spirvenv.adoc +++ b/appendices/spirvenv.adoc @@ -70,9 +70,9 @@ ifdef::VKSC_VERSION_1_0[] The application must: not select a pipeline cache entry, which was created by passing a SPIR-V module using any of these capabilities to the <>, in a -ptext:vkCreate*Pipelines command unless one of the following conditions is +ftext:vkCreate*Pipelines command unless one of the following conditions is met for the slink:VkDevice specified in the pname:device parameter of the -ptext:vkCreate*Pipelines command: +ftext:vkCreate*Pipelines command: endif::VKSC_VERSION_1_0[] * The corresponding field in the table is blank. @@ -100,7 +100,7 @@ ifdef::VKSC_VERSION_1_0[] The application must: not select a pipeline cache entry, which was created by passing a SPIR-V module containing any of the following to the <>, -containing any of the following in a ptext:vkCreate*Pipelines command: +containing any of the following in a ftext:vkCreate*Pipelines command: endif::VKSC_VERSION_1_0[] * any code:OpCapability not listed above, @@ -124,9 +124,9 @@ ifdef::VKSC_VERSION_1_0[] The application must: not select a pipeline cache entry, which was created by passing a SPIR-V module using any of the following SPIR-V extensions to the <>, in a -ptext:vkCreate*Pipelines command unless one of the following conditions is +ftext:vkCreate*Pipelines command unless one of the following conditions is met for the slink:VkDevice specified in the pname:device parameter of the -ptext:vkCreate*Pipelines command: +ftext:vkCreate*Pipelines command: endif::VKSC_VERSION_1_0[] * Any corresponding Vulkan extension is enabled. @@ -1129,33 +1129,37 @@ ifdef::VK_NV_cooperative_matrix[] For code:OpTypeCooperativeMatrixNV, the component type, scope, number of rows, and number of columns must: match one of the matrices in any of the supported slink:VkCooperativeMatrixPropertiesNV - * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06317]] - For code:OpCooperativeMatrixMulAddNV, the type of code:A must: have - slink:VkCooperativeMatrixPropertiesNV::pname:MSize rows and - slink:VkCooperativeMatrixPropertiesNV::pname:KSize columns and have a - component type that matches - slink:VkCooperativeMatrixPropertiesNV::pname:AType - * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06318]] - For code:OpCooperativeMatrixMulAddNV, the type of code:B must: have - slink:VkCooperativeMatrixPropertiesNV::pname:KSize rows and - slink:VkCooperativeMatrixPropertiesNV::pname:NSize columns and have a - component type that matches - slink:VkCooperativeMatrixPropertiesNV::pname:BType - * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06319]] - For code:OpCooperativeMatrixMulAddNV, the type of code:C must: have - slink:VkCooperativeMatrixPropertiesNV::pname:MSize rows and - slink:VkCooperativeMatrixPropertiesNV::pname:NSize columns and have a - component type that matches - slink:VkCooperativeMatrixPropertiesNV::pname:CType - * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06320]] - For code:OpCooperativeMatrixMulAddNV, the type of code:Result must: have - slink:VkCooperativeMatrixPropertiesNV::pname:MSize rows and - slink:VkCooperativeMatrixPropertiesNV::pname:NSize columns and have a - component type that matches - slink:VkCooperativeMatrixPropertiesNV::pname:DType - * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06321]] - For code:OpCooperativeMatrixMulAddNV, the type of code:A, code:B, - code:C, and code:Result must: all have a scope of pname:scope + * [[VUID-{refpage}-OpTypeCooperativeMatrixMulAddNV-10059]] + For code:OpTypeCooperativeMatrixMulAddNV, the operands must: match a + supported slink:VkCooperativeMatrixPropertiesNV, such that: + ** The type of code:A must: have code:Rows match + slink:VkCooperativeMatrixPropertiesNV::pname:MSize, code:Columns match + slink:VkCooperativeMatrixPropertiesNV::pname:KSize, and + code:ComponentType match + slink:VkCooperativeMatrixPropertiesNV::pname:AType. + ** The type of code:B must: have code:Rows match + slink:VkCooperativeMatrixPropertiesNV::pname:KSize, code:Columns match + slink:VkCooperativeMatrixPropertiesNV::pname:NSize, and + code:ComponentType match + slink:VkCooperativeMatrixPropertiesNV::pname:BType. + ** The type of code:C must: have code:Rows match + slink:VkCooperativeMatrixPropertiesNV::pname:MSize, code:Columns match + slink:VkCooperativeMatrixPropertiesNV::pname:NSize, and + code:ComponentType match + slink:VkCooperativeMatrixPropertiesNV::pname:CType. + ** The type of code:Result must: have code:Rows match + slink:VkCooperativeMatrixPropertiesNV::pname:MSize, code:Columns match + slink:VkCooperativeMatrixPropertiesNV::pname:NSize, and + code:ComponentType match + slink:VkCooperativeMatrixPropertiesNV::pname:DType. + ** The scope of all cooperative matrix operands must: be + elink:VkScopeNV::ename:VK_SCOPE_SUBGROUP_NV. + ** If code:ComponentType of code:A, code:B, code:C, or code:Result is a + signed integral type, the code:Signedness operand of the code:OpTypeInt + must be 1. + ** If code:ComponentType of code:A, code:B, code:C, or code:Result is an + unsigned integral type, the code:Signedness operand of the + code:OpTypeInt must be 0. * [[VUID-{refpage}-OpTypeCooperativeMatrixNV-06322]] code:OpTypeCooperativeMatrixNV and code:OpCooperativeMatrix* instructions must: not be used in shader stages not included in @@ -1165,56 +1169,47 @@ ifdef::VK_KHR_cooperative_matrix[] * [[VUID-{refpage}-OpTypeCooperativeMatrixKHR-08974]] For code:OpTypeCooperativeMatrixKHR, the component type, scope, number of rows, and number of columns must: match one of the matrices in any of - the supported slink:VkCooperativeMatrixPropertiesKHR - * [[VUID-{refpage}-MSize-08975]] - For code:OpCooperativeMatrixMulAddKHR, the type of code:A must: have - slink:VkCooperativeMatrixPropertiesKHR::pname:MSize rows and - slink:VkCooperativeMatrixPropertiesKHR::pname:KSize columns and have a - component type that matches - slink:VkCooperativeMatrixPropertiesKHR::pname:AType - * [[VUID-{refpage}-OpCooperativeMatrixMulAddKHR-08976]] - For code:OpCooperativeMatrixMulAddKHR, when the component type of code:A - is a signed integer type, the code:MatrixASignedComponents cooperative - matrix operand must: be present - * [[VUID-{refpage}-KSize-08977]] - For code:OpCooperativeMatrixMulAddKHR, the type of code:B must: have - slink:VkCooperativeMatrixPropertiesKHR::pname:KSize rows and - slink:VkCooperativeMatrixPropertiesKHR::pname:NSize columns and have a - component type that matches - slink:VkCooperativeMatrixPropertiesKHR::pname:BType - * [[VUID-{refpage}-OpCooperativeMatrixMulAddKHR-08978]] - For code:OpCooperativeMatrixMulAddKHR, when the component type of code:B - is a signed integer type, the code:MatrixBSignedComponents cooperative - matrix operand must: be present - * [[VUID-{refpage}-MSize-08979]] - For code:OpCooperativeMatrixMulAddKHR, the type of code:C must: have - slink:VkCooperativeMatrixPropertiesKHR::pname:MSize rows and - slink:VkCooperativeMatrixPropertiesKHR::pname:NSize columns and have a - component type that matches - slink:VkCooperativeMatrixPropertiesKHR::pname:CType - * [[VUID-{refpage}-OpCooperativeMatrixMulAddKHR-08980]] - For code:OpCooperativeMatrixMulAddKHR, when the component type of code:C - is a signed integer type, the code:MatrixCSignedComponents cooperative - matrix operand must: be present - * [[VUID-{refpage}-MSize-08981]] - For code:OpCooperativeMatrixMulAddKHR, the type of code:Result must: - have slink:VkCooperativeMatrixPropertiesKHR::pname:MSize rows and - slink:VkCooperativeMatrixPropertiesKHR::pname:NSize columns and have a - component type that matches - slink:VkCooperativeMatrixPropertiesKHR::pname:ResultType - * [[VUID-{refpage}-OpCooperativeMatrixMulAddKHR-08982]] - For code:OpCooperativeMatrixMulAddKHR, when the component type of - code:Result is a signed integer type, the - code:MatrixResultSignedComponents cooperative matrix operand must: be - present - * [[VUID-{refpage}-saturatingAccumulation-08983]] - For code:OpCooperativeMatrixMulAddKHR, the code:SaturatingAccumulation - cooperative matrix operand must: be present if and only if - slink:VkCooperativeMatrixPropertiesKHR::pname:saturatingAccumulation is - ename:VK_TRUE - * [[VUID-{refpage}-scope-08984]] - For code:OpCooperativeMatrixMulAddKHR, the type of code:A, code:B, - code:C, and code:Result must: all have a scope of pname:scope + the supported slink:VkCooperativeMatrixPropertiesKHR. + * [[VUID-{refpage}-OpCooperativeMatrixMulAddKHR-10060]] + For code:OpCooperativeMatrixMulAddKHR, the operands must: match a + supported slink:VkCooperativeMatrixPropertiesKHR, such that: + ** The type of code:A must: have code:Rows match + slink:VkCooperativeMatrixPropertiesKHR::pname:MSize, code:Columns match + slink:VkCooperativeMatrixPropertiesKHR::pname:KSize, code:Use be + code:MatrixAKHR, and code:ComponentType match + slink:VkCooperativeMatrixPropertiesKHR::pname:AType. + ** The type of code:B must: have code:Rows match + slink:VkCooperativeMatrixPropertiesKHR::pname:KSize, code:Columns match + slink:VkCooperativeMatrixPropertiesKHR::pname:NSize, code:Use be + code:MatrixBKHR, and code:ComponentType match + slink:VkCooperativeMatrixPropertiesKHR::pname:BType. + ** The type of code:C must: have code:Rows match + slink:VkCooperativeMatrixPropertiesKHR::pname:MSize, code:Columns match + slink:VkCooperativeMatrixPropertiesKHR::pname:NSize, code:Use be + code:MatrixAccumulatorKHR, and code:ComponentType match + slink:VkCooperativeMatrixPropertiesKHR::pname:CType. + ** The type of code:Result must: have code:Rows match + slink:VkCooperativeMatrixPropertiesKHR::pname:MSize, code:Columns match + slink:VkCooperativeMatrixPropertiesKHR::pname:NSize, code:Use be + code:MatrixAccumulatorKHR, and code:ComponentType match + slink:VkCooperativeMatrixPropertiesKHR::pname:ResultType. + ** If and only if slink:VkCooperativeMatrixPropertiesKHR::pname:AType is a + signed integer type, code:MatrixASignedComponents must: be used. + ** If and only if slink:VkCooperativeMatrixPropertiesKHR::pname:BType is a + signed integer type, code:MatrixBSignedComponents must: be used. + ** If and only if slink:VkCooperativeMatrixPropertiesKHR::pname:CType is a + signed integer type, code:MatrixCSignedComponents must: be used. + ** If and only if slink:VkCooperativeMatrixPropertiesKHR::pname:ResultType + is a signed integer type, code:MatrixResultSignedComponents must: be + used. + ** If and only if + slink:VkCooperativeMatrixPropertiesKHR::pname:saturatingAccumulation is + ename:VK_TRUE, code:SaturatingAccumulationKHR must: be used. + ** If and only if + slink:VkCooperativeMatrixPropertiesKHR::pname:saturatingAccumulation is + ename:VK_FALSE, code:SaturatingAccumulationKHR must: not be used. + ** The scope of all cooperative matrix operands must: be + elink:VkScopeKHR::ename:VK_SCOPE_SUBGROUP_KHR. * [[VUID-{refpage}-cooperativeMatrixSupportedStages-08985]] code:OpTypeCooperativeMatrixKHR and code:OpCooperativeMatrix* instructions must: not be used in shader stages not included in @@ -1450,8 +1445,8 @@ ifndef::VK_EXT_shader_atomic_float2[] pname:shaderSharedFloat32AtomicAdd>>, or <>, or <> must: be enabled for 32-bit floating - point atomic operations + pname:shaderImageFloat32AtomicAdd>> must: be enabled for 32-bit + floating-point atomic operations * [[VUID-{refpage}-None-06336]] <>, or @@ -2112,8 +2107,8 @@ endif::VK_KHR_shader_subgroup_rotate[] [[spirvenv-precision-operation]] == Precision and Operation of SPIR-V Instructions -The following rules apply to half, single, and double-precision floating -point instructions: +The following rules apply to half, single, and double-precision +floating-point instructions: * Positive and negative infinities and positive and negative zeros are generated as dictated by <>, but subject to the @@ -2140,12 +2135,12 @@ ifdef::VK_KHR_shader_float_controls2[] code:SignedZeroInfNanPreserve with a bit-width corresponding to one of the operands or to the result type. **** The operation is not one of: code:OpPhi, code:OpSelect, - code:OpReturnValue, code:OpVectorExtractDynamic, - code:OpVectorInsertDynamic, code:OpVectorShuffle, - code:OpCompositeConstruct, code:OpCompositeExtract, - code:OpCompositeInsert, code:OpCopyObject, code:OpTranspose, - code:OpFConvert, code:OpFNegate, code:OpFAdd, code:OpFSub, - code:OpFMul, code:OpStore, code:OpLoad. + code:OpReturnValue, code:OpVectorExtractDynamic, + code:OpVectorInsertDynamic, code:OpVectorShuffle, + code:OpCompositeConstruct, code:OpCompositeExtract, + code:OpCompositeInsert, code:OpCopyObject, code:OpTranspose, + code:OpFConvert, code:OpFNegate, code:OpFAdd, code:OpFSub, + code:OpFMul, code:OpStore, code:OpLoad. **** The operation is an code:OpLoad from the code:Input {StorageClass} in the fragment shader stage. endif::VK_KHR_shader_float_controls2[] @@ -2306,7 +2301,8 @@ ifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[] The rounding mode is not specified, unless the entry point is declared with the code:RoundingModeRTE or the code:RoundingModeRTZ {ExecutionMode}. These execution modes affect only correctly rounded SPIR-V instructions. -These execution modes do not affect code:OpQuantizeToF16. +These execution modes do not affect code:OpQuantizeToF16 and +code:PackHalf2x16. If the rounding mode is not specified then this rounding is implementation specific, subject to the following rules. endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[] @@ -2404,6 +2400,8 @@ endif::VK_VERSION_1_2,VK_KHR_shader_float16_int8[] 2+| Inherited from [eq]#x - y {times} trunc(x/y)#. | code:OpFMod(x,y) 2+| Inherited from [eq]#x - y {times} floor(x/y)#. +| code:OpQuantizeToF16 +2+| Correctly rounded. | conversions between types 2+| Correctly rounded. |==== @@ -2520,6 +2518,8 @@ where latexmath:[t = clamp(\frac{x - edge0}{edge1 - edge0}, 0.0, 1.0)]. 2+| Correctly rounded. | code:nclamp 2+| Correctly rounded. +| code:packHalf2x16 +2+| Correctly rounded. |==== diff --git a/chapters/VK_EXT_blend_operation_advanced/advanced_blend.adoc b/chapters/VK_EXT_blend_operation_advanced/advanced_blend.adoc index dbf5c6ce6..dac490dea 100644 --- a/chapters/VK_EXT_blend_operation_advanced/advanced_blend.adoc +++ b/chapters/VK_EXT_blend_operation_advanced/advanced_blend.adoc @@ -149,14 +149,14 @@ Blend Operations>>, blending is performed according to the following equations: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} R & = & f(R_s',R_d')*p_0(A_s,A_d) & + & Y*R_s'*p_1(A_s,A_d) & + & Z*R_d'*p_2(A_s,A_d) \\ G & = & f(G_s',G_d')*p_0(A_s,A_d) & + & Y*G_s'*p_1(A_s,A_d) & + & Z*G_d'*p_2(A_s,A_d) \\ B & = & f(B_s',B_d')*p_0(A_s,A_d) & + & Y*B_s'*p_1(A_s,A_d) & + & Z*B_d'*p_2(A_s,A_d) \\ A & = & X*p_0(A_s,A_d) & + & Y*p_1(A_s,A_d) & + & Z*p_2(A_s,A_d) \end{aligned} -+++++++++++++++++++ +++++ where the function f and terms X, Y, and Z are specified in the table. The R, G, and B components of the source color used for blending are derived @@ -168,7 +168,7 @@ The base source color [eq]#(R~s~',G~s~',B~s~')# is obtained by dividing through by the A component: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} (R_s', G_s', B_s') & = \begin{cases} @@ -176,17 +176,17 @@ through by the A component: (\frac{R_s}{A_s}, \frac{G_s}{A_s}, \frac{B_s}{A_s}) & \text{otherwise} \end{cases} \end{aligned} -+++++++++++++++++++ +++++ If pname:srcPremultiplied is ename:VK_FALSE, the fragment color components are used as the base color: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} (R_s', G_s', B_s') & = (R_s, G_s, B_s) \end{aligned} -+++++++++++++++++++ +++++ The R, G, and B components of the destination color used for blending are derived according to pname:dstPremultiplied. @@ -197,7 +197,7 @@ The base destination color [eq]#(R~d~',G~d~',B~d~')# is obtained by dividing through by the A component: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} (R_d', G_d', B_d') & = \begin{cases} @@ -205,17 +205,17 @@ through by the A component: (\frac{R_d}{A_d}, \frac{G_d}{A_d}, \frac{B_d}{A_d}) & \text{otherwise} \end{cases} \end{aligned} -+++++++++++++++++++ +++++ If pname:dstPremultiplied is ename:VK_FALSE, the destination color components are used as the base color: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} (R_d', G_d', B_d') & = (R_d, G_d, B_d) \end{aligned} -+++++++++++++++++++ +++++ When blending using advanced blend operations, we expect that the R, G, and B components of premultiplied source and destination color inputs be stored @@ -273,32 +273,32 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] | Overlap Mode | Weighting Equations | ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} p_0(A_s,A_d) & = A_sA_d \\ p_1(A_s,A_d) & = A_s(1-A_d) \\ p_2(A_s,A_d) & = A_d(1-A_s) \\ \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OVERLAP_CONJOINT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} p_0(A_s,A_d) & = min(A_s,A_d) \\ p_1(A_s,A_d) & = max(A_s-A_d,0) \\ p_2(A_s,A_d) & = max(A_d-A_s,0) \\ \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OVERLAP_DISJOINT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} p_0(A_s,A_d) & = max(A_s+A_d-1,0) \\ p_1(A_s,A_d) & = min(A_s,1-A_d) \\ p_2(A_s,A_d) & = min(A_d,1-A_s) \\ \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ |==== -- @@ -309,135 +309,135 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] | Mode | Blend Coefficients | ename:VK_BLEND_OP_ZERO_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (0,0,0) \\ f(C_s,C_d) & = 0 \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_SRC_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,0) \\ f(C_s,C_d) & = C_s \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_DST_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,0,1) \\ f(C_s,C_d) & = C_d \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_SRC_OVER_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = C_s \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_DST_OVER_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = C_d \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_SRC_IN_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,0,0) \\ f(C_s,C_d) & = C_s \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_DST_IN_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,0,0) \\ f(C_s,C_d) & = C_d \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_SRC_OUT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (0,1,0) \\ f(C_s,C_d) & = 0 \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_DST_OUT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (0,0,1) \\ f(C_s,C_d) & = 0 \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_SRC_ATOP_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,0,1) \\ f(C_s,C_d) & = C_s \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_DST_ATOP_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,0) \\ f(C_s,C_d) & = C_d \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_XOR_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (0,1,1) \\ f(C_s,C_d) & = 0 \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_MULTIPLY_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = C_sC_d \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_SCREEN_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = C_s+C_d-C_sC_d \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_OVERLAY_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -446,29 +446,29 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] 1-2 (1-C_s)(1-C_d) & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_DARKEN_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = min(C_s,C_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_LIGHTEN_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = max(C_s,C_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_COLORDODGE_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -478,11 +478,11 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] 1 & C_d \gt 0 \text{ and } C_s \geq 1 \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_COLORBURN_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -492,11 +492,11 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] 0 & C_d \lt 1 \text{ and } C_s \leq 0 \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_HARDLIGHT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -505,11 +505,11 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] 1-2 (1-C_s)(1-C_d) & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_SOFTLIGHT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -519,47 +519,47 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] C_d+(2 C_s-1)(\sqrt{C_d}-C_d) & C_s \gt 0.5 \text{ and } C_d \gt 0.25 \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_DIFFERENCE_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = \lvert C_d-C_s \rvert \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_EXCLUSION_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = C_s+C_d-2C_sC_d \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_INVERT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,0,1) \\ f(C_s,C_d) & = 1-C_d \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_INVERT_RGB_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,0,1) \\ f(C_s,C_d) & = C_s(1-C_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_LINEARDODGE_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -568,11 +568,11 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] 1 & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_LINEARBURN_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -581,11 +581,11 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] 0 & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_VIVIDLIGHT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -596,11 +596,11 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] 1 & C_s \geq 1 \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_LINEARLIGHT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -610,11 +610,11 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] 0 & 2C_s+C_d \leq 1 \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_PINLIGHT_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -625,11 +625,11 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] C_d & 2C_s-1 \leq C_d \text{ and } C_s \geq 0.5C_d \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_HARDMIX_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = @@ -638,7 +638,7 @@ include::{generated}/api/enums/VkBlendOverlapEXT.adoc[] 1 & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ |==== @@ -723,39 +723,39 @@ following pseudocode: | Mode | Result | ename:VK_BLEND_OP_HSL_HUE_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = SetLumSat(C_s,C_d,C_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_HSL_SATURATION_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = SetLumSat(C_d,C_s,C_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_HSL_COLOR_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = SetLum(C_s,C_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_HSL_LUMINOSITY_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (X,Y,Z) & = (1,1,1) \\ f(C_s,C_d) & = SetLum(C_d,C_s) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ |==== @@ -769,7 +769,7 @@ destination color components are both considered to have been premultiplied by the corresponding A component. [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} (R_s', G_s', B_s') & = \begin{cases} @@ -782,7 +782,7 @@ by the corresponding A component. (R_dA_d, G_dA_d, B_dA_d) & \text{if dstPremultiplied is VK\_FALSE} \end{cases} \end{aligned} -+++++++++++++++++++ +++++ [[framebuffer-blend-advanced-additional-rgb]] .Additional RGB Blend Operations @@ -791,113 +791,113 @@ by the corresponding A component. | Mode | Result | ename:VK_BLEND_OP_PLUS_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) = ( & R_s'+R_d', \\ & G_s'+G_d', \\ & B_s'+B_d', \\ & A_s+A_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_PLUS_CLAMPED_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) = ( & min(1,R_s'+R_d'), \\ & min(1,G_s'+G_d'), \\ & min(1,B_s'+B_d'), \\ & min(1,A_s+A_d)) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) = ( & min(min(1,A_s+A_d),R_s'+R_d'), \\ & min(min(1,A_s+A_d),G_s'+G_d'), \\ & min(min(1,A_s+A_d),B_s'+B_d'), \\ & min(1,A_s+A_d)) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_PLUS_DARKER_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) = ( & max(0,min(1,A_s+A_d)-((A_s-R_s')+(A_d-R_d'))), \\ & max(0,min(1,A_s+A_d)-((A_s-G_s')+(A_d-G_d'))), \\ & max(0,min(1,A_s+A_d)-((A_s-B_s')+(A_d-B_d'))), \\ & min(1,A_s+A_d)) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_MINUS_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) = ( & R_d'-R_s', \\ & G_d'-G_s', \\ & B_d'-B_s', \\ & A_d-A_s) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_MINUS_CLAMPED_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) = ( & max(0,R_d'-R_s'), \\ & max(0,G_d'-G_s'), \\ & max(0,B_d'-B_s'), \\ & max(0,A_d-A_s)) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_CONTRAST_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) = ( & \frac{A_d}{2} + 2(R_d'-\frac{A_d}{2})(R_s'-\frac{A_s}{2}), \\ & \frac{A_d}{2} + 2(G_d'-\frac{A_d}{2})(G_s'-\frac{A_s}{2}), \\ & \frac{A_d}{2} + 2(B_d'-\frac{A_d}{2})(B_s'-\frac{A_s}{2}), \\ & A_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_INVERT_OVG_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) = ( & A_s(1-R_d') + (1-A_s)R_d', \\ & A_s(1-G_d') + (1-A_s)G_d', \\ & A_s(1-B_d') + (1-A_s)B_d', \\ & A_s+A_d-A_sA_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_RED_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) & = (R_s', G_d', B_d', A_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_GREEN_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) & = (R_d', G_s', B_d', A_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ | ename:VK_BLEND_OP_BLUE_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} (R,G,B,A) & = (R_d', G_d', B_s', A_d) \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ |==== diff --git a/chapters/VK_EXT_hdr_metadata.adoc b/chapters/VK_EXT_hdr_metadata.adoc index 191cbdcaf..97275781a 100644 --- a/chapters/VK_EXT_hdr_metadata.adoc +++ b/chapters/VK_EXT_hdr_metadata.adoc @@ -7,9 +7,8 @@ == HDR Metadata This section describes how to improve color reproduction of content to -better reproduce colors as seen on the reference monitor. -Definitions below are from the associated SMPTE 2086, CTA 861.3 and CIE -15:2004 specifications. +better reproduce colors as seen on the display used to originally optimize +the content. [open,refpage='vkSetHdrMetadataEXT',desc='Set HDR metadata',type='protos'] -- @@ -26,7 +25,7 @@ include::{generated}/api/protos/vkSetHdrMetadataEXT.adoc[] slink:VkHdrMetadataEXT structures. The metadata will be applied to the specified slink:VkSwapchainKHR objects -at the next fname:vkQueuePresentKHR call using that slink:VkSwapchainKHR +at the next flink:vkQueuePresentKHR call using that slink:VkSwapchainKHR object. The metadata will persist until a subsequent fname:vkSetHdrMetadataEXT changes it. @@ -44,28 +43,34 @@ include::{generated}/api/structs/VkHdrMetadataEXT.adoc[] * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:displayPrimaryRed is a slink:VkXYColorEXT structure specifying the - reference monitor's red primary in chromaticity coordinates + red primary of the display used to optimize the content * pname:displayPrimaryGreen is a slink:VkXYColorEXT structure specifying - the reference monitor's green primary in chromaticity coordinates + the green primary of the display used to optimize the content * pname:displayPrimaryBlue is a slink:VkXYColorEXT structure specifying - the reference monitor's blue primary in chromaticity coordinates + the blue primary of the display used to optimize the content * pname:whitePoint is a slink:VkXYColorEXT structure specifying the - reference monitor's white-point in chromaticity coordinates - * pname:maxLuminance is the maximum luminance of the reference monitor in - nits - * pname:minLuminance is the minimum luminance of the reference monitor in - nits - * pname:maxContentLightLevel is content's maximum luminance in nits - * pname:maxFrameAverageLightLevel is the maximum frame average light level - in nits - -include::{generated}/validity/structs/VkHdrMetadataEXT.adoc[] + white-point of the display used to optimize the content + * pname:maxLuminance is the maximum luminance of the display used to + optimize the content in nits + * pname:minLuminance is the minimum luminance of the display used to + optimize the content in nits + * pname:maxContentLightLevel is the value in nits of the desired luminance + for the brightest pixels in the displayed image. + * pname:maxFrameAverageLightLevel is the value in nits of the average + luminance of the frame which has the brightest average luminance + anywhere in the content. + +If any of the above values are unknown, they can: be set to 0. [NOTE] .Note ==== +The meta-data provided here is intended to be used as defined in the SMPTE +2086, CTA 861.3 and CIE 15:2004 specifications. The validity and use of this data is outside the scope of Vulkan. ==== + +include::{generated}/validity/structs/VkHdrMetadataEXT.adoc[] -- [open,refpage='VkXYColorEXT',desc='Specify X,Y chromaticity coordinates',type='structs'] @@ -79,6 +84,6 @@ include::{generated}/api/structs/VkXYColorEXT.adoc[] Chromaticity coordinates are as specified in CIE 15:2004 "`Calculation of chromaticity coordinates`" (Section 7.3) and are limited to between 0 and 1 -for real colors for the reference monitor. +for real colors. -- diff --git a/chapters/VK_KHR_surface/wsi.adoc b/chapters/VK_KHR_surface/wsi.adoc index 6decffe8f..821a38902 100644 --- a/chapters/VK_KHR_surface/wsi.adoc +++ b/chapters/VK_KHR_surface/wsi.adoc @@ -1279,52 +1279,60 @@ While the pname:format of a presentable image refers to the encoding of each pixel, the pname:colorSpace determines how the presentation engine interprets the pixel values. A color space in this document refers to a specific color space (defined by -the chromaticities of its primaries and a white point in CIE Lab), and a -transfer function that is applied before storing or transmitting color data -in the given color space. +the chromaticities of its primaries and a white point in CIE Lab), and +transfer functions indicating the mapping between the image data and the +colorimetry with respect to the given color space. [open,refpage='VkColorSpaceKHR',desc='Supported color space of the presentation engine',type='enums'] -- Possible values of slink:VkSurfaceFormatKHR::pname:colorSpace, specifying -supported color spaces of a presentation engine, are: +the color spaces that a presentation engine can accept, are: include::{generated}/api/enums/VkColorSpaceKHR.adoc[] - * ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR specifies support for the sRGB - color space. + * ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR specifies support for the images + in sRGB color space, encoded according to the sRGB specification. ifdef::VK_EXT_swapchain_colorspace[] * ename:VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT specifies support for the - Display-P3 color space to be displayed using an sRGB-like EOTF (defined - below). + images in Display-P3 color space, encoded using a Display-P3 transfer + function. * ename:VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT specifies support for the - extended sRGB color space to be displayed using a linear EOTF. + images in extended sRGB color space, encoded using a linear transfer + function. * ename:VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT specifies support for - the extended sRGB color space to be displayed using an sRGB EOTF. + the images in extended sRGB color space, encoded according to the scRGB + specification. * ename:VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT specifies support for the - Display-P3 color space to be displayed using a linear EOTF. + images in Display-P3 color space, encoded using a linear transfer + function. * ename:VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT specifies support for the - DCI-P3 color space to be displayed using the DCI-P3 EOTF. + images in DCI-P3 color space, encoded according to the DCI-P3 + specification. Note that values in such an image are interpreted as XYZ encoded color data by the presentation engine. - * ename:VK_COLOR_SPACE_BT709_LINEAR_EXT specifies support for the BT709 - color space to be displayed using a linear EOTF. - * ename:VK_COLOR_SPACE_BT709_NONLINEAR_EXT specifies support for the BT709 - color space to be displayed using the SMPTE 170M EOTF. - * ename:VK_COLOR_SPACE_BT2020_LINEAR_EXT specifies support for the BT2020 - color space to be displayed using a linear EOTF. - * ename:VK_COLOR_SPACE_HDR10_ST2084_EXT specifies support for the HDR10 - (BT2020 color) space to be displayed using the SMPTE ST2084 Perceptual - Quantizer (PQ) EOTF. - * ename:VK_COLOR_SPACE_DOLBYVISION_EXT specifies support for the Dolby - Vision (BT2020 color space), proprietary encoding, to be displayed using - the SMPTE ST2084 EOTF. - * ename:VK_COLOR_SPACE_HDR10_HLG_EXT specifies support for the HDR10 - (BT2020 color space) to be displayed using the Hybrid Log Gamma (HLG) - EOTF. - * ename:VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT specifies support for the - AdobeRGB color space to be displayed using a linear EOTF. + * ename:VK_COLOR_SPACE_BT709_LINEAR_EXT specifies support for the images + in BT709 color space, encoded using a linear transfer function. + * ename:VK_COLOR_SPACE_BT709_NONLINEAR_EXT specifies support for the + images in BT709 color space, encoded according to the BT709 + specification. + * ename:VK_COLOR_SPACE_BT2020_LINEAR_EXT specifies support for the images + in BT2020 color space, encoded using a linear transfer function. + * ename:VK_COLOR_SPACE_HDR10_ST2084_EXT specifies support for the images + in HDR10 (BT2020) color space, encoded according to SMPTE ST2084 + Perceptual Quantizer (PQ) specification. + * ename:VK_COLOR_SPACE_DOLBYVISION_EXT specifies support for the images in + Dolby Vision (BT2020) color space, encoded according to SMPTE ST2084 + Perceptual Quantizer (PQ) specification. + The presentation engine is expected to use Dolby's proprietary + techniques to display the image. + * ename:VK_COLOR_SPACE_HDR10_HLG_EXT specifies support for the images in + HDR10 (BT2020) color space, encoded according to the Hybrid Log Gamma + (HLG) specification. + * ename:VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT specifies support for images in + Adobe RGB color space, encoded using a linear transfer function. * ename:VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT specifies support for the - AdobeRGB color space to be displayed using the Gamma 2.2 EOTF. + images in Adobe RGB color space, encoded according to the Adobe RGB + specification (approximately Gamma 2.2). * ename:VK_COLOR_SPACE_PASS_THROUGH_EXT specifies that color components are used "`as is`". This is intended to allow applications to supply data for color spaces @@ -1378,14 +1386,19 @@ For a traditional "`Linear`" or non-gamma transfer function color space use ename:VK_COLOR_SPACE_PASS_THROUGH_EXT. ==== -The color components of non-linear color space swapchain images must: have -had the appropriate transfer function applied. -The color space selected for the swapchain image will not affect the -processing of data written into the image by the implementation. -Vulkan requires that all implementations support the sRGB transfer function -by use of an SRGB pixel format. -Other transfer functions, such as SMPTE 170M or SMPTE2084, can: be performed -by the application shader. +The presentation engine interprets the pixel values of the R, G, and B +components as having been encoded using an appropriate transfer function. +Applications should: ensure that the appropriate transfer function has been +applied. +<> +requires that all implementations implicitly apply the sRGB EOTF^-1^ on R, +G, and B components when shaders write to an sRGB pixel format image, which +is useful for sRGB color spaces. +For sRGB color spaces with other pixel formats, or other non-linear color +spaces, applications can: apply the transfer function explicitly in a +shader. +The A channel is always interpreted as linearly encoded. + This extension defines enums for elink:VkColorSpaceKHR that correspond to the following color spaces: @@ -1396,13 +1409,13 @@ the following color spaces: | Name | Red Primary | Green Primary | Blue Primary | White-point | Transfer function | DCI-P3 | 1.000, 0.000 | 0.000, 1.000 | 0.000, 0.000 | 0.3333, 0.3333 | DCI P3 | Display-P3 | 0.680, 0.320 | 0.265, 0.690 | 0.150, 0.060 | 0.3127, 0.3290 (D65) | Display-P3 -| BT709 | 0.640, 0.330 | 0.300, 0.600 | 0.150, 0.060 | 0.3127, 0.3290 (D65) | ITU (SMPTE 170M) +| BT709 | 0.640, 0.330 | 0.300, 0.600 | 0.150, 0.060 | 0.3127, 0.3290 (D65) | BT709 | sRGB | 0.640, 0.330 | 0.300, 0.600 | 0.150, 0.060 | 0.3127, 0.3290 (D65) | sRGB -| extended sRGB | 0.640, 0.330 | 0.300, 0.600 | 0.150, 0.060 | 0.3127, 0.3290 (D65) | extended sRGB +| extended sRGB | 0.640, 0.330 | 0.300, 0.600 | 0.150, 0.060 | 0.3127, 0.3290 (D65) | scRGB | HDR10_ST2084 | 0.708, 0.292 | 0.170, 0.797 | 0.131, 0.046 | 0.3127, 0.3290 (D65) | ST2084 PQ | DOLBYVISION | 0.708, 0.292 | 0.170, 0.797 | 0.131, 0.046 | 0.3127, 0.3290 (D65) | ST2084 PQ | HDR10_HLG | 0.708, 0.292 | 0.170, 0.797 | 0.131, 0.046 | 0.3127, 0.3290 (D65) | HLG -| AdobeRGB | 0.640, 0.330 | 0.210, 0.710 | 0.150, 0.060 | 0.3127, 0.3290 (D65) | AdobeRGB +| Adobe RGB | 0.640, 0.330 | 0.210, 0.710 | 0.150, 0.060 | 0.3127, 0.3290 (D65) | Adobe RGB |==== The transfer functions are described in the "`Transfer Functions`" chapter @@ -1411,7 +1424,7 @@ of the <>. Except Display-P3 OETF, which is: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} E & = \begin{cases} @@ -1419,7 +1432,7 @@ E & = 12.92 \times L & \text{for}\ 0 \leq L < 0.0030186 \end{cases} \end{aligned} -+++++++++++++++++++ +++++ where [eq]#L# is the linear value of a color component and [eq]#E# is the encoded value (as stored in the image in memory). diff --git a/chapters/VK_KHR_win32_surface/platformCreateSurface_win32.adoc b/chapters/VK_KHR_win32_surface/platformCreateSurface_win32.adoc index 278d03982..2cb2cc1d5 100644 --- a/chapters/VK_KHR_win32_surface/platformCreateSurface_win32.adoc +++ b/chapters/VK_KHR_win32_surface/platformCreateSurface_win32.adoc @@ -5,7 +5,7 @@ [[platformCreateSurface_win32]] === Win32 Platform -[open,refpage='vkCreateWin32SurfaceKHR',desc='Create a VkSurfaceKHR object for an Win32 native window',type='protos'] +[open,refpage='vkCreateWin32SurfaceKHR',desc='Create a VkSurfaceKHR object for a Win32 native window',type='protos'] -- :refpage: vkCreateWin32SurfaceKHR @@ -28,8 +28,8 @@ include::{generated}/validity/protos/vkCreateWin32SurfaceKHR.adoc[] Some Vulkan functions may: call the `SendMessage` system API when interacting with a sname:VkSurfaceKHR through a sname:VkSwapchainKHR. In a multithreaded environment, calling `SendMessage` from a thread that is -not the thread associated with pname:pCreateInfo::pname:hwnd will block -until the application has processed the window message. +not the thread associated with pname:pCreateInfo->hwnd will block until the +application has processed the window message. Thus, applications should: either call these Vulkan functions on the message pump thread, or make sure their message pump is actively running. Failing to do so may: result in deadlocks. diff --git a/chapters/VK_NV_device_generated_commands/indirectcommands.adoc b/chapters/VK_NV_device_generated_commands/indirectcommands.adoc index a3a6dadcc..016198649 100644 --- a/chapters/VK_NV_device_generated_commands/indirectcommands.adoc +++ b/chapters/VK_NV_device_generated_commands/indirectcommands.adoc @@ -344,7 +344,7 @@ include::{generated}/api/structs/VkBindIndexBufferIndirectCommandNV.adoc[] * pname:indexType is a elink:VkIndexType value specifying how indices are treated. Instead of the Vulkan enum values, a custom `uint32_t` value can: be - mapped to an elink:VkIndexType by specifying the + mapped to elink:VkIndexType by specifying the sname:VkIndirectCommandsLayoutTokenNV::pname:pIndexTypes and sname:VkIndirectCommandsLayoutTokenNV::pname:pIndexTypeValues arrays. diff --git a/chapters/VK_NV_mesh_shader/mesh.adoc b/chapters/VK_NV_mesh_shader/mesh.adoc index a0c7c2a2f..eebf7727c 100644 --- a/chapters/VK_NV_mesh_shader/mesh.adoc +++ b/chapters/VK_NV_mesh_shader/mesh.adoc @@ -190,10 +190,10 @@ maximum number of primitives specified by the code:OutputPrimitivesEXT pname:meshOutputPerPrimitiveGranularity: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ (n_v + (n_{vpv} \times v)) \times 4 \times \mathrm{align}(m_v, g_v) + (n_p + (n_{ppv} \times v)) \times 4 \times \mathrm{align}(m_p, g_p) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ endif::VK_EXT_mesh_shader[] diff --git a/chapters/VK_NV_optical_flow/optical_flow.adoc b/chapters/VK_NV_optical_flow/optical_flow.adoc index 1a4c98765..d5ef455c9 100644 --- a/chapters/VK_NV_optical_flow/optical_flow.adoc +++ b/chapters/VK_NV_optical_flow/optical_flow.adoc @@ -8,7 +8,7 @@ == Optical Flow Queues -`apiext:VK_NV_optical_flow` adds a optical flow queue type bit +`apiext:VK_NV_optical_flow` adds an optical flow queue type bit ename:VK_QUEUE_OPTICAL_FLOW_BIT_NV to elink:VkQueueFlagBits. Optical flow operations are supported by queues with an advertised queue capability of ename:VK_QUEUE_OPTICAL_FLOW_BIT_NV. @@ -56,7 +56,7 @@ pname:pImageFormatProperties, and ename:VK_INCOMPLETE will be returned instead of ename:VK_SUCCESS, to indicate that not all the available values were returned. -Before creating an image to be used as a optical flow frame, obtain the +Before creating an image to be used as an optical flow frame, obtain the supported image creation parameters by querying with flink:vkGetPhysicalDeviceFormatProperties2 and flink:vkGetPhysicalDeviceImageFormatProperties2 using one of the reported @@ -417,7 +417,7 @@ include::{generated}/api/flags/VkOpticalFlowSessionCreateFlagsNV.adoc[] [open,refpage='vkDestroyOpticalFlowSessionNV',desc='Destroy optical flow session object',type='protos'] -- -To destroy a optical flow session object, call: +To destroy an optical flow session object, call: include::{generated}/api/protos/vkDestroyOpticalFlowSessionNV.adoc[] @@ -512,7 +512,7 @@ include::{generated}/api/protos/vkCmdOpticalFlowExecuteNV.adoc[] include::{generated}/validity/protos/vkCmdOpticalFlowExecuteNV.adoc[] -- -[open,refpage='VkOpticalFlowExecuteInfoNV',desc='Structure specifying parameters of a optical flow vector calculation',type='structs'] +[open,refpage='VkOpticalFlowExecuteInfoNV',desc='Structure specifying parameters of an optical flow vector calculation',type='structs'] -- The slink:VkOpticalFlowExecuteInfoNV structure is defined as: @@ -539,7 +539,7 @@ include::{generated}/api/structs/VkOpticalFlowExecuteInfoNV.adoc[] include::{generated}/validity/structs/VkOpticalFlowExecuteInfoNV.adoc[] -- -[open,refpage='VkOpticalFlowExecuteFlagBitsNV',desc='Bits specifying flags for a optical flow vector calculation',type='enums'] +[open,refpage='VkOpticalFlowExecuteFlagBitsNV',desc='Bits specifying flags for an optical flow vector calculation',type='enums'] -- Bits which can: be set in slink:VkOpticalFlowExecuteInfoNV::pname:flags, controlling optical flow execution, are: diff --git a/chapters/accelstructures.adoc b/chapters/accelstructures.adoc index a95f3399f..34e6ae1d3 100644 --- a/chapters/accelstructures.adoc +++ b/chapters/accelstructures.adoc @@ -1459,7 +1459,7 @@ usually used to define the pivot point of the following rotation. This matrix is constructed from the parameters above by: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ S = \left( \begin{matrix} @@ -1468,7 +1468,7 @@ S = 0 & 0 & sz & pvz \end{matrix} \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ The rotation quaternion is defined as: @@ -1488,7 +1488,7 @@ Finally, the transform has a translation T constructed from the parameters above by: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ T = \left( \begin{matrix} @@ -1497,7 +1497,7 @@ T = 0 & 0 & 1 & tz \end{matrix} \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ The effective derived transform is then given by @@ -2583,7 +2583,7 @@ include::{generated}/api/protos/vkWriteAccelerationStructuresPropertiesKHR.adoc[ be queried. * pname:dataSize is the size in bytes of the buffer pointed to by pname:pData. - * pname:pData is a pointer to a application-allocated buffer where the + * pname:pData is a pointer to an application-allocated buffer where the results will be written. * pname:stride is the stride in bytes between results for individual queries within pname:pData. diff --git a/chapters/capabilities.adoc b/chapters/capabilities.adoc index 4ec766e4c..d7a2eaa98 100644 --- a/chapters/capabilities.adoc +++ b/chapters/capabilities.adoc @@ -1256,8 +1256,8 @@ endif::VK_KHR_external_memory_capabilities[] Only usage flags representable in elink:VkBufferUsageFlagBits are returned in this structure's pname:usage. ifdef::VK_KHR_maintenance5[] -If a slink:VkBufferUsageFlags2CreateInfoKHR structure is present in the -pname:pNext chain, all usage flags of the buffer are returned in +If the pname:pNext chain includes a slink:VkBufferUsageFlags2CreateInfoKHR +structure, all usage flags of the buffer are returned in slink:VkBufferUsageFlags2CreateInfoKHR::pname:usage. endif::VK_KHR_maintenance5[] diff --git a/chapters/cmdbuffers.adoc b/chapters/cmdbuffers.adoc index 4b622d31d..e408ffe18 100644 --- a/chapters/cmdbuffers.adoc +++ b/chapters/cmdbuffers.adoc @@ -641,7 +641,7 @@ include::{generated}/api/protos/vkAllocateCommandBuffers.adoc[] Each allocated command buffer begins in the initial state. ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] -jfname:vkAllocateCommandBuffers can: be used to allocate multiple command +fname:vkAllocateCommandBuffers can: be used to allocate multiple command buffers. If the allocation of any of those command buffers fails, the implementation must: free all successfully allocated command buffer objects from this diff --git a/chapters/commonvalidity/copy_bufferimage_to_imagebuffer_common.adoc b/chapters/commonvalidity/copy_bufferimage_to_imagebuffer_common.adoc index b5899917d..70d429b56 100644 --- a/chapters/commonvalidity/copy_bufferimage_to_imagebuffer_common.adoc +++ b/chapters/commonvalidity/copy_bufferimage_to_imagebuffer_common.adoc @@ -28,29 +28,123 @@ pname:{imageoffset}.z must: be `0` and pname:{imageextent}.depth must: be `1` * [[VUID-{refpage}-{imageparam}-07274]] - For each element of pname:pRegions, pname:{imageoffset}.x must: be a - multiple of the <> of the elink:VkFormat of pname:{imageparam} + For each element of pname:pRegions, +ifdef::VK_QCOM_rotated_copy_commands[] + if slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR or + ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR, +endif::VK_QCOM_rotated_copy_commands[] + pname:{imageoffset}.x must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} +ifdef::VK_QCOM_rotated_copy_commands[] + * [[VUID-{refpage}-{imageoffset}-10051]] + For each element of pname:pRegions, if + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR or + ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR, and pname:{imageoffset}.x + does not equal the width of the subresource specified by + pname:{imagesubresource}, pname:{imageoffset}.x must: be a multiple of + the <> of the + elink:VkFormat of pname:{imageparam} +endif::VK_QCOM_rotated_copy_commands[] * [[VUID-{refpage}-{imageparam}-07275]] - For each element of pname:pRegions, pname:{imageoffset}.y must: be a - multiple of the <> of the elink:VkFormat of pname:{imageparam} + For each element of pname:pRegions, +ifdef::VK_QCOM_rotated_copy_commands[] + if slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR or + ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR, +endif::VK_QCOM_rotated_copy_commands[] + pname:{imageoffset}.y must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} +ifdef::VK_QCOM_rotated_copy_commands[] + * [[VUID-{refpage}-{imageoffset}-10052]] + For each element of pname:pRegions, if + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR or + ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, and pname:{imageoffset}.y + does not equal the height of the subresource specified by + pname:{imagesubresource}, pname:{imageoffset}.y must: be a multiple of + the <> of the + elink:VkFormat of pname:{imageparam} +endif::VK_QCOM_rotated_copy_commands[] * [[VUID-{refpage}-{imageparam}-07276]] For each element of pname:pRegions, pname:{imageoffset}.z must: be a multiple of the <> of the elink:VkFormat of pname:{imageparam} * [[VUID-{refpage}-{imageparam}-00207]] - For each element of pname:pRegions, if the sum of pname:{imageoffset}.x - and pname:extent.width does not equal the width of the subresource - specified by pname:srcSubresource, pname:extent.width must: be a - multiple of the <> of the elink:VkFormat of pname:{imageparam} + For each element of pname:pRegions, if +ifdef::VK_QCOM_rotated_copy_commands[] + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, +endif::VK_QCOM_rotated_copy_commands[] + the sum of pname:{imageoffset}.x and pname:extent.width does not equal + the width of the subresource specified by pname:{imagesubresource}, + pname:extent.width must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} +ifdef::VK_QCOM_rotated_copy_commands[] + * [[VUID-{refpage}-{imageoffset}-10053]] + For each element of pname:pRegions, if + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR, the difference of + pname:{imageoffset}.x and pname:extent.height must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} + * [[VUID-{refpage}-{imageoffset}-10054]] + For each element of pname:pRegions, if + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, the difference of + pname:{imageoffset}.x and pname:extent.width must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} + * [[VUID-{refpage}-{imageoffset}-10055]] + For each element of pname:pRegions, if + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR, the sum of + pname:{imageoffset}.x and pname:extent.height does not equal the width + of the subresource specified by pname:{imagesubresource}, + pname:extent.height must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} +endif::VK_QCOM_rotated_copy_commands[] * [[VUID-{refpage}-{imageparam}-00208]] - For each element of pname:pRegions, if the sum of pname:{imageoffset}.y - and pname:extent.height does not equal the height of the subresource - specified by pname:srcSubresource, pname:extent.height must: be a - multiple of the <> of the elink:VkFormat of pname:{imageparam} + For each element of pname:pRegions, if +ifdef::VK_QCOM_rotated_copy_commands[] + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, and +endif::VK_QCOM_rotated_copy_commands[] + the sum of pname:{imageoffset}.y and pname:extent.height does not equal + the height of the subresource specified by pname:{imagesubresource}, + pname:extent.height must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} +ifdef::VK_QCOM_rotated_copy_commands[] + * [[VUID-{refpage}-{imageoffset}-10056]] + For each element of pname:pRegions, if + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR, the sum of + pname:{imageoffset}.y and pname:extent.width does not equal the height + of the subresource specified by pname:{imagesubresource}, + pname:extent.width must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} + * [[VUID-{refpage}-{imageoffset}-10057]] + For each element of pname:pRegions, if + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, the difference of + pname:{imageoffset}.y and pname:extent.height must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} + * [[VUID-{refpage}-{imageoffset}-10058]] + For each element of pname:pRegions, if + slink:VkCopyCommandTransformInfoQCOM::pname:transform is equal to + ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR, the difference of + pname:{imageoffset}.y and pname:extent.width must: be a multiple of the + <> of the + elink:VkFormat of pname:{imageparam} +endif::VK_QCOM_rotated_copy_commands[] * [[VUID-{refpage}-{imageparam}-00209]] For each element of pname:pRegions, if the sum of pname:{imageoffset}.z and pname:extent.depth does not equal the depth of the subresource diff --git a/chapters/copies.adoc b/chapters/copies.adoc index a03ed0607..9757d4c75 100644 --- a/chapters/copies.adoc +++ b/chapters/copies.adoc @@ -452,119 +452,70 @@ load and store data between images and application-defined offsets in buffer memory. [[copies-buffers-images-addressing]] -When copying between a buffer and an image, whole texel blocks are always -copied; each texel block in the specified extent in the image to be copied -will be written to a region in the buffer, specified according to the -position of the texel block, and the <> and size of the format being copied. - -For a set of coordinates [eq]#(x,y,z,layer)#, where: - - {empty}:: [eq]#x# is in the range [eq]#[pname:imageOffset.x / blockWidth, - {lceil}(pname:imageOffset.x {plus} pname:imageExtent.width) / - blockWidth{rceil})#, - {empty}:: [eq]#y# is in the range [eq]#[pname:imageOffset.y / blockHeight, - {lceil}(pname:imageOffset.y {plus} pname:imageExtent.height) / - blockHeight{rceil})#, - {empty}:: [eq]#z# is in the range [eq]#[pname:imageOffset.z / blockDepth, - {lceil}(pname:imageOffset.z {plus} pname:imageExtent.depth) / - blockDepth{rceil})#, +When copying between a buffer and an image, texels in the image and bytes in +the buffer are accessed as follows. + +Texels at each coordinate [eq]#(x,y,z,layer)# in the image subresource are +accessed, where: + + {empty}:: [eq]#x# is in the range [eq]#[pname:imageOffset.x, + pname:imageOffset.x {plus} pname:imageExtent.width)#, + {empty}:: [eq]#y# is in the range [eq]#[pname:imageOffset.y, + pname:imageOffset.y {plus} pname:imageExtent.height)#, + {empty}:: [eq]#z# is in the range [eq]#[pname:imageOffset.z, + pname:imageOffset.z {plus} pname:imageExtent.depth)#, {empty}:: [eq]#layer# is in the range - [pname:imageSubresource.baseArrayLayer, + [eq]#[pname:imageSubresource.baseArrayLayer, pname:imageSubresource.baseArrayLayer {plus} - pname:imageSubresource.layerCount), - -and where [eq]#blockWidth#, [eq]#blockHeight#, and [eq]#blockDepth# are the -dimensions of the <> of -the image's format. - -For each [eq]#(x,y,z,layer)# coordinate, texels in the image layer selected -by [eq]#layer# are accessed in the following ranges: - - {empty}:: [eq]#[x {times} blockWidth, max( (x {times} blockWidth) {plus} - blockWidth, imageWidth) )# - {empty}:: [eq]#[y {times} blockHeight, max( (y {times} blockHeight) {plus} - blockHeight, imageHeight) )# - {empty}:: [eq]#[z {times} blockDepth, max( (z {times} blockDepth) {plus} - blockDepth, imageDepth) )# - -where [eq]#imageWidth#, [eq]#imageHeight#, and [eq]#imageDepth# are the -dimensions of the image subresource. - -For each [eq]#(x,y,z,layer)# coordinate, bytes in the buffer are accessed at -offsets in the range [eq]#[texelOffset, texelOffset {plus} blockSize)#, -where: - - {empty}:: [eq]#texelOffset = pname:bufferOffset {plus} (x {times} - blockSize) {plus} (y {times} rowExtent) {plus} (z {times} - sliceExtent) + (layer {times} layerExtent)# - {empty}:: [eq]#blockSize# is the size of the block in bytes for the format - {empty}:: [eq]#rowExtent = max(pname:bufferRowLength, - {lceil}pname:imageExtent.width / blockWidth{rceil} {times} - blockSize)# - {empty}:: [eq]#sliceExtent = max(pname:bufferImageHeight, - pname:imageExtent.height {times} rowExtent)# - {empty}:: [eq]#layerExtent = pname:imageExtent.depth {times} sliceExtent# + pname:imageSubresource.layerCount) + +For each [eq]#(x,y,z,layer)# coordinate in the image, bytes in the buffer +are accessed at offsets in the range [eq]#[texelOffset, texelOffset {plus} +blockSize)#, where: + + {empty}:: [eq]#texelOffset = pname:bufferOffset {plus} ({lfloor}x / + blockWidth{rfloor} {times} blockSize) {plus} ({lfloor}y / + blockHeight{rfloor} {times} rowExtent) {plus} ({lfloor}z / + blockDepth{rfloor} {times} sliceExtent) {plus} (layer {times} + layerExtent)# + {empty}:: [eq]#rowExtent = {lceil} max(pname:bufferRowLength, + pname:imageExtent.width) / blockWidth {rceil} {times} blockSize# + {empty}:: [eq]#sliceExtent = {lceil} max(pname:bufferImageHeight, + pname:imageExtent.height) / blockHeight {rceil} {times} + rowExtent# + {empty}:: [eq]#layerExtent = {lceil} pname:imageExtent.depth / blockDepth + {rceil} {times} sliceExtent# + +and where [eq]#blockSize#, [eq]#blockWidth#, [eq]#blockHeight#, and +[eq]#blockDepth# are the <> of the image's format. ifdef::VK_QCOM_rotated_copy_commands[] [[copies-buffers-images-rotation-addressing]] If a rotation is specified by slink:VkCopyCommandTransformInfoQCOM, the 2D -region of the image being addressed is rotated around the offset, modifying -the range of [eq]#x# and [eq]#y# coordinates for the image address according -to the specified elink:VkSurfaceTransformFlagBitsKHR: +region of the image being addressed is rotated around the offset, and texels +at each coordinate [eq]#(x',y',z',layer)# are accessed in the image +subresource instead, where: * If ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR is specified, no rotation is performed: {empty}:: [eq]#x'# is in the same range as [eq]#x# {empty}:: [eq]#y'# is in the same range as [eq]#y# - {empty}:: [eq]#blockWidth' = blockWidth# - {empty}:: [eq]#blockHeight' = blockHeight# - {empty}:: [eq]#imageWidth' = imageWidth# - {empty}:: [eq]#imageHeight' = imageHeight# * If ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR is specified - {empty}:: [eq]#x'# is in the range [eq]#[{lceil}(pname:imageOffset.x - {minus} pname:imageExtent.height) / blockHeight{rceil}, - pname:imageOffset.x {minus} image/ blockHeight)# - {empty}:: [eq]#y'# is in the range [eq]#[pname:imageOffset.y / - blockWidth, {lceil}(pname:imageOffset.y {plus} - pname:imageExtent.width) / blockWidth{rceil})# - {empty}:: [eq]#blockWidth' = blockHeight# - {empty}:: [eq]#blockHeight' = blockWidth# - {empty}:: [eq]#imageWidth' = imageHeight# - {empty}:: [eq]#imageHeight' = imageWidth# + {empty}:: [eq]#x'# is in the range [eq]#[pname:imageOffset.x {minus} + pname:imageExtent.height, pname:imageOffset.x)# + {empty}:: [eq]#y'# is in the range [eq]#[pname:imageOffset.y, + pname:imageOffset.y {plus} pname:imageExtent.width)# * If ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR is specified: - {empty}:: [eq]#x'# is in the range [eq]#[{lceil}(pname:imageOffset.x - {minus} pname:imageExtent.width) / blockWidth{rceil}, - pname:imageOffset.x / blockWidth)#, - {empty}:: [eq]#y'# is in the range [eq]#[{lceil}(pname:imageOffset.x - {plus} pname:imageExtent.height) / blockHeight{rceil}, - pname:imageOffset.x / blockHeight)#, - {empty}:: [eq]#blockWidth' = blockWidth# - {empty}:: [eq]#blockHeight' = blockHeight# - {empty}:: [eq]#imageWidth' = imageWidth# - {empty}:: [eq]#imageHeight' = imageHeight# + {empty}:: [eq]#x'# is in the range [eq]#[pname:imageOffset.x {minus} + pname:imageExtent.width, pname:imageOffset.x)# + {empty}:: [eq]#y'# is in the range [eq]#[pname:imageOffset.y {minus} + pname:imageExtent.height, pname:imageOffset.y)# * If ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR is specified: - {empty}:: [eq]#x# is in the range [eq]#[pname:imageOffset.x / - blockHeight, {lceil}(pname:imageOffset.x {plus} - pname:imageExtent.height) / blockHeight{rceil})# - {empty}:: [eq]#y# is in the range [eq]#[{lceil}(pname:imageOffset.y - {minus} pname:imageExtent.width) / blockWidth{rceil}, - pname:imageOffset.y / blockWidth)#. - {empty}:: [eq]#blockWidth' = blockHeight# - {empty}:: [eq]#blockHeight' = blockWidth# - {empty}:: [eq]#imageWidth' = imageHeight# - {empty}:: [eq]#imageHeight' = imageWidth# - -When rotation is performed, for each [eq]#(x,y,z,layer)# coordinate, texels -in the image layer selected by [eq]#layer# are instead accessed in the -following ranges: - - {empty}:: [eq]#[x' {times} blockWidth', max( (x' {times} blockWidth') - {plus} blockWidth', imageWidth') )# - {empty}:: [eq]#[y' {times} blockHeight', max( (y' {times} blockHeight') - {plus} blockHeight', imageHeight') )# - {empty}:: [eq]#[z' {times} blockDepth', max( (z' {times} blockDepth') - {plus} blockDepth', imageDepth') )# + {empty}:: [eq]#x'# is in the range [eq]#[pname:imageOffset.x, + pname:imageOffset.x {plus} pname:imageExtent.height)# + {empty}:: [eq]#y'# is in the range [eq]#[pname:imageOffset.y {minus} + pname:imageExtent.width, pname:imageOffset.y)# Buffer addressing calculations are unaffected by this rotation. endif::VK_QCOM_rotated_copy_commands[] diff --git a/chapters/descriptorsets.adoc b/chapters/descriptorsets.adoc index 18428ebc0..ea42e271f 100644 --- a/chapters/descriptorsets.adoc +++ b/chapters/descriptorsets.adoc @@ -480,7 +480,7 @@ descriptor. ==== To find which descriptor types are supported as ename:VK_DESCRIPTOR_TYPE_MUTABLE_EXT, the application can: use -flink:vkGetDescriptorSetLayoutSupport with an +flink:vkGetDescriptorSetLayoutSupport with a ename:VK_DESCRIPTOR_TYPE_MUTABLE_EXT binding, with the list of descriptor types to query in the slink:VkMutableDescriptorTypeCreateInfoEXT::pname:pDescriptorTypes array for @@ -675,10 +675,9 @@ endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[] ifdef::VK_EXT_mutable_descriptor_type,VK_VALVE_mutable_descriptor_type[] * [[VUID-VkDescriptorSetLayoutCreateInfo-pBindings-07303]] If any element pname:pBindings[i] has a pname:descriptorType of - ename:VK_DESCRIPTOR_TYPE_MUTABLE_EXT, then a - slink:VkMutableDescriptorTypeCreateInfoEXT must: be present in the - pname:pNext chain, and pname:mutableDescriptorTypeListCount must: be - greater than i + ename:VK_DESCRIPTOR_TYPE_MUTABLE_EXT, then the pname:pNext chain must: + include a slink:VkMutableDescriptorTypeCreateInfoEXT structure, and + pname:mutableDescriptorTypeListCount must: be greater than i * [[VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-04594]] If a binding has a pname:descriptorType value of ename:VK_DESCRIPTOR_TYPE_MUTABLE_EXT, then sname:pImmutableSamplers @@ -6485,9 +6484,9 @@ include::{generated}/api/structs/VkDescriptorBufferBindingInfoEXT.adoc[] pname:address was queried. ifdef::VK_KHR_maintenance5[] -If a slink:VkBufferUsageFlags2CreateInfoKHR structure is present in the -pname:pNext chain, slink:VkBufferUsageFlags2CreateInfoKHR::pname:usage from -that structure is used instead of pname:usage from this structure. +If the pname:pNext chain includes a slink:VkBufferUsageFlags2CreateInfoKHR +structure, slink:VkBufferUsageFlags2CreateInfoKHR::pname:usage from that +structure is used instead of pname:usage from this structure. endif::VK_KHR_maintenance5[] .Valid Usage diff --git a/chapters/dispatch.adoc b/chapters/dispatch.adoc index 9b50cdbb5..8c3150025 100644 --- a/chapters/dispatch.adoc +++ b/chapters/dispatch.adoc @@ -84,7 +84,7 @@ include::{chapters}/commonvalidity/draw_dispatch_indirect_common.adoc[] include::{generated}/validity/protos/vkCmdDispatchIndirect.adoc[] -- -[open,refpage='VkDispatchIndirectCommand',desc='Structure specifying a indirect dispatching command',type='structs',xrefs='vkCmdDispatchIndirect'] +[open,refpage='VkDispatchIndirectCommand',desc='Structure specifying an indirect dispatching command',type='structs',xrefs='vkCmdDispatchIndirect'] -- The sname:VkDispatchIndirectCommand structure is defined as: diff --git a/chapters/drawing.adoc b/chapters/drawing.adoc index ac5bbef80..6d8e60d23 100644 --- a/chapters/drawing.adoc +++ b/chapters/drawing.adoc @@ -1256,7 +1256,7 @@ include::{chapters}/commonvalidity/draw_indirect_drawcount.adoc[] include::{generated}/validity/protos/vkCmdDrawIndirect.adoc[] -- -[open,refpage='VkDrawIndirectCommand',desc='Structure specifying a indirect drawing command',type='structs',xrefs='vkCmdDrawIndirect'] +[open,refpage='VkDrawIndirectCommand',desc='Structure specifying an indirect drawing command',type='structs',xrefs='vkCmdDrawIndirect'] -- :refpage: VkDrawIndirectCommand @@ -1416,7 +1416,7 @@ include::{chapters}/commonvalidity/draw_indexed_common.adoc[] include::{generated}/validity/protos/vkCmdDrawIndexedIndirect.adoc[] -- -[open,refpage='VkDrawIndexedIndirectCommand',desc='Structure specifying a indexed indirect drawing command',type='structs',xrefs='vkCmdDrawIndexedIndirect'] +[open,refpage='VkDrawIndexedIndirectCommand',desc='Structure specifying an indexed indirect drawing command',type='structs',xrefs='vkCmdDrawIndexedIndirect'] -- :refpage: VkDrawIndexedIndirectCommand diff --git a/chapters/features.adoc b/chapters/features.adoc index e017dfc92..6c67b4380 100644 --- a/chapters/features.adoc +++ b/chapters/features.adoc @@ -6237,7 +6237,7 @@ include::{generated}/validity/structs/VkPhysicalDevicePipelineRobustnessFeatures endif::VK_EXT_pipeline_robustness[] ifdef::VK_EXT_image_view_min_lod[] -[open,refpage='VkPhysicalDeviceImageViewMinLodFeaturesEXT',desc='Structure describing whether clamping the min LOD of a image view is supported by the implementation',type='structs'] +[open,refpage='VkPhysicalDeviceImageViewMinLodFeaturesEXT',desc='Structure describing whether clamping the min LOD of an image view is supported by the implementation',type='structs'] -- The sname:VkPhysicalDeviceImageViewMinLodFeaturesEXT structure is defined as: diff --git a/chapters/fragmentdensitymapops.adoc b/chapters/fragmentdensitymapops.adoc index 388686856..2f6fe9795 100644 --- a/chapters/fragmentdensitymapops.adoc +++ b/chapters/fragmentdensitymapops.adoc @@ -49,12 +49,12 @@ The offsetted coordinate [eq]#(x',y')# is computed as follows: [latexmath] [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} x' &= \mathbin{clamp}(x + pFragmentDensityOffsets[layer]_{x}, 0, framebuffer_{width} - 1) \\ y' &= \mathbin{clamp}(y + pFragmentDensityOffsets[layer]_{y}, 0, framebuffer_{height} - 1) \\ \end{aligned} -++++++++++++++++++++++++ +++++ The offsetted coordinate [eq]#(x',y')# fetches a texel from the fragment density map at integer coordinates: diff --git a/chapters/fundamentals.adoc b/chapters/fundamentals.adoc index d1fc74e09..fbf74dabb 100644 --- a/chapters/fundamentals.adoc +++ b/chapters/fundamentals.adoc @@ -721,6 +721,105 @@ calling the same command with the same parameters, so long as those parameters themselves all remain valid. +[[fundamentals-commandsyntax-array-results]] +=== Array Results + +Some query commands of the form ftext:vkGet* and ftext:vkEnumerate* enable +retrieving multiple results in the form of a return array. +Such commands typically have two pointer arguments as follows: + + * An element count pointer pointing to an integer variable, conventionally + named as ftext:p*Count where ftext:* is the capitalized singular form of + the name of the retrieved values. + * A pointer to an array where the result array is retrieved, + conventionally named as ftext:p* where ftext:* is the capitalized plural + form of the name of the retrieved values. + +If such commands are called with the array pointer set to `NULL`, then the +number of retrievable elements is returned in the variable pointed to by the +element count pointer. +Otherwise, the element count pointer must: point to a variable set by the +application to the number of elements in the return array, and on return the +variable is overwritten with the number of elements actually written to the +return array. +If the input element count is less than the number of retrievable array +elements, the query will write only as many elements to the return array as +specified by the element count variable set by the application, and the +command will return ename:VK_INCOMPLETE instead of ename:VK_SUCCESS, to +indicate that not all retrievable array elements were returned. + +[NOTE] +.Note +==== +In practice, this means that applications will typically call such query +commands twice: + + * First, with the array pointer set to `NULL`, to retrieve the number of + retrievable elements. + * Second, with the array pointer pointing to an application allocated + storage for at least as many elements as indicated by the variable + pointed to by the element count pointer, to retrieve at most as many of + the retrievable elements. +==== + +Query commands that return one or more structures, regardless of whether +they return a single or an array of structures with or without a pname:pNext +chain, may: also contain arrays within those structures. +Such return arrays are typically defined in the form of two members as +follows: + + * An integer value specifying the element count, conventionally named as + ftext:*Count where ftext:* is the singular form of the name of the + retrieved values. + * A pointer to an array where the result array is retrieved, + conventionally named as ftext:p* where ftext:* is the capitalized plural + form of the name of the retrieved values. + +Analogously to query commands that return multiple results, if the command +is called with the array pointer member of the output structure in question +set to `NULL`, then the number of retrievable elements is returned in the +element count member of that output structure. +Otherwise, the element count must: specify the number of elements in the +return array, and on return the element count member is overwritten with the +number of elements actually written to the return array. +If the input element count is less than the number of retrievable array +elements, the query will write only as many elements to the return array as +specified by the input element count, and the command will return +ename:VK_INCOMPLETE instead of ename:VK_SUCCESS, if the query command has a +elink:VkResult return type, to indicate that not all retrievable array +elements were returned. + +[NOTE] +.Note +==== +Applications need to separately track the value they provided as the input +element count member for such arrays and compare those with the returned +element counts in order to determine whether the actually returned element +count is smaller than the size of the return array. +Another side effect of this is that it is impossible for the application to +determine if the number of retrievable elements has increased beyond the +provided input element count so using return arrays in output structures +should: be limited to _invariant_ array results. +In practice, this means that applications will typically call such query +commands multiple times: + + * First, with the array pointer member(s) set to `NULL`, to retrieve the + number(s) of retrievable elements. + * Second, with the array pointer(s) pointing to an application allocated + storage for at least as many elements as indicated by the element count + member(s), to retrieve at most as many of the retrievable elements. + * Then the process may: need to be repeated for all other newly introduced + return arrays in any nested output structures indirectly specified + through the previously retrieved result arrays. +==== + +Regardless of the type of query command, any array pointer member of an +output structure must: either be `NULL`, or point to an +application-allocated array. +Query commands must: not return a pointer to implementation allocated +storage in any output structure. + + [[fundamentals-threadingbehavior]] == Threading Behavior @@ -794,7 +893,7 @@ is extended with the pname:pipelineCache parameter to ftext:vkCreate*Pipelines being externally synchronized. endif::VK_VERSION_1_3,VK_EXT_pipeline_creation_cache_control[] -There are also a few instances where a command can: take in a +There are also a few instances where a command can: take in an application-allocated list whose contents are externally synchronized parameters. In these cases, the caller must: guarantee that at most one thread is using @@ -1308,7 +1407,7 @@ two categories: * Successful completion codes are returned when a command needs to communicate success or status information. All successful completion codes are non-negative values. - * Run time error codes are returned when a command needs to communicate a + * Runtime error codes are returned when a command needs to communicate a failure that could only be detected at runtime. All runtime error codes are negative values. @@ -1762,9 +1861,9 @@ The conversion from an unsigned normalized fixed-point value [eq]#c# to the corresponding floating-point value [eq]#f# is defined as [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = { c \over { 2^b - 1 } } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ Signed normalized fixed-point integers represent numbers in the range [eq]#[-1,1]#. @@ -1772,9 +1871,9 @@ The conversion from a signed normalized fixed-point value [eq]#c# to the corresponding floating-point value [eq]#f# is performed using [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = \max\left( {c \over {2^{b-1} - 1}}, -1.0 \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ Only the range [eq]#[-2^b-1^ {plus} 1, 2^b-1^ - 1]# is used to represent signed fixed-point values in the range [eq]#[-1,1]#. diff --git a/chapters/interfaces.adoc b/chapters/interfaces.adoc index 226def4d2..f05f0747b 100644 --- a/chapters/interfaces.adoc +++ b/chapters/interfaces.adoc @@ -5011,7 +5011,7 @@ code:VertexOffsetHUAWEI:: The code:VertexOffsetHUAWEI decoration can be used to decorate a cluster culling shader output variable,this indexed mode specific variable will -contain an integer value that specifies a offset value added to the vertex +contain an integer value that specifies an offset value added to the vertex index of a cluster before indexing into the vertex buffer. .Valid Usage diff --git a/chapters/introduction.adoc b/chapters/introduction.adoc index 5ca35918e..9319991cb 100644 --- a/chapters/introduction.adoc +++ b/chapters/introduction.adoc @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: CC-BY-4.0 - [[introduction]] = Introduction diff --git a/chapters/limits.adoc b/chapters/limits.adoc index e891318d7..8947e50ba 100644 --- a/chapters/limits.adoc +++ b/chapters/limits.adoc @@ -1824,9 +1824,9 @@ include::{generated}/api/structs/VkPhysicalDeviceMaintenance6PropertiesKHR.adoc[ * pname:pNext is `NULL` or a pointer to a structure extending this structure. * pname:blockTexelViewCompatibleMultipleLayers is a boolean value - indicating that an implementation supports creating image views with - ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT where the - pname:layerCount member of pname:subresourceRange is greater than `1`. + indicating that an implementation supports creating image views with + ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT where the + pname:layerCount member of pname:subresourceRange is greater than `1`. * pname:maxCombinedImageSamplerDescriptorCount is the maximum number of combined image sampler descriptors that the implementation uses to access any of the <allocationSize must: be less than or equal to - slink:VkPhysicalDeviceMemoryProperties::pname:memoryHeaps[`memindex`].pname:size + slink:VkPhysicalDeviceMemoryProperties::pname:memoryHeaps[memindex].pname:size where `memindex` = slink:VkPhysicalDeviceMemoryProperties::pname:memoryTypes[pname:pAllocateInfo->memoryTypeIndex].pname:heapIndex as returned by flink:vkGetPhysicalDeviceMemoryProperties for the diff --git a/chapters/pipelines.adoc b/chapters/pipelines.adoc index f66e46ddd..8156b039d 100644 --- a/chapters/pipelines.adoc +++ b/chapters/pipelines.adoc @@ -327,9 +327,10 @@ described in more detail in <>. ifdef::VK_KHR_maintenance5[] -If a slink:VkPipelineCreateFlags2CreateInfoKHR structure is present in the -pname:pNext chain, slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags -from that structure is used instead of pname:flags from this structure. +If the pname:pNext chain includes a +slink:VkPipelineCreateFlags2CreateInfoKHR structure, +slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags from that structure +is used instead of pname:flags from this structure. endif::VK_KHR_maintenance5[] .Valid Usage @@ -704,9 +705,9 @@ endif::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] ifdef::VK_EXT_shader_module_identifier[] ifdef::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] * [[VUID-VkPipelineShaderStageCreateInfo-stage-06844]] - If a shader module identifier is specified for this pname:stage, a - slink:VkShaderModuleCreateInfo structure must: not be present in the - pname:pNext chain + If a shader module identifier is specified for this pname:stage, the + pname:pNext chain must: not include a slink:VkShaderModuleCreateInfo + structure endif::VK_EXT_graphics_pipeline_library,VK_KHR_maintenance5[] * [[VUID-VkPipelineShaderStageCreateInfo-stage-06848]] If a shader module identifier is specified for this pname:stage, @@ -1844,9 +1845,10 @@ a slink:VkPipelineLayout that is fully endif::VK_EXT_graphics_pipeline_library[] ifdef::VK_KHR_maintenance5[] -If a slink:VkPipelineCreateFlags2CreateInfoKHR structure is present in the -pname:pNext chain, slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags -from that structure is used instead of pname:flags from this structure. +If the pname:pNext chain includes a +slink:VkPipelineCreateFlags2CreateInfoKHR structure, +slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags from that structure +is used instead of pname:flags from this structure. endif::VK_KHR_maintenance5[] ifdef::VKSC_VERSION_1_0[] @@ -6113,9 +6115,10 @@ described in more detail in <>. ifdef::VK_KHR_maintenance5[] -If a slink:VkPipelineCreateFlags2CreateInfoKHR structure is present in the -pname:pNext chain, slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags -from that structure is used instead of pname:flags from this structure. +If the pname:pNext chain includes a +slink:VkPipelineCreateFlags2CreateInfoKHR structure, +slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags from that structure +is used instead of pname:flags from this structure. endif::VK_KHR_maintenance5[] .Valid Usage @@ -6291,9 +6294,10 @@ is computed as described in <>. ifdef::VK_KHR_maintenance5[] -If a slink:VkPipelineCreateFlags2CreateInfoKHR structure is present in the -pname:pNext chain, slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags -from that structure is used instead of pname:flags from this structure. +If the pname:pNext chain includes a +slink:VkPipelineCreateFlags2CreateInfoKHR structure, +slink:VkPipelineCreateFlags2CreateInfoKHR::pname:flags from that structure +is used instead of pname:flags from this structure. endif::VK_KHR_maintenance5[] .Valid Usage diff --git a/chapters/primsrast.adoc b/chapters/primsrast.adoc index 880145824..2509e9817 100644 --- a/chapters/primsrast.adoc +++ b/chapters/primsrast.adoc @@ -2074,17 +2074,18 @@ fragment area of latexmath:[fw \times fh], the fragment for that pixel will cover all pixels with coordinates (_x_',_y_') that satisfy the equations: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} \left\lfloor \frac{x}{fw} \right\rfloor = \left\lfloor \frac{x'}{fw} \right\rfloor \end{aligned} -+++++++++++++++++++ +++++ + [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} \left\lfloor \frac{y}{fh} \right\rfloor = \left\lfloor \frac{y'}{fh} \right\rfloor \end{aligned} -+++++++++++++++++++ +++++ This combined fragment is considered to have multiple coverage samples; the total number of samples in this fragment is given by latexmath:[samples = fw @@ -2197,13 +2198,13 @@ the fragment will be assigned to <> latexmath:[fs] of pixel latexmath:[(px,py)] as follows: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} px = & fx + (\left\lfloor {cs \over fsc} \right\rfloor \text{ \% } fw) \\ py = & fy + \left\lfloor {cs \over {fsc \times fw}} \right\rfloor \\ fs = & cs \text{ \% } fsc \end{aligned} -+++++++++++++++++++ +++++ When using a coarse sample order of ename:VK_COARSE_SAMPLE_ORDER_TYPE_SAMPLE_MAJOR_NV, @@ -2211,13 +2212,13 @@ ename:VK_COARSE_SAMPLE_ORDER_TYPE_SAMPLE_MAJOR_NV, will be assigned as follows: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} px = & fx + cs \text{ \% } fw \\ py = & (fy + \left\lfloor {cs \over fw} \right\rfloor \text{ \% } fh) \\ fs = & \left\lfloor {cs \over {fw \times fh}} \right\rfloor \end{aligned} -+++++++++++++++++++ +++++ [open,refpage='VkCoarseSampleOrderCustomNV',desc='Structure specifying parameters controlling shading rate image usage',type='structs'] -- @@ -2609,14 +2610,14 @@ top-to-bottom, respectively. The following formulas are used to evaluate [eq]#s# and [eq]#t#: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ s = {1 \over 2} + { \left( x_p - x_f \right) \over \text{size} } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ t = {1 \over 2} + { \left( y_p - y_f \right) \over \text{size} } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where size is the point's size; [eq]#(x~p~,y~p~)# is the location at which the point sprite coordinates are evaluated - this may: be the framebuffer @@ -2913,10 +2914,10 @@ Set // Equation {linet:eq} [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ t = {{( \mathbf{p}_r - \mathbf{p}_a ) \cdot ( \mathbf{p}_b - \mathbf{p}_a )} \over {\| \mathbf{p}_b - \mathbf{p}_a \|^2 }} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ (Note that [eq]#t = 0# at [eq]#**p**~a~# and [eq]#t = 1# at [eq]#**p**~b~#. Also note that this calculation projects the vector from [eq]#**p**~a~# to @@ -2933,10 +2934,10 @@ consideration, by way of the line segment's clip coordinates. An interpolated value [eq]#f# can be determined by [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = {{ (1-t) {f_a / w_a} + t { f_b / w_b} } \over {(1-t) / w_a + t / w_b }} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where [eq]#f~a~# and [eq]#f~b~# are the data associated with the starting and ending endpoints of the segment, respectively; [eq]#w~a~# and [eq]#w~b~# @@ -3094,9 +3095,9 @@ and [eq]#y~f~#, define a diamond-shaped region that is the intersection of four half planes: [latexmath] -+++++++++++++++++++ +++++ R_f = \{ (x,y) \mid | x - x_f | + | y - y_f | < \frac{1}{2} \} -+++++++++++++++++++ +++++ Essentially, a line segment starting at [eq]#p~a~# and ending at [eq]#p~b~# produces those fragments [eq]#f# for which the segment intersects @@ -3214,9 +3215,9 @@ _s_. Let [latexmath] -+++++++++++++++++++ +++++ b = \left\lfloor \frac{s}{r} \right\rfloor \bmod 16 -+++++++++++++++++++ +++++ Then a fragment is produced if the _b_'th bit of _p_ is 1, and discarded otherwise. @@ -3338,11 +3339,11 @@ polygon's area computed in framebuffer coordinates. One way to compute this area is: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ a = -{1 \over 2}\sum_{i=0}^{n-1} x_f^i y_f^{i \oplus 1} - x_f^{i \oplus 1} y_f^i -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where latexmath:[x_f^i] and latexmath:[y_f^i] are the [eq]#x# and [eq]#y# framebuffer coordinates of the [eq]##i##th vertex of the [eq]#n#-vertex @@ -3514,11 +3515,11 @@ triangle. [eq]#a#, [eq]#b#, and [eq]#c# are determined by: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ a = {{\mathrm{A}(p p_b p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad b = {{\mathrm{A}(p p_a p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad c = {{\mathrm{A}(p p_a p_b)} \over {\mathrm{A}(p_a p_b p_c)}}, -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where [eq]#A(lmn)# denotes the area in framebuffer coordinates of the triangle with vertices [eq]#l#, [eq]#m#, and [eq]#n#. @@ -3533,10 +3534,10 @@ consideration, by way of the triangle's clip coordinates. An interpolated value [eq]#f# can be determined by [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = {{ a {f_a / w_a} + b {f_b / w_b} + c {f_c / w_c} } \over { {a / w_a} + {b / w_b} + {c / w_c} }} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where [eq]#w~a~#, [eq]#w~b~#, and [eq]#w~c~# are the clip [eq]#w# coordinates of [eq]#p~a~#, [eq]#p~b~#, and [eq]#p~c~#, respectively. @@ -3566,9 +3567,9 @@ produced by the rasterization algorithm. That is, it must: be the case that at every fragment [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = \sum_{i=1}^{n} a_i f_i -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where [eq]#n# is the number of vertices in the polygon and [eq]#f~i~# is the value of [eq]#f# at vertex [eq]#i#. @@ -3797,20 +3798,20 @@ below. The maximum depth slope [eq]#m# of a triangle is [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ m = \sqrt{ \left({{\partial z_f} \over {\partial x_f}}\right)^2 + \left({{\partial z_f} \over {\partial y_f}}\right)^2} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where [eq]#(x~f~, y~f~, z~f~)# is a point on the triangle. [eq]#m# may: be approximated as [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ m = \max\left( \left| { {\partial z_f} \over {\partial x_f} } \right|, \left| { {\partial z_f} \over {\partial y_f} } \right| \right). -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ ifdef::VK_EXT_depth_bias_control[] In a pipeline with a depth bias representation of @@ -3888,7 +3889,7 @@ If no depth attachment is present, [eq]#r# is undefined:. The bias value [eq]#o# for a polygon is [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} o &= \mathrm{dbclamp}( m \times \mathtt{depthBiasSlopeFactor} + r \times \mathtt{depthBiasConstantFactor} ) \\ \text{where} &\quad \mathrm{dbclamp}(x) = @@ -3898,7 +3899,7 @@ o &= \mathrm{dbclamp}( m \times \mathtt{depthBiasSlopeFactor} + r \times \mathtt \max(x, \mathtt{depthBiasClamp}) & \mathtt{depthBiasClamp} < 0 \\ \end{cases} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ [eq]#m# is computed as described above. If the depth attachment uses a fixed-point representation, [eq]#m# is a diff --git a/chapters/raytraversal.adoc b/chapters/raytraversal.adoc index e6c44d4a7..8799cd6cc 100644 --- a/chapters/raytraversal.adoc +++ b/chapters/raytraversal.adoc @@ -59,7 +59,7 @@ space #~as~# to ray space #~r~# according to the ray origin and direction as follows: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \left( \begin{array}{c} x_{r} \\ @@ -81,14 +81,14 @@ follows: z_{as} - o_z \end{array} \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ latexmath:[\mathbf{a}] is the axis of rotation from the unnormalized ray direction vector latexmath:[\mathbf{d}] to the axis vector latexmath:[\mathbf{k}]: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \mathbf{a} = \begin{cases} \frac{\mathbf{d} \times \mathbf{k}}{|| \mathbf{d} \times \mathbf{k} ||} & \mathrm{if}\; || \mathbf{d} \times \mathbf{k} || \ne 0 \\ \left(\begin{array}{c} @@ -98,24 +98,24 @@ latexmath:[\mathbf{k}]: \end{array} \right) & \mathrm{if}\; || \mathbf{d} \times \mathbf{k} || = 0 \\ \end{cases} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ latexmath:[\mathit{s}] and latexmath:[\mathit{c}] are the sine and cosine of the angle of rotation about latexmath:[\mathbf{a}] from latexmath:[\mathbf{d}] to latexmath:[\mathbf{k}]: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} c &= {{\mathbf{d} \cdot \mathbf{k}}\over{||\mathbf{d}||}} \\ s &= \sqrt{1 - c^2} \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ latexmath:[\mathbf{k}] is the unit vector: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \mathbf{k} = \left( \begin{array}{c} 0 \\ @@ -123,7 +123,7 @@ latexmath:[\mathbf{k}] is the unit vector: -1 \end{array} \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ latexmath:[\mathbf{o}] and latexmath:[\mathbf{d}] are the ray origin and unnormalized direction, respectively; the vector described by [eq]#x~as~#, @@ -137,14 +137,14 @@ For any primitive that has within its bounds a position latexmath:[\mathbf{xyz_{as}}] such that [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} x_r &= 0 \\ y_r &= 0 \\ t_\mathit{min} \lt {-{z_r}\over{||\mathbf{d}||}} &\lt t_\mathit{max} & \text{if the primitive is a triangle,} \\ t_\mathit{min} \leq {-{z_r}\over{||\mathbf{d}||}} &\leq t_\mathit{max} & \text{otherwise} \\ \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ (where latexmath:[t = {-{z_r}\over{||\mathbf{d}||}}]), an intersection candidate exists. @@ -320,11 +320,11 @@ coordinates. One way to compute this area is: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ a = -{1 \over 2}\sum_{i=0}^{n-1} x_r^i y_r^{i \oplus 1} - x_r^{i \oplus 1} y_r^i -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where latexmath:[x_r^i] and latexmath:[y_r^i] are the [eq]#x# and [eq]#y# <> of the diff --git a/chapters/renderpass.adoc b/chapters/renderpass.adoc index 80f3cc6b2..b69e18df3 100644 --- a/chapters/renderpass.adoc +++ b/chapters/renderpass.adoc @@ -191,7 +191,7 @@ ifdef::VK_NV_framebuffer_mixed_samples[] endif::VK_NV_framebuffer_mixed_samples[] ifdef::VK_EXT_multisampled_render_to_single_sampled[] ** The <> feature, + pname:multisampledRenderToSingleSampled>> feature, endif::VK_EXT_multisampled_render_to_single_sampled[] endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples,VK_EXT_multisampled_render_to_single_sampled[] * [[VUID-VkRenderingInfo-imageView-09429]] @@ -4024,8 +4024,8 @@ endif::VK_ANDROID_external_format_resolve[] + must: have image formats whose <> contain at least ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT - or ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT +features>> contain at least ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or +ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT * [[VUID-VkSubpassDescription2-pColorAttachments-02898]] All attachments in pname:pColorAttachments that are not ename:VK_ATTACHMENT_UNUSED must: have image formats whose @@ -4126,7 +4126,7 @@ ifdef::VK_NV_framebuffer_mixed_samples[] endif::VK_NV_framebuffer_mixed_samples[] ifdef::VK_EXT_multisampled_render_to_single_sampled[] ** The <> feature, + pname:multisampledRenderToSingleSampled>> feature, endif::VK_EXT_multisampled_render_to_single_sampled[] endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples,VK_EXT_multisampled_render_to_single_sampled[] * [[VUID-VkSubpassDescription2-attachment-03073]] @@ -5057,12 +5057,6 @@ ifdef::VK_VERSION_1_1,VK_KHR_multiview[] that is used as a <> by pname:renderPass must: have a pname:layerCount that is either `1`, or greater than pname:layers - * [[VUID-VkFramebufferCreateInfo-renderPass-08921]] - If pname:renderPass was specified with non-zero view masks, each element - of pname:pAttachments that is used as a - <> must: have a pname:layerCount equal to `1` or greater than - the index of the most significant bit set in any of those view masks endif::VK_VERSION_1_1,VK_KHR_multiview[] * [[VUID-VkFramebufferCreateInfo-flags-04539]] If @@ -5238,12 +5232,13 @@ endif::VK_KHR_maintenance7[] or equal to pname:layers * [[VUID-VkFramebufferCreateInfo-flags-04587]] If pname:flags includes ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT and - pname:renderPass was specified with non-zero view masks, each element of - pname:pAttachments that is used as a - <> by pname:renderPass must: have a pname:layerCount that is - either `1`, or greater than the index of the most significant bit set in - any of those view masks + pname:renderPass was specified with non-zero view masks, the + pname:layerCount member of any element of the + pname:pAttachmentImageInfos member of a + slink:VkFramebufferAttachmentsCreateInfo structure in the pname:pNext + chain that is used as a <> must: be either `1`, or greater than + the index of the most significant bit set in any of those view masks endif::VK_KHR_fragment_shading_rate[] ifdef::VK_VERSION_1_1,VK_KHR_multiview[] * [[VUID-VkFramebufferCreateInfo-renderPass-03198]] diff --git a/chapters/resources.adoc b/chapters/resources.adoc index 5ed0bec1b..b73b92693 100644 --- a/chapters/resources.adoc +++ b/chapters/resources.adoc @@ -150,9 +150,9 @@ include::{generated}/api/structs/VkBufferCreateInfo.adoc[] ename:VK_SHARING_MODE_CONCURRENT. ifdef::VK_KHR_maintenance5[] -If a slink:VkBufferUsageFlags2CreateInfoKHR structure is present in the -pname:pNext chain, slink:VkBufferUsageFlags2CreateInfoKHR::pname:usage from -that structure is used instead of pname:usage from this structure. +If the pname:pNext chain includes a slink:VkBufferUsageFlags2CreateInfoKHR +structure, slink:VkBufferUsageFlags2CreateInfoKHR::pname:usage from that +structure is used instead of pname:usage from this structure. endif::VK_KHR_maintenance5[] .Valid Usage @@ -5074,7 +5074,7 @@ endif::VK_KHR_video_maintenance1[] ifdef::VK_ANDROID_external_format_resolve[] and any of the following is true: ** the <> - feature is not enabled + feature is not enabled ** the <> property is ename:VK_FALSE @@ -5084,9 +5084,9 @@ endif::VK_ANDROID_external_format_resolve[] + then the image view's <> must: contain at least one of - ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or - ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT +features>> must: contain at least one of +ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or +ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT ifdef::VK_NV_linear_color_attachment[] or ename:VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV endif::VK_NV_linear_color_attachment[] @@ -7701,7 +7701,7 @@ include::{generated}/validity/structs/VkBindAccelerationStructureMemoryInfoNV.ad :refpage: vkGetAccelerationStructureHandleNV To allow constructing geometry instances with device code if desired, we -need to be able to query a opaque handle for an acceleration structure. +need to be able to query an opaque handle for an acceleration structure. This handle is a value of 8 bytes. To get this handle, call: @@ -7731,7 +7731,7 @@ include::{generated}/validity/protos/vkGetAccelerationStructureHandleNV.adoc[] endif::VK_NV_ray_tracing[] ifdef::VK_KHR_acceleration_structure[] -[open,refpage='vkGetAccelerationStructureDeviceAddressKHR',desc='Query an address of a acceleration structure',type='protos'] +[open,refpage='vkGetAccelerationStructureDeviceAddressKHR',desc='Query an address of an acceleration structure',type='protos'] -- :refpage: vkGetAccelerationStructureDeviceAddressKHR diff --git a/chapters/shaders.adoc b/chapters/shaders.adoc index 8fe69ba1c..f15895720 100644 --- a/chapters/shaders.adoc +++ b/chapters/shaders.adoc @@ -3354,7 +3354,11 @@ include::{generated}/api/structs/VkCooperativeMatrixPropertiesKHR.adoc[] elink:VkComponentTypeKHR. * pname:saturatingAccumulation indicates whether the code:SaturatingAccumulation operand to code:OpCooperativeMatrixMulAddKHR - must: be present. + must: be present or not. + If it is ename:VK_TRUE, the code:SaturatingAccumulation operand must: be + present. + If it is ename:VK_FALSE, the code:SaturatingAccumulation operand must: + not be present. * pname:scope is the scope of all the matrix types, of type elink:VkScopeKHR. @@ -3445,20 +3449,22 @@ endif::VK_NV_cooperative_matrix[] code:OpTypeFloat 32. * ename:VK_COMPONENT_TYPE_FLOAT64_KHR corresponds to SPIR-V code:OpTypeFloat 64. - * ename:VK_COMPONENT_TYPE_SINT8_KHR corresponds to SPIR-V code:OpTypeInt 8 1. + * ename:VK_COMPONENT_TYPE_SINT8_KHR corresponds to SPIR-V code:OpTypeInt 8 + 0/1. * ename:VK_COMPONENT_TYPE_SINT16_KHR corresponds to SPIR-V code:OpTypeInt - 16 1. + 16 0/1. * ename:VK_COMPONENT_TYPE_SINT32_KHR corresponds to SPIR-V code:OpTypeInt - 32 1. + 32 0/1. * ename:VK_COMPONENT_TYPE_SINT64_KHR corresponds to SPIR-V code:OpTypeInt - 64 1. - * ename:VK_COMPONENT_TYPE_UINT8_KHR corresponds to SPIR-V code:OpTypeInt 8 0. + 64 0/1. + * ename:VK_COMPONENT_TYPE_UINT8_KHR corresponds to SPIR-V code:OpTypeInt 8 + 0/1. * ename:VK_COMPONENT_TYPE_UINT16_KHR corresponds to SPIR-V code:OpTypeInt - 16 0. + 16 0/1. * ename:VK_COMPONENT_TYPE_UINT32_KHR corresponds to SPIR-V code:OpTypeInt - 32 0. + 32 0/1. * ename:VK_COMPONENT_TYPE_UINT64_KHR corresponds to SPIR-V code:OpTypeInt - 64 0. + 64 0/1. -- endif::VK_NV_cooperative_matrix,VK_KHR_cooperative_matrix[] diff --git a/chapters/synchronization.adoc b/chapters/synchronization.adoc index abffe8e06..cb90d349f 100644 --- a/chapters/synchronization.adoc +++ b/chapters/synchronization.adoc @@ -1146,7 +1146,7 @@ ifdef::VK_EXT_blend_operation_advanced[] endif::VK_EXT_blend_operation_advanced[] ifdef::VK_HUAWEI_invocation_mask[] * ename:VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI specifies read access - to a invocation mask image in the + to an invocation mask image in the ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI pipeline stage. endif::VK_HUAWEI_invocation_mask[] ifdef::VK_KHR_acceleration_structure,VK_NV_ray_tracing[] @@ -1479,7 +1479,7 @@ endif::VK_EXT_blend_operation_advanced[] ifdef::VK_KHR_acceleration_structure,VK_NV_ray_tracing[] ifdef::VK_HUAWEI_invocation_mask[] * ename:VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI specifies read access - to a invocation mask image in the + to an invocation mask image in the ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI pipeline stage. endif::VK_HUAWEI_invocation_mask[] * ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR specifies read diff --git a/chapters/textures.adoc b/chapters/textures.adoc index 0db1ac1bd..5837436aa 100644 --- a/chapters/textures.adoc +++ b/chapters/textures.adoc @@ -283,14 +283,14 @@ First, the components [eq]#(red, green, blue)# are clamped to where: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} N & = 9 & \text{number of mantissa bits per component} \\ B & = 15 & \text{exponent bias} \\ E_{max} & = 31 & \text{maximum possible biased exponent value} \\ sharedexp_{max} & = \frac{(2^N-1)}{2^N} \times 2^{(E_{max}-B)} \end{aligned} -+++++++++++++++++++ +++++ [NOTE] .Note @@ -309,7 +309,7 @@ The largest clamped component, [eq]#max~clamped~# is determined: A preliminary shared exponent [eq]#exp'# is computed: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} exp' = \begin{cases} @@ -319,22 +319,22 @@ exp' = & \text{for}\ max_{clamped} \leq 2^{-(B+1)} \end{cases} \end{aligned} -+++++++++++++++++++ +++++ The shared exponent [eq]#exp~shared~# is computed: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} max_{shared} = \left \lfloor { \frac{max_{clamped}}{2^{(exp'-B-N)}} + \frac{1}{2} } \right \rfloor \end{aligned} -+++++++++++++++++++ +++++ [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} exp_{shared} = \begin{cases} @@ -342,13 +342,13 @@ exp_{shared} = exp'+1 & \text{for}\ max_{shared} = 2^N \end{cases} \end{aligned} -+++++++++++++++++++ +++++ Finally, three integer values in the range [eq]#0# to [eq]#2^N^# are computed: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} red_{shared} & = \left \lfloor @@ -363,7 +363,7 @@ blue_{shared} & = { \frac{blue_{clamped}}{2^{(exp_{shared}-B-N)}}+ \frac{1}{2} } \right \rfloor \end{aligned} -+++++++++++++++++++ +++++ [[textures-sexp-RGB]] @@ -1035,7 +1035,7 @@ It is defined as follows for each color [eq]#component#: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} Color'_{component} & = \begin{cases} @@ -1048,12 +1048,12 @@ one & \text{for ONE swizzle} \\ identity & \text{for IDENTITY swizzle} \end{cases} \end{aligned} -+++++++++++++++++++ +++++ where: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} one & = \begin{cases} @@ -1069,7 +1069,7 @@ identity & = & Color_a & \text{for}\ component = a \\ \end{cases} \end{aligned} -+++++++++++++++++++ +++++ If the border color is one of the etext:VK_BORDER_COLOR_*_OPAQUE_BLACK enums and the elink:VkComponentSwizzle is not the @@ -1205,12 +1205,12 @@ section. reconstructed as follows: + [latexmath] -++++++++++++++ +++++ \begin{aligned} \tau_R'(i, j) & = \tau_R(\left\lfloor{i\times 0.5}\right\rfloor, j)[level] \\ \tau_B'(i, j) & = \tau_B(\left\lfloor{i\times 0.5}\right\rfloor, j)[level] \end{aligned} -++++++++++++++ +++++ ** If the format's R and B components are reduced in resolution in width and height by a factor of two relative to the G component (i.e. this is @@ -1219,12 +1219,12 @@ section. reconstructed as follows: + [latexmath] -++++++++++++++ +++++ \begin{aligned} \tau_R'(i, j) & = \tau_R(\left\lfloor{i\times 0.5}\right\rfloor, \left\lfloor{j\times 0.5}\right\rfloor)[level] \\ \tau_B'(i, j) & = \tau_B(\left\lfloor{i\times 0.5}\right\rfloor, \left\lfloor{j\times 0.5}\right\rfloor)[level] \end{aligned} -++++++++++++++ +++++ + [NOTE] .Note @@ -1242,25 +1242,25 @@ pname:chromaFilter is ename:VK_FILTER_NEAREST for explicit reconstruction. *** If pname:xChromaOffset is ename:VK_CHROMA_LOCATION_COSITED_EVEN: + [latexmath] -+++++ +++++ \tau_{RB}'(i,j) = \begin{cases} \tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor,j)[level], & 0.5 \times i = \left\lfloor{0.5 \times i}\right\rfloor\\ 0.5\times\tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor,j)[level] + \\ 0.5\times\tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor + 1,j)[level], & 0.5 \times i \neq \left\lfloor{0.5 \times i}\right\rfloor \end{cases} -+++++ +++++ + *** If pname:xChromaOffset is ename:VK_CHROMA_LOCATION_MIDPOINT: + [latexmath] -+++++ +++++ \tau_{RB}'(i,j) = \begin{cases} 0.25 \times \tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor - 1,j)[level] + \\ 0.75 \times \tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor,j)[level], & 0.5 \times i = \left\lfloor{0.5 \times i}\right\rfloor\\ 0.75 \times \tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor,j)[level] + \\ 0.25 \times \tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor + 1,j)[level], & 0.5 \times i \neq \left\lfloor{0.5 \times i}\right\rfloor \end{cases} -+++++ +++++ ** If the format's R and B components are reduced in resolution in width and height by a factor of two relative to the G component (i.e. this is @@ -1269,7 +1269,7 @@ pname:chromaFilter is ename:VK_FILTER_NEAREST for explicit reconstruction. concisely as follows: + [latexmath] -+++++ +++++ \begin{aligned} i_{RB} & = \begin{cases} @@ -1288,10 +1288,10 @@ pname:chromaFilter is ename:VK_FILTER_NEAREST for explicit reconstruction. i_{frac} & = i_{RB} - i_{floor} \\ j_{frac} & = j_{RB} - j_{floor} \end{aligned} -+++++ +++++ + [latexmath] -+++++ +++++ \begin{aligned} \tau_{RB}'(i,j) = & \tau_{RB}( i_{floor}, j_{floor})[level] @@ -1307,7 +1307,7 @@ pname:chromaFilter is ename:VK_FILTER_NEAREST for explicit reconstruction. & \times & ( i_{frac} ) & & \times & ( j_{frac} ) & \end{aligned} -+++++ +++++ [NOTE] .Note @@ -1345,7 +1345,7 @@ if the component has a downsample factor of two relative to the luma component): [latexmath] -++++++ +++++ \begin{aligned} u_{RB}' (422/420) &= \begin{cases} @@ -1358,7 +1358,7 @@ v_{RB}' (420) &= 0.5\times v, & \textrm{yChromaOffset = MIDPOINT} \end{cases} \end{aligned} -++++++ +++++ [[textures-sampler-YCbCr-conversion]] @@ -1409,13 +1409,13 @@ of the slink:VkSamplerYcbcrConversionCreateInfo structure: following transformations are applied: + [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} Y' &= C'_{rgba}[G] \\ C_B &= C'_{rgba}[B] - {{2^{(n-1)}}\over{(2^n) - 1}} \\ C_R &= C'_{rgba}[R] - {{2^{(n-1)}}\over{(2^n) - 1}} \end{aligned} -+++++++++++++++++++ +++++ + [NOTE] .Note @@ -1432,13 +1432,13 @@ updated to maintain parity. following transformations are applied: + [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} Y' &= {{C'_{rgba}[G] \times (2^n-1) - 16\times 2^{n-8}}\over{219\times 2^{n-8}}} \\ C_B &= {{C'_{rgba}[B] \times \left(2^n-1\right) - 128\times 2^{n-8}}\over{224\times 2^{n-8}}} \\ C_R &= {{C'_{rgba}[R] \times \left(2^n-1\right) - 128\times 2^{n-8}}\over{224\times 2^{n-8}}} \end{aligned} -+++++++++++++++++++ +++++ + [NOTE] .Note @@ -1669,7 +1669,7 @@ For code:Proj image operations, the normalized texel coordinates transformed as follows: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} s & = \frac{s}{q}, & \text{for 1D, 2D, or 3D image} \\ \\ @@ -1679,7 +1679,7 @@ r & = \frac{r}{q}, & \text{for 3D image} \\ \\ D_{\textit{ref}} & = \frac{D_{\textit{ref}}}{q}, & \text{if provided} \end{aligned} -+++++++++++++++++++ +++++ [[textures-derivative-image-operations]] @@ -1696,13 +1696,13 @@ coordinates are calculated in the same manner as That is: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} \partial{s}/\partial{x} & = dPdx(s), & \partial{s}/\partial{y} & = dPdy(s), & \text{for 1D, 2D, Cube, or 3D image} \\ \partial{t}/\partial{x} & = dPdx(t), & \partial{t}/\partial{y} & = dPdy(t), & \text{for 2D, Cube, or 3D image} \\ \partial{r}/\partial{x} & = dPdx(r), & \partial{r}/\partial{y} & = dPdy(r), & \text{for Cube or 3D image} \end{aligned} -+++++++++++++++++++ +++++ Partial derivatives not defined above for certain image dimensionalities are set to zero. @@ -1818,20 +1818,20 @@ following two tables. === Cube Map Coordinate Transformation [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} s_{\textit{face}} & = \frac{1}{2} \times \frac{s_c}{|r_c|} + \frac{1}{2} \\ t_{\textit{face}} & = \frac{1}{2} \times \frac{t_c}{|r_c|} + \frac{1}{2} \\ \end{aligned} -++++++++++++++++++++++++ +++++ === Cube Map Derivative Transformation [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \frac{\partial{s_{\textit{face}}}}{\partial{x}} &= \frac{\partial}{\partial{x}} \left ( \frac{1}{2} \times \frac{s_{c}}{|r_{c}|} @@ -1848,10 +1848,10 @@ t_{\textit{face}} & = {\left ( r_{c} \right )^2} \right ) \end{aligned} -++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \frac{\partial{s_{\textit{face}}}}{\partial{y}} &= \frac{1}{2} \times @@ -1878,7 +1878,7 @@ t_{\textit{face}} & = {\left ( r_{c} \right )^2} \right ) \end{aligned} -++++++++++++++++++++++++ +++++ ifdef::editing-notes[] [NOTE] @@ -1955,7 +1955,7 @@ maximum scale factors. [eq]#f~x~# and [eq]#f~y~#, subject to the following constraints: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} & f_x \text{\ is\ continuous\ and\ monotonically\ increasing\ in\ each\ of\ } m_{ux}, @@ -1966,17 +1966,17 @@ maximum scale factors. m_{vy}, \text{\ and\ } m_{wy} \end{aligned} -++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \max(|m_{ux}|, |m_{vx}|, |m_{wx}|) \leq f_{x} \leq \sqrt{2} (|m_{ux}| + |m_{vx}| + |m_{wx}|) \\ \max(|m_{uy}|, |m_{vy}|, |m_{wy}|) \leq f_{y} \leq \sqrt{2} (|m_{uy}| + |m_{vy}| + |m_{wy}|) \end{aligned} -++++++++++++++++++++++++ +++++ ifdef::editing-notes[] @@ -2049,7 +2049,7 @@ An implementation may: use the value of [eq]#N# as an approximation of The LOD parameter [eq]#{lambda}# is computed as follows: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \lambda_{base}(x,y) & = \begin{cases} @@ -2065,12 +2065,12 @@ The LOD parameter [eq]#{lambda}# is computed as follows: \textit{undefined}, & lod_{min} > lod_{max} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ where: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} sampler.bias & = mipLodBias & \text{(from sampler descriptor)} \\ shaderOp.bias & = @@ -2088,7 +2088,7 @@ shaderOp.lod_{min} & = lod_{min} & = \max(sampler.lod_{min}, shaderOp.lod_{min}) \\ lod_{max} & = maxLod & \text{(from sampler descriptor)} \end{aligned} -++++++++++++++++++++++++ +++++ and [eq]#maxSamplerLodBias# is the value of the slink:VkPhysicalDeviceLimits feature <>. @@ -2102,7 +2102,7 @@ read from are determined by an image-level parameter [eq]#d~l~#, which is computed based on the LOD parameter, as follows: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} d_{l} = \begin{cases} @@ -2110,12 +2110,12 @@ d_{l} = d', & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ where: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} ifdef::VK_EXT_image_view_min_lod[] d' = max(level_{base} + \text{clamp}(\lambda, 0, q), minLod_{imageView}) @@ -2125,10 +2125,10 @@ d' = level_{base} + \text{clamp}(\lambda, 0, q) endif::VK_EXT_image_view_min_lod[] \end{aligned} -++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} nearest(d') & = \begin{cases} @@ -2138,13 +2138,13 @@ nearest(d') & = \text{alternative} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ and: ifdef::VK_EXT_image_view_min_lod[] [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} minLod_{imageView} & = \begin{cases} @@ -2154,16 +2154,17 @@ minLod_{imageView} & = level_{base} & = baseMipLevel \\ q & = levelCount - 1 \end{aligned} -++++++++++++++++++++++++ +++++ endif::VK_EXT_image_view_min_lod[] + ifndef::VK_EXT_image_view_min_lod[] [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} level_{base} & = baseMipLevel \\ q & = levelCount - 1 \end{aligned} -++++++++++++++++++++++++ +++++ endif::VK_EXT_image_view_min_lod[] pname:baseMipLevel and pname:levelCount are taken from the @@ -2180,13 +2181,13 @@ If the sampler's pname:mipmapMode is ename:VK_SAMPLER_MIPMAP_MODE_LINEAR, two neighboring levels are selected: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} d_{hi} & = \left\lfloor d_{l} \right\rfloor \\ d_{lo} & = min( d_{hi} + 1, level_{base} + q ) \\ \delta & = d_{l} - d_{hi} \end{aligned} -++++++++++++++++++++++++ +++++ [eq]#{delta}# is the fractional value, quantized to the number of <>, used for @@ -2204,7 +2205,7 @@ This transformation is performed once for each level used in [eq]#d~lo~#). [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} u(x,y) & = s(x,y) \times width_{scale} + \Delta_i\\ v(x,y) & = @@ -2224,7 +2225,7 @@ a(x,y) & = 0 & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ where: @@ -2269,7 +2270,7 @@ range of the image view, pname:baseArrayLayer is the first layer from the subresource range, and where: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \mathbin{RNE}(a) & = \begin{cases} @@ -2277,7 +2278,7 @@ subresource range, and where: \left \lfloor a + 0.5 \right \rfloor & \text{alternative} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ The sample index [eq]#n# is assigned the value 0. @@ -2285,13 +2286,13 @@ Nearest filtering (ename:VK_FILTER_NEAREST) computes the integer texel coordinates that the unnormalized coordinates lie within: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} i &= \left\lfloor u + shift \right\rfloor \\ j &= \left\lfloor v + shift \right\rfloor \\ k &= \left\lfloor w + shift \right\rfloor \end{aligned} -++++++++++++++++++++++++ +++++ where: {empty}:: [eq]#shift = 0.0# @@ -2311,7 +2312,7 @@ The integer texel coordinates are combinations of [eq]#i~0~# or [eq]#i~1~#, [eq]#{alpha}, {beta}#, and [eq]#{gamma}#. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} i_0 &= \left\lfloor u - shift \right\rfloor \\ i_1 &= i_0 + 1 \\ @@ -2320,16 +2321,16 @@ j_1 &= j_0 + 1 \\ k_0 &= \left\lfloor w - shift \right\rfloor \\ k_1 &= k_0 + 1 \end{aligned} -++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \alpha &= \mathbin{frac}\left(u - shift\right) \\[1em] \beta &= \mathbin{frac}\left(v - shift\right) \\[1em] \gamma &= \mathbin{frac}\left(w - shift\right) \end{aligned} -++++++++++++++++++++++++ +++++ where: @@ -2345,9 +2346,10 @@ endif::VK_NV_corner_sampled_image[] and where: [latexmath] -++++++++++++++++++++++++ +++++ \mathbin{frac}(x) = x - \left\lfloor x \right\rfloor -++++++++++++++++++++++++ +++++ + where the number of fraction bits retained is specified by sname:VkPhysicalDeviceLimits::pname:subTexelPrecisionBits. @@ -2366,50 +2368,48 @@ endif::VK_EXT_filter_cubic[] ifndef::VK_EXT_filter_cubic[] [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} i_{0} & = {\left \lfloor {u - \frac{3}{2}} \right \rfloor} & i_{1} & = i_{0} + 1 & i_{2} & = i_{1} + 1 & i_{3} & = i_{2} + 1 \\[1em] j_{0} & = {\left \lfloor {v - \frac{3}{2}} \right \rfloor} & j_{1} & = j_{0} + 1 & j_{2} & = j_{1} + 1 & j_{3} & = j_{2} + 1 \end{aligned} -++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} alpha &= \mathbin{frac}\left(u - \frac{1}{2}\right) \\[1em] \beta &= \mathbin{frac}\left(v - \frac{1}{2}\right) \end{aligned} -++++++++++++++++++++++++ - +++++ endif::VK_EXT_filter_cubic[] ifdef::VK_EXT_filter_cubic[] [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} i_{0} & = {\left \lfloor {u - \frac{3}{2}} \right \rfloor} & i_{1} & = i_{0} + 1 & i_{2} & = i_{1} + 1 & i_{3} & = i_{2} + 1 \\[1em] j_{0} & = {\left \lfloor {v - \frac{3}{2}} \right \rfloor} & j_{1} & = j_{0} + 1 & j_{2} & = j_{1} + 1 & j_{3} & = j_{2} + 1 \\[1em] k_{0} & = {\left \lfloor {w - \frac{3}{2}} \right \rfloor} & k_{1} & = k_{0} + 1 & k_{2} & = k_{1} + 1 & k_{3} & = k_{2} + 1 \end{aligned} -++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \alpha &= \mathbin{frac}\left(u - \frac{1}{2}\right) \\[1em] \beta &= \mathbin{frac}\left(v - \frac{1}{2}\right) \\[1em] \gamma &= \mathbin{frac}\left(w - \frac{1}{2}\right) \end{aligned} -++++++++++++++++++++++++ - +++++ endif::VK_EXT_filter_cubic[] where: [latexmath] -++++++++++++++++++++++++ +++++ \mathbin{frac}(x) = x - \left\lfloor x \right\rfloor -++++++++++++++++++++++++ +++++ where the number of fraction bits retained is specified by sname:VkPhysicalDeviceLimits::pname:subTexelPrecisionBits. @@ -2433,7 +2433,7 @@ If the code:Lod is provided then it must: be an integer. The image level selected is: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} d & = level_{base} + \begin{cases} @@ -2441,7 +2441,7 @@ d & = level_{base} + 0 & \text{otherwise} \end{cases} \\ \end{aligned} -++++++++++++++++++++++++ +++++ If [eq]#d# does not lie in the range [eq]#[pname:baseMipLevel, pname:baseMipLevel {plus} pname:levelCount)# @@ -2478,7 +2478,7 @@ The first integer texel coordinate i is transformed based on the pname:addressModeU parameter of the sampler. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} i &= \begin{cases} @@ -2490,12 +2490,12 @@ i &= \mathbin{clamp}(\mathbin{mirror}(i),0,size-1) & \text{for mirror clamp to edge} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ where: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} & \mathbin{mirror}(n) = \begin{cases} @@ -2503,7 +2503,7 @@ where: -(1+n) & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ [eq]#j# (for 2D and Cube image) and [eq]#k# (for 3D image) are similarly transformed based on the pname:addressModeV and pname:addressModeW @@ -2527,32 +2527,32 @@ If the operation does not use the code:ConstOffsets image operand then the four texels form the 2 {times} 2 rectangle used for texture filtering: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau[R] &= \tau_{i0j1}[level_{base}][comp] \\ \tau[G] &= \tau_{i1j1}[level_{base}][comp] \\ \tau[B] &= \tau_{i1j0}[level_{base}][comp] \\ \tau[A] &= \tau_{i0j0}[level_{base}][comp] \end{aligned} -++++++++++++++++++++++++ +++++ If the operation does use the code:ConstOffsets image operand then the offsets allow a custom filter to be defined: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau[R] &= \tau_{i0j0 + \Delta_0}[level_{base}][comp] \\ \tau[G] &= \tau_{i0j0 + \Delta_1}[level_{base}][comp] \\ \tau[B] &= \tau_{i0j0 + \Delta_2}[level_{base}][comp] \\ \tau[A] &= \tau_{i0j0 + \Delta_3}[level_{base}][comp] \end{aligned} -++++++++++++++++++++++++ +++++ where: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau[level_{base}][comp] &= \begin{cases} @@ -2563,7 +2563,7 @@ where: \end{cases}\\ comp & \,\text{from SPIR-V operand Component} \end{aligned} -++++++++++++++++++++++++ +++++ ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] code:OpImage*Gather must: not be used on a sampled image with @@ -2603,7 +2603,7 @@ using the [eq]#(i, j, k)# texel coordinates, with all texels taken from layer l. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau[level] &= \begin{cases} @@ -2612,7 +2612,7 @@ layer l. \tau_{i}[level], & \text{for 1D image} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ [[textures-texel-linear-filtering]] @@ -2625,7 +2625,7 @@ The linear weights are derived from the fractions computed earlier: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} w_{i_0} &= (1-\alpha) \\ w_{i_1} &= (\alpha) \\ @@ -2634,7 +2634,7 @@ w_{j_1} &= (\beta) \\ w_{k_0} &= (1-\gamma) \\ w_{k_1} &= (\gamma) \end{aligned} -++++++++++++++++++++++++ +++++ ifndef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[] The values of multiple texels, together with their weights, are combined @@ -2655,13 +2655,13 @@ computed: endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[] [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{3D} &= \sum_{k=k_0}^{k_1}\sum_{j=j_0}^{j_1}\sum_{i=i_0}^{i_1}(w_{i})(w_{j})(w_{k})\tau_{ijk} \\ \tau_{2D} &= \sum_{j=j_0}^{j_1}\sum_{i=i_0}^{i_1}(w_{i})(w_{j})\tau_{ij} \\ \tau_{1D} &= \sum_{i=i_0}^{i_1}(w_{i})\tau_{i} \end{aligned} -++++++++++++++++++++++++ +++++ ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[] However, if the reduction mode is ename:VK_SAMPLER_REDUCTION_MODE_MIN or @@ -2699,7 +2699,7 @@ are derived from the fractions computed earlier. ifndef::VK_EXT_filter_cubic[] [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \begin{bmatrix} w_{i_0}\phantom{,} w_{i_1}\phantom{,} w_{i_2}\phantom{,} w_{i_3} @@ -2729,24 +2729,24 @@ w_{j_0}\phantom{,} w_{j_1}\phantom{,} w_{j_2}\phantom{,} w_{j_3} -1 & \phantom{-}3 & -3 & \phantom{-}1 \end{bmatrix} \end{aligned} -++++++++++++++++++++++++ +++++ The values of multiple texels, together with their weights, are combined using a weighted average to produce a filtered value: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{2D} &= \sum_{j=j_0}^{j_3}\sum_{i=i_0}^{i_3}(w_{i})(w_{j})\tau_{ij} \\ \tau_{1D} &= \sum_{i=i_0}^{i_3}(w_{i})\tau_{i} \end{aligned} -++++++++++++++++++++++++ +++++ endif::VK_EXT_filter_cubic[] ifdef::VK_EXT_filter_cubic[] [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \begin{bmatrix} w_{i_0}\phantom{,} w_{i_1}\phantom{,} w_{i_2}\phantom{,} w_{i_3} @@ -2790,7 +2790,7 @@ w_{k_0}\phantom{,} w_{k_1}\phantom{,} w_{k_2}\phantom{,} w_{k_3} -1 & \phantom{-}3 & -3 & \phantom{-}1 \end{bmatrix} \end{aligned} -++++++++++++++++++++++++ +++++ ifdef::VK_QCOM_filter_cubic_weights[] Zero Tangent Cardinal weights specified by @@ -2798,7 +2798,7 @@ ename:VK_CUBIC_FILTER_WEIGHTS_ZERO_TANGENT_CARDINAL_QCOM are derived from the fractions computed earlier. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \begin{bmatrix} w_{i_0}\phantom{,} w_{i_1}\phantom{,} w_{i_2}\phantom{,} w_{i_3} @@ -2842,13 +2842,13 @@ w_{k_0}\phantom{,} w_{k_1}\phantom{,} w_{k_2}\phantom{,} w_{k_3} -2 & \phantom{-}2 & -2 & \phantom{-}1 \end{bmatrix} \end{aligned} -++++++++++++++++++++++++ +++++ B-Spline weights specified by ename:VK_CUBIC_FILTER_WEIGHTS_B_SPLINE_QCOM are derived from the fractions computed earlier. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \begin{bmatrix} w_{i_0}\phantom{,} w_{i_1}\phantom{,} w_{i_2}\phantom{,} w_{i_3} @@ -2892,14 +2892,14 @@ w_{k_0}\phantom{,} w_{k_1}\phantom{,} w_{k_2}\phantom{,} w_{k_3} -1 & \phantom{-}3 & -3 & \phantom{-}1 \end{bmatrix} \end{aligned} -++++++++++++++++++++++++ +++++ Mitchell-Netravali weights specified by ename:VK_CUBIC_FILTER_WEIGHTS_MITCHELL_NETRAVALI_QCOM are derived from the fractions computed earlier. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \begin{bmatrix} w_{i_0}\phantom{,} w_{i_1}\phantom{,} w_{i_2}\phantom{,} w_{i_3} @@ -2943,7 +2943,7 @@ w_{k_0}\phantom{,} w_{k_1}\phantom{,} w_{k_2}\phantom{,} w_{k_3} -7 & \phantom{-}21 & -21 & \phantom{-}7 \end{bmatrix} \end{aligned} -++++++++++++++++++++++++ +++++ endif::VK_QCOM_filter_cubic_weights[] @@ -2963,13 +2963,13 @@ endif::VK_QCOM_filter_cubic_clamp[] , a weighted average is computed: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{3D} &= \sum_{k=j_0}^{k_3}\sum_{j=j_0}^{j_3}\sum_{i=i_0}^{i_3}(w_{i})(w_{j})(w_{k})\tau_{ijk} \\ \tau_{2D} &= \sum_{j=j_0}^{j_3}\sum_{i=i_0}^{i_3}(w_{i})(w_{j})\tau_{ij} \\ \tau_{1D} &= \sum_{i=i_0}^{i_3}(w_{i})\tau_{i} \end{aligned} -++++++++++++++++++++++++ +++++ ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[] However, if the reduction mode is ename:VK_SAMPLER_REDUCTION_MODE_MIN or @@ -3008,12 +3008,12 @@ weights. The linear weights are derived from the fraction computed earlier: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} w_{hi} &= (1-\delta) \\ w_{lo} &= (\delta) \\ \end{aligned} -++++++++++++++++++++++++ +++++ ifndef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[] The values of multiple mipmap levels together with their linear weights, are @@ -3033,11 +3033,11 @@ computed: endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[] [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau &= (w_{hi})\tau[hi]+(w_{lo})\tau[lo] \end{aligned} -++++++++++++++++++++++++ +++++ ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[] However, if the reduction mode is ename:VK_SAMPLER_REDUCTION_MODE_MIN or @@ -3088,7 +3088,7 @@ The sum [eq]#{tau}~2Daniso~# is defined using the single isotropic [eq]#{tau}~2D~(u,v)# at level [eq]#d#. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{2Daniso} & = \frac{1}{N}\sum_{i=1}^{N} @@ -3105,7 +3105,7 @@ The sum [eq]#{tau}~2Daniso~# is defined using the single isotropic \right )}, & \text{when}\ \rho_{y} \geq \rho_{x} \end{aligned} -++++++++++++++++++++++++ +++++ ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[] When slink:VkSamplerReductionModeCreateInfo::pname:reductionMode is set to @@ -3198,11 +3198,11 @@ In the mask, the texel group with local group coordinates latexmath:[(lgx,lgy)] is considered covered if and only if [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} 0 \neq ((mask.x + (mask.y << 32)) \text{ \& } (1 << (lgy \times 8 + lgx))) \end{aligned} -+++++++++++++++++++ +++++ where: @@ -3213,7 +3213,7 @@ The local group with coordinates latexmath:[(lgx,lgy)] in the mask is considered covered if and only if the texel filtering operation would access one or more texels latexmath:[\tau_{ij}] in the returned mip level where: [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} i0 & = \begin{cases} @@ -3228,7 +3228,7 @@ j0 & = \end{cases} \\ j1 & = j0 + gran.y - 1 \end{aligned} -+++++++++++++++++++ +++++ and * latexmath:[i0 \leq i \leq i1] and latexmath:[j0 \leq j \leq j1]; @@ -3243,12 +3243,14 @@ by code:OpImageSampleFootprintNV indicates whether each texel group in a accessed during texel filtering. In the mask, the texel group with local group coordinates latexmath:[(lgx,lgy,lgz)], is considered covered if and only if: + [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} 0 \neq ((mask.x + (mask.y << 32)) \text{ \& } (1 << (lgz \times 16 + lgy \times 4 + lgx))) \end{aligned} -+++++++++++++++++++ +++++ + where: * latexmath:[0 \leq lgx < 4], latexmath:[0 \leq lgy < 4], and latexmath:[0 @@ -3258,8 +3260,9 @@ where: The local group with coordinates latexmath:[(lgx,lgy,lgz)] in the mask is considered covered if and only if the texel filtering operation would access one or more texels latexmath:[\tau_{ijk}] in the returned mip level where: + [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} i0 & = \begin{cases} @@ -3280,7 +3283,8 @@ k0 & = \end{cases} \\ k1 & = k0 + gran.z - 1 \end{aligned} -+++++++++++++++++++ +++++ + and * latexmath:[i0 \leq i \leq i1], latexmath:[j0 \leq j \leq j1], @@ -3392,7 +3396,7 @@ The width and height of the view's subresource range must: be less than or equal to slink:VkPhysicalDeviceImageProcessingPropertiesQCOM::pname:maxWeightFilterDimension. The layers are stored in horizontal phase major order. -Expressed as a formula, the layer index for a each filter phase is computed +Expressed as a formula, the layer index for each filter phase is computed as: [source,c] @@ -3491,12 +3495,13 @@ The 2D unnormalized texel coordinates latexmath:[(u,v)] are transformed by latexmath:[filterCenter] to specify coordinates latexmath:[i_{0}, j_{0}]. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} i_{0} &= \left\lfloor u - filterCenter_{x} \right\rfloor \\[1em] j_{0} &= \left\lfloor v - filterCenter_{y} \right\rfloor \end{aligned} -++++++++++++++++++++++++ +++++ + where latexmath:[filterCenter] is specified by slink:VkImageViewSampleWeightCreateInfoQCOM::pname:filterCenter. @@ -3516,14 +3521,14 @@ filterHeight)] of pairs of latexmath:[(i,j)] and latexmath:[(k,l)] coordinates respectively. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \{i_q\}_{q=0}^{q=filterWidth-1} \quad &= i_{0} + q \\[1em] \{j_q\}_{q=0}^{q=filterHeight-1} \quad &= j_{0} + q \\[1em] \{k_q\}_{q=0}^{q=filterWidth-1} \quad &= q \\[1em] \{l_q\}_{q=0}^{q=filterHeight-1} \quad &= q \end{aligned} -++++++++++++++++++++++++ +++++ where latexmath:[filterWidth] and latexmath:[filterHeight] are specified by slink:VkImageViewSampleWeightCreateInfoQCOM::pname:filterSize. @@ -3540,14 +3545,14 @@ The phase index latexmath:[\psi] is computed from the fraction bits of the unnormalized 2D texel coordinates: [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} phaseCount_{h} = phaseCount_{v} &= \sqrt{numPhases} \\[1em] hPhase &= \left\lfloor\mathbin{frac}\left( u \right) \times phaseCount_{h} \right\rfloor \\[1em] vPhase &= \left\lfloor\mathbin{frac}\left( v \right) \times phaseCount_{v} \right\rfloor \\[1em] \psi &= \left(vPhase \times phaseCount_{h}\right) + hPhase \end{aligned} -++++++++++++++++++++++++ +++++ where the number of fraction bits retained is latexmath:[\mathbin{log2}\left( numPhases \right)] specified by @@ -3561,7 +3566,7 @@ image latexmath:[w(k,l,\psi)] . [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} w(k,l,\psi) &= \begin{cases} @@ -3569,7 +3574,7 @@ w(k,l,\psi) &= weight_{h} \times weight_{v} & \text{for 1D array view (separable filter) } \\ \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ If latexmath:[w] is a 2D array view, then non-separable filtering is specified, and integer coordinates latexmath:[(k,l)] are used to select @@ -3581,7 +3586,7 @@ latexmath:[(weight_{h})] and vertical weight latexmath:[(weight_{v})] texels from layer 0 and layer 1 of latexmath:[(w)] respectively. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} k_{packed} &= \left(phaseCount_{h} \times 4 \times \left\lfloor k / 4 \right\rfloor\right) + \left(hPhase \times 4\right) + \left(k \mathbin{\%} 4\right) \\[1em] l_{packed}& = \left(phaseCount_{v} \times 4 \times \left\lfloor l / 4 \right\rfloor\right) + \left(vPhase \times 4\right) + \left(l \mathbin{\%} 4\right) \\[1em] @@ -3589,20 +3594,19 @@ weight_{h} &= w_{k_{packed}}[0] & \text{(horizontal weights packed in layer 0)} weight_{v} &= w_{l_{packed}}[1] & \text{(vertical weights packed in layer 1)} \end{aligned} -++++++++++++++++++++++++ +++++ Where latexmath:[\mathbin{\%}] refers to the integer modulo operator. The values of multiple texels, together with their weights, are combined to produce a filtered value. - [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{weightSampling} &= \sum_{{j=j_0} \atop {l=l_0}}^{j_{blockHeight-1} \atop {l_{blockHeight-1}}}\quad \sum_{{i=i_0}\atop {k=k_0}}^{i_{blockWidth-1} \atop {k_{blockWidth-1}}}w(k,l,\psi)\tau_{ij} \\ \end{aligned} -++++++++++++++++++++++++ +++++ When slink:VkSamplerReductionModeCreateInfo::pname:reductionMode is set to ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE, the above summation is @@ -3695,14 +3699,14 @@ latexmath:[(i_{0}, j_{0})] and the reference block latexmath:[(k_{0}, l_{0})]. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} i_{0} &= u \\[1em] j_{0} &= v \\[1em] k_{0} &= s \\[1em] l_{0} &= t \end{aligned} -++++++++++++++++++++++++ +++++ For the target block, a set of neighboring integer texel coordinates are generated. @@ -3712,12 +3716,12 @@ latexmath:[j_{blockHeight-1}]. The set is of size latexmath:[blockWidth \times blockHeight]. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \{i_q\}_{q=0}^{q=blockWidth-1} \quad &= i_{0} + q \\[1em] \{j_q\}_{q=0}^{q=blockHeight-1} \quad &= j_{0} + q \end{aligned} -++++++++++++++++++++++++ +++++ where latexmath:[blockWidth] and latexmath:[blockHeight] is specified by the code:blockSize operand. @@ -3731,12 +3735,12 @@ Similarly for the reference block, a set of neighboring integer texel coordinates are generated. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \{k_q\}_{q=0}^{q=blockWidth-1} \quad &= k_{0} + q \\[1em] \{l_q\}_{q=0}^{q=blockHeight-1} \quad &= l_{0} + q \end{aligned} -++++++++++++++++++++++++ +++++ Each reference texel coordinate latexmath:[(k,l)] in the set must: not fail <>, @@ -4032,7 +4036,7 @@ Texels partially covered by the box will have will have a reduced weights proportional to the coverage. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} horizWeight_{i} &= \begin{cases} @@ -4041,10 +4045,10 @@ horizWeight_{i} &= \left(1\right), & \text{otherwise} \\ \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} vertWeight_{j} &= \begin{cases} @@ -4053,18 +4057,18 @@ vertWeight_{j} &= \left(1\right), & \text{otherwise} \\ \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ The values of multiple texels, together with their horizontal and vertical weights, are combined to produce a box filtered value. [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{boxFilter} &= \frac{1}{boxHeight \times boxWidth} \sum_{j=j_0}^{j_{filterHeight-1}}\quad\sum_{i=i_0}^{i_{filterWidth-1}}(horizWeight_i)(vertWeight_j)\tau_{ij} \\ \end{aligned} -++++++++++++++++++++++++ +++++ When slink:VkSamplerReductionModeCreateInfo::pname:reductionMode is set to ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE, the above summation is @@ -4146,6 +4150,6 @@ ifdef::VK_EXT_robustness2[Otherwise, the] ifndef::VK_EXT_robustness2[The] steps described in this chapter are performed as if for code:OpImageSampleImplicitLod, up to <>. -The return value is the vector [eq]#({lambda}', d~l~)#. +The return value is the vector [eq]#({lambda}', d~l~ - level~base~)#. These values may: be subject to implementation-specific maxima and minima for very large, out-of-range values. diff --git a/chapters/vertexpostproc.adoc b/chapters/vertexpostproc.adoc index d54eef056..0e67dee68 100644 --- a/chapters/vertexpostproc.adoc +++ b/chapters/vertexpostproc.adoc @@ -767,13 +767,13 @@ _clip volume_. In clip coordinates, the _view volume_ is defined by: [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{array}{c} -w_c \leq x_c \leq w_c \\ -w_c \leq y_c \leq w_c \\ z_m \leq z_c \leq w_c \end{array} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where ifdef::VK_EXT_depth_clip_control[] @@ -1147,18 +1147,19 @@ coordinates into _framebuffer coordinates_. If a vertex in clip coordinates has a position given by [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \left(\begin{array}{c} x_c \\ y_c \\ z_c \\ w_c \end{array}\right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ then the vertex's normalized device coordinates are + [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \left( \begin{array}{c} x_d \\ @@ -1173,7 +1174,7 @@ then the vertex's normalized device coordinates are \frac{z_c}{w_c} \end{array} \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ ifdef::VK_QCOM_render_pass_transform[] @@ -1190,7 +1191,7 @@ primitives for all subpasses of the render pass. The transformed vertex in clip coordinates has a position given by [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \left( \begin{array}{c} x_{c_{trans}} \\ @@ -1205,7 +1206,7 @@ The transformed vertex in clip coordinates has a position given by z_c \end{array} \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ where @@ -1221,7 +1222,7 @@ where The transformed vertex's normalized device coordinates are [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \left( \begin{array}{c} x_d \\ @@ -1236,8 +1237,7 @@ The transformed vertex's normalized device coordinates are \frac{z_{c_{trans}}}{w_c} \end{array} \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - +++++ When render pass transform is enabled for a render pass instance, the following additional features are enabled: diff --git a/chapters/video/av1_decode.adoc b/chapters/video/av1_decode.adoc index bcfd0b873..5ec1e6fc7 100644 --- a/chapters/video/av1_decode.adoc +++ b/chapters/video/av1_decode.adoc @@ -102,7 +102,7 @@ Accordingly, the complete image subregion of a operations using an <> is defined as the set of texels within the coordinate range: - {empty}:: [eq]#([0,pname:endX),[0,pname:endY))# + {empty}:: [eq]#([0,pname:endX), [0,pname:endY))# Where: @@ -412,7 +412,7 @@ pname:pStdPictureInfo are interpreted as follows: code:LoopRestorationSize[code:plane] as defined in section 6.10.15 of the <>. ** all other members of code:StdVideoAV1LoopRestoration are defined as in - section 6.10.15 of the <>; + section 6.10.15 of the <>; * the members of the code:StdVideoAV1GlobalMotion structure provided in code:global_motion are interpreted as defined in section 7.10 of the <>; diff --git a/chapters/video/decode.adoc b/chapters/video/decode.adoc index 4aebbb973..5b7aabb81 100644 --- a/chapters/video/decode.adoc +++ b/chapters/video/decode.adoc @@ -556,9 +556,9 @@ endif::VK_KHR_video_decode_av1[] + then the video picture resources specified by - pname:pDecodeInfo->dstPictureResource and - pname:pDecodeInfo->pSetupReferenceSlot->pPictureResource must: - <> +pname:pDecodeInfo->dstPictureResource and +pname:pDecodeInfo->pSetupReferenceSlot->pPictureResource must: +<> * [[VUID-vkCmdDecodeVideoKHR-pDecodeInfo-07142]] pname:pDecodeInfo->dstPictureResource.imageViewBinding must: be <> with the video profile the diff --git a/chapters/video/h264_decode.adoc b/chapters/video/h264_decode.adoc index 3b44eacda..08a4a9be2 100644 --- a/chapters/video/h264_decode.adoc +++ b/chapters/video/h264_decode.adoc @@ -122,7 +122,7 @@ operations using an <> for the video picture resource is defined as the set of texels within the coordinate range: - {empty}:: [eq]#([pname:startX,pname:endX),[pname:startY,pname:endY))# + {empty}:: [eq]#([pname:startX,pname:endX), [pname:startY,pname:endY))# Where: diff --git a/chapters/video/h264_encode.adoc b/chapters/video/h264_encode.adoc index 87b6ded4f..19642a2c5 100644 --- a/chapters/video/h264_encode.adoc +++ b/chapters/video/h264_encode.adoc @@ -40,15 +40,14 @@ section 8 of the <> as follows: picture>> and any <>. * The encoded bitstream data is written to the destination video bitstream - buffer range as defined in the - <> section. + buffer range as defined in the <> section. * Picture data in the <> - corresponding to the used <>, <>, and - optional <> is accessed as - defined in the <> section. + corresponding to the used <>, + <>, and optional + <> is accessed as defined + in the <> section. * The decision on <> is made according to the parameters specified in the <>. @@ -137,7 +136,7 @@ input picture>>, <>, or operations using an <> is defined as the set of texels within the coordinate range: - {empty}:: [eq]#([0,pname:endX),[0,pname:endY))# + {empty}:: [eq]#([0,pname:endX), [0,pname:endY))# Where: diff --git a/chapters/video/h265_decode.adoc b/chapters/video/h265_decode.adoc index fee790d90..c5da2b615 100644 --- a/chapters/video/h265_decode.adoc +++ b/chapters/video/h265_decode.adoc @@ -93,7 +93,7 @@ Accordingly, the complete image subregion of a operations using an <> is defined as the set of texels within the coordinate range: - {empty}:: [eq]#([0,pname:endX),[0,pname:endY))# + {empty}:: [eq]#([0,pname:endX), [0,pname:endY))# Where: diff --git a/chapters/video/h265_encode.adoc b/chapters/video/h265_encode.adoc index d5bd4c8be..5b426d32c 100644 --- a/chapters/video/h265_encode.adoc +++ b/chapters/video/h265_encode.adoc @@ -43,15 +43,14 @@ section 8 of the <> as follows: picture>> and any <>. * The encoded bitstream data is written to the destination video bitstream - buffer range as defined in the - <> section. + buffer range as defined in the <> section. * Picture data in the <> - corresponding to the used <>, <>, and - optional <> is accessed as - defined in the <> section. + corresponding to the used <>, + <>, and optional + <> is accessed as defined + in the <> section. * The decision on <> is made according to the parameters specified in the <>. @@ -133,7 +132,7 @@ input picture>>, <>, or operations using an <> is defined as the set of texels within the coordinate range: - {empty}:: [eq]#([0,pname:endX),[0,pname:endY))# + {empty}:: [eq]#([0,pname:endX), [0,pname:endY))# Where: diff --git a/config/CI/codespell-vulkan b/config/CI/codespell-vulkan new file mode 100644 index 000000000..acd6a866a --- /dev/null +++ b/config/CI/codespell-vulkan @@ -0,0 +1,34 @@ +blacklist->blocklist, deny, drop, exempt, inclusive alternatives +whitelist->allowlist, allow, accept, inclusive alternatives +crazy->impractical, strange, unusual, inclusive alternatives +insane->irrational, unreasonable, inclusive alternatives +cripple->break, damage, harm, impair, inclusive alternatives +dummy->base, fake, mock, no-op, placeholder, stub, unused, inclusive alternatives +first-class->built-in, top-level, inclusive alternatives +grandfathered->exempt, legacy, inclusive alternatives +gals->folks, they, inclusive alternatives +guys->folks, they, inclusive alternatives +man-in-the-middle->interceptor, on-path, inclusive alternatives +master->active, controller, leader, parent, primary, writer, inclusive alternatives +slave->standby, actor, follower, child, replica, secondary, reader, inclusive alternatives +redline->assess, appraise, evaluate, grade, review, inclusive alternatives +sanity->check, confidence, inclusive alternatives +homogenous->homogeneous, Vulkan style guide preferred spelling +heterogenous->heterogeneous, Vulkan style guide preferred spelling +implementer->implementor, Vulkan style guide preferred spelling +re-use->reuse,Vulkan style guide preferred orthography +run time->runtime,Vulkan style guide preferred orthography +run-time->runtime,Vulkan style guide preferred orthography +bitplane->bit plane,Vulkan style guide preferred orthography +closest-hit->closest hit,Vulkan style guide preferred orthography +compile-time->compile time,Vulkan style guide preferred orthography +cubemap->cube map,Vulkan style guide preferred orthography +doublebuffer->double buffer,Vulkan style guide preferred orthography +entry-point->entry point,Vulkan style guide preferred orthography +entrypoint->entry point,Vulkan style guide preferred orthography +flatshading->flat shading,Vulkan style guide preferred orthography +level-of-detail->LOD,Vulkan style guide preferred orthography +miplayer->mip layer,Vulkan style guide preferred orthography +mipsize->mip size,Vulkan style guide preferred orthography +miptail->mip tail,Vulkan style guide preferred orthography +raytracing->ray tracing,Vulkan style guide preferred orthography diff --git a/config/CI/codespellrc b/config/CI/codespellrc index c9d340405..551943eae 100644 --- a/config/CI/codespellrc +++ b/config/CI/codespellrc @@ -1,7 +1,8 @@ # Copyright 2022-2024 The Khronos Group Inc. # SPDX-License-Identifier: CC-BY-4.0 [codespell] - builtin = en-GB_to_en-US + builtin = clear,rare,en-GB_to_en-US + dictionary = config/CI/codespell-vulkan,- ignore-words = config/CI/codespell-allowed # Files to skip ## Output files @@ -12,8 +13,9 @@ ## ./gen/*,./new/*,./old/*,./oldGen/*, ## Repository metadata ## .git,.github,LICENSES,NOTES*, -## Files that intentionally or unavoidably fail -## ./build_tests/*/*,./build_tests/README.adoc,./scripts/reflow-tests/*,./chapters/video/h26[45]_encode.adoc +## Files that intentionally or unavoidably fail (waiting for ability to use +## codespell inline directives in asciidoc in some cases) +## ./build_tests/*/*,./build_tests/README.adoc,./scripts/reflow-tests/*,vkspec.adoc,./chapters/video/h26[45]_encode.adoc,./chapters/VK_EXT_acquire_drm_display/acquire_drm_display.adoc,./config/CI/writing,./style/writing.adoc ## Misc. other files ## rouge-extend-css.rb,sample_count*.svg - skip=#*,ERRS*,*.html,*.js,*.pdf,./antora*/*,asciidoctor-chunker.js,katex,lunr.js,./node_modules/*,./gen/*,./new/*,./old/*,./oldGen/*,.git,.github,LICENSES,NOTES*,./build_tests/*/*,./build_tests/README.adoc,./scripts/reflow-tests/*,./chapters/video/h264_encode.adoc,./chapters/video/h265_encode.adoc,rouge-extend-css.rb,sample_count*.svg + skip=#*,ERRS*,*.html,*.js,*.pdf,./antora*/*,asciidoctor-chunker.js,katex,lunr.js,./node_modules/*,./gen/*,./new/*,./old/*,./oldGen/*,.git,.github,LICENSES,NOTES*,./build_tests/*/*,./build_tests/README.adoc,./scripts/reflow-tests/*,vkspec.adoc,./chapters/video/h264_encode.adoc,./chapters/video/h265_encode.adoc,./chapters/VK_EXT_acquire_drm_display/acquire_drm_display.adoc,./config/CI/writing,./style/writing.adoc,rouge-extend-css.rb,sample_count*.svg diff --git a/config/CI/custom-macros b/config/CI/custom-macros new file mode 100644 index 000000000..400bc4a27 --- /dev/null +++ b/config/CI/custom-macros @@ -0,0 +1,9 @@ +(^|[^-_.&:<>\[[:alnum:]])[defst]link:[^-_.\[[:alnum:]] +(^|[^-_.&:<>\[[:alnum:]])[defpst]name:[^-_.\[[:alnum:]] +(^|[^-_.&:<>\[[:alnum:]])[efps]text:[^-_.\[[:alnum:]] +(^|[^-_.&:<>\[[:alnum:]])(basetype|code):[^-_.\[[:alnum:]] +(^|[^-_.&:<>\[[:alnum:]])apiext:[^-_.\[[:alnum:]] +(^|[^-_.&:<>\[[:alnum:]])reflink:[^-_.\[[:alnum:]] +(^|[^-_.&:<>\[[:alnum:]])(can|cannot|may|must|optional|optionally|required|should|undefined):($|[^-_.\[[:alnum:]]) +(^|[^-_.&:<>\[[:alnum:]])(attr|tag):[^-_.\[[:alnum:]] + diff --git a/config/CI/writing b/config/CI/writing index f08924153..77993f844 100644 --- a/config/CI/writing +++ b/config/CI/writing @@ -5,6 +5,6 @@ pname:pNext-chain pname:pNext is `NULL` or a pointer to an extension-specific structure. pname:p[A-Z][[:alnum:]]+ is an array of present in.*the pname:pNext chain -(^|[^-_.&:<>\[[:alnum:]])(Github|[Aa]ny given element|[Bb]itplane|[Cc]olorspace|[Cc]olour|[Cc]ompile-time|[Cc]ubemap|[Dd]oublebuffer)[^-_.\[[:alnum:]] -(^|[^-_.&:<>\[[:alnum:]])([Aa]ny hit|[Aa]pp |[Cc]losest-hit|[Ee]ntry-point|[Ee]ntrypoint|[Ff]latshading|[Ff]loating [Pp]oint|[Gg]eneral purpose|[Ii]mplementation dependent|is an optional pointer|[Ll]evel [Oo]f [Dd]etail|[Ll]evel-of-[Dd]etail|lod)[^-_.\[[:alnum:]] -(^|[^-_.&:<>\[[:alnum:]])([Mm]iplayer|[Mm]iplevel|[Mm]ipsize|[Mm]iptail|points to|[Rr]enderpass|[Rr]e-use|[Ss]ide-effect|[Ss]ignalled|[Ss]wap chain|[Tt]esselation|[Uu]se-case)[^-_.\[[:alnum:]] +(^|[^-_.&:<>\[[:alnum:]])(Github|[Aa]ny given element|[Cc]olorspace)($|[^-_.\[[:alnum:]]) +(^|[^-_.&:<>\[[:alnum:]])([Aa]ny hit|[Aa]pp |[Ff]loating [Pp]oint|[Gg]eneral purpose|[Ii]mplementation dependent|is an optional pointer|[Ll]evel [Oo]f [Dd]etail|lod)($|[^-_.\[[:alnum:]]) +(^|[^-_.&:<>\[[:alnum:]])([Mm]iplevel|points to|[Rr]enderpass|[Rr]un time|[Ss]ide-effect|[Ss]ignalled|[Ss]wap chain|[Tt]esselation|[Uu]se-case)($|[^-_.\[[:alnum:]]) diff --git a/config/README.adoc b/config/README.adoc index 410a526c6..877f782e5 100644 --- a/config/README.adoc +++ b/config/README.adoc @@ -52,12 +52,21 @@ briefly below. * `spec-macros.rb` - custom asciidoctor macros used in spec markup * `open_listing_block.rb` - allow '----' as a nested open block delimiter when tagged by '[open]' * `vuid-expander.rb` - add anchors to valid usage ID tags -* `vu-to-json.rb` - extract valid usage statements to JSON as part of a dummy spec build +* `vu-to-json.rb` - extract valid usage statements to JSON as part of a spec build == CI support files -These files are auxiliary data supplied to CI scripts +These files are auxiliary data supplied to CI scripts and tools. +* CI/codespell-allowed - words detected by codespell which are allowed in + our documents for various reasons +* CI/codespellrc - codespell configuration file * CI/contractions - disallowed contractions * CI/contractions-allowed - regular expressions matching filenames allowed to have contractions +* CI/custom-macros - regular expressions matching our custom macros, which + are not allowed in non-specification markup that does not use those macros + when rendered on e.g. GitHub. +* CI/txt-files-allowed - regular expressions matching externally sourced + directories containing, or filenames allowed to end in '.txt'. +* CI/writing - checks for some of the writing guidelines in the style guide. diff --git a/config/mathtest.adoc b/config/mathtest.adoc index aa06f854f..03b2e04df 100644 --- a/config/mathtest.adoc +++ b/config/mathtest.adoc @@ -1,28 +1,38 @@ // Copyright 2015-2024 The Khronos Group Inc. -// // SPDX-License-Identifier: Apache-2.0 = Math Test -This file (vkmath.adoc) contains all the latexmath blocks and inlines in the -Vulkan spec and style guide, so we can see how they are rendered with -different methods and output formats. +This file (`config/mathtest.adoc`) contains most of the latexmath blocks and +inlines in the Vulkan spec and style guide, so we can see how they are +rendered with different methods and output formats. + +// To render this using the spec build toolchain, change +// :test: 0 +// to +// :test: 1 +// in vkspec.adoc, then make sure that +// include::{config}/mathtest.adoc[] +// is included just after the +// // Include or insert trivial test markup here ... +// comment and rebuild the spec. + == File chapters/fundamentals.adoc === latexmath block 1 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = { c \over { 2^b - 1 } } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 2 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = \max\left( {c \over {2^{b-1} - 1}}, -1.0 \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ == File chapters/interfaces.adoc @@ -39,39 +49,39 @@ latexmath:[\frac{1}{w}] === latexmath block 3 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ s = {1 \over 2} + { \left( x_p - x_f \right) \over \text{size} } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ t = {1 \over 2} + { \left( y_p - y_f \right) \over \text{size} } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 4 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ t = {{( \mathbf{p}_r - \mathbf{p}_a ) \cdot ( \mathbf{p}_b - \mathbf{p}_a )} \over {\| \mathbf{p}_b - \mathbf{p}_a \|^2 }} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 5 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = {{ (1-t) {f_a / w_a} + t { f_b / w_b} } \over {(1-t) / w_a + t / w_b }} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 6 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ a = -{1 \over 2}\sum_{i=0}^{n-1} x_f^i y_f^{i \oplus 1} - x_f^{i \oplus 1} y_f^i -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath inline 3 @@ -80,35 +90,35 @@ latexmath:[x_f^i] and latexmath:[y_f^i] === latexmath block 7 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ a = {{\mathrm{A}(p p_b p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad b = {{\mathrm{A}(p p_a p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad c = {{\mathrm{A}(p p_a p_b)} \over {\mathrm{A}(p_a p_b p_c)}}, -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 8 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = { a {f_a / w_a} + b {f_b / w_b} + c {f_c / w_c} } \over { {a / w_a} + {b / w_b} + {c / w_c} } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ == File chapters/fundamentals.adoc === latexmath block 9 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = { c \over { 2^b - 1 } } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 10 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = \max\left( {c \over {2^{b-1} - 1}}, -1.0 \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ == File chapters/interfaces.adoc @@ -125,38 +135,38 @@ latexmath:[\frac{1}{w}]. === latexmath block 11 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ s = {1 \over 2} + { \left( x_p - x_f \right) \over \text{size} } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ t = {1 \over 2} + { \left( y_p - y_f \right) \over \text{size} } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 12 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ t = {{( \mathbf{p}_r - \mathbf{p}_a ) \cdot ( \mathbf{p}_b - \mathbf{p}_a )} \over {\| \mathbf{p}_b - \mathbf{p}_a \|^2 }} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 13 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = {{ (1-t) {f_a / w_a} + t { f_b / w_b} } \over {(1-t) / w_a + t / w_b }} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 14 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ a = -{1 \over 2}\sum_{i=0}^{n-1} x_f^i y_f^{i \oplus 1} - x_f^{i \oplus 1} y_f^i -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath inline 6 @@ -165,26 +175,26 @@ latexmath:[x_f^i] and latexmath:[y_f^i] === latexmath block 15 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ a = {{\mathrm{A}(p p_b p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad b = {{\mathrm{A}(p p_a p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad c = {{\mathrm{A}(p p_a p_b)} \over {\mathrm{A}(p_a p_b p_c)}}, -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 16 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = { a {f_a / w_a} + b {f_b / w_b} + c {f_c / w_c} } \over { {a / w_a} + {b / w_b} + {c / w_c} } -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 17 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ f = \sum_{i=1}^{n} a_i f_i -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath inline 7 @@ -193,23 +203,23 @@ latexmath:[\sum_{i=1}^{n}a_i = 1]. === latexmath block 18 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ m = \sqrt{ \left({{\partial z_f} \over {\partial x_f}}\right)^2 + \left({{\partial z_f} \over {\partial y_f}}\right)^2} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 19 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ m = \max\left( \left| {{\partial z_f} \over {\partial x_f}} \right|, \left| {{\partial z_f} \over {\partial y_f}} \right| \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 20 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ o = \begin{cases} m \times depthBiasSlopeFactor + @@ -221,7 +231,7 @@ o = r \times depthBiasConstantFactor, depthBiasClamp) & depthBiasClamp < 0 \\ \end{cases} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ == File chapters/tessellation.adoc @@ -234,19 +244,19 @@ latexmath:[\frac{1}{n}, \frac{2}{n}, \ldots, \frac{n-1}{n}] === latexmath block 21 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} N & = 9 & \text{number of mantissa bits per component} \\ B & = 15 & \text{exponent bias} \\ E_{max} & = 31 & \text{maximum possible biased exponent value} \\ sharedexp_{max} & = \frac{(2^N-1)}{2^N} \times 2^{(E_{max}-B)} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 22 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} exp' = \begin{cases} @@ -256,24 +266,24 @@ exp' = & \text{for}\ max_{clamped} \leq 2^{-(B+1)} \end{cases} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 23 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} max_{shared} = \left \lfloor \frac{max_{clamped}}{2^{(exp'-B-N)}}+\frac{1}{2} \right \rfloor \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 24 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} exp_{shared} = \begin{cases} @@ -281,12 +291,12 @@ exp_{shared} = exp'+1 & \text{for}\ max_{shared} = 2^N \end{cases} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 25 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} red_{shared} & = \left \lfloor @@ -301,12 +311,12 @@ blue_{shared} & = \frac{blue_{clamped}}{2^{(exp_{shared}-B-N)}}+ \frac{1}{2} \right \rfloor \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 26 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} D & = 1.0 & \begin{cases} @@ -321,12 +331,12 @@ D & = 1.0 & \end{cases} \\ D & = 0.0 & \text{otherwise} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 27 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} C'_{rgba}[R] & = \begin{cases} @@ -339,12 +349,12 @@ C'_{rgba}[R] & = C_{rgba}[R] & \text{for IDENTITY swizzle} \end{cases} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 28 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} C_{rgba}[R] & \text{is the RED component} \\ C_{rgba}[G] & \text{is the GREEN component} \\ @@ -353,12 +363,12 @@ C_{rgba}[A] & \text{is the ALPHA component} \\ one & = 1.0\text{f} & \text{for floating-point components} \\ one & = 1 & \text{for integer components} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 29 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} dPdx_{i_1,j_0} & = dPdx_{i_0,j_0} & = P_{i_1,j_0} - P_{i_0,j_0} \\ dPdx_{i_1,j_1} & = dPdx_{i_0,j_1} & = P_{i_1,j_1} - P_{i_0,j_1} \\ @@ -366,12 +376,12 @@ dPdx_{i_1,j_1} & = dPdx_{i_0,j_1} & = P_{i_1,j_1} - P_{i_0,j_1} \\ dPdy_{i_0,j_1} & = dPdy_{i_0,j_0} & = P_{i_0,j_1} - P_{i_0,j_0} \\ dPdy_{i_1,j_1} & = dPdy_{i_1,j_0} & = P_{i_1,j_1} - P_{i_1,j_0} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 30 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} dPdx & = \begin{cases} @@ -384,12 +394,12 @@ dPdy & = dPdy_{i_1,j_0} \end{cases} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 31 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} s & = \frac{s}{q}, & \text{for 1D, 2D, or 3D image} \\ \\ @@ -399,36 +409,36 @@ r & = \frac{r}{q}, & \text{for 3D image} \\ \\ D_{ref} & = \frac{D_{ref}}{q}, & \text{if provided} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 32 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} \partial{s}/\partial{x} & = dPdx(s), & \partial{s}/\partial{y} & = dPdy(s), & \text{for 1D, 2D, Cube, or 3D image} \\ \partial{t}/\partial{x} & = dPdx(t), & \partial{t}/\partial{y} & = dPdy(t), & \text{for 2D, Cube, or 3D image} \\ \partial{u}/\partial{x} & = dPdx(u), & \partial{u}/\partial{y} & = dPdy(u), & \text{for Cube or 3D image} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 33 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} s_{face} & = \frac{1}{2} \times \frac{s_c}{|r_c|} + \frac{1}{2} \\ t_{face} & = \frac{1}{2} \times \frac{t_c}{|r_c|} + \frac{1}{2} \\ \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 34 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \frac{\partial{s_{face}}}{\partial{x}} &= \frac{\partial}{\partial{x}} \left ( \frac{1}{2} \times \frac{s_{c}}{|r_{c}|} @@ -445,12 +455,12 @@ t_{face} & = {\left ( r_{c} \right )^2} \right ) \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 35 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \frac{\partial{s_{face}}}{\partial{y}} &= \frac{1}{2} \times @@ -477,17 +487,17 @@ t_{face} & = {\left ( r_{c} \right )^2} \right ) \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 36 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \rho_{x} & = \sqrt{ m_{ux} ^{2} + m_{vx} ^{2} + m_{wx} ^{2} } \\ \rho_{y} & = \sqrt{ m_{uy} ^{2} + m_{vy} ^{2} + m_{wy} ^{2} } \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 37 @@ -505,16 +515,16 @@ t_{face} & = === latexmath block 38 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} N & = \min \left (\left \lceil \frac{\rho_{max}}{\rho_{min}} \right \rceil ,max_{Aniso} \right ) \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 39 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \lambda_{base}(x,y) & = \begin{cases} @@ -530,12 +540,12 @@ N & = \min \left (\left \lceil \frac{\rho_{max}}{\rho_{min}} \right \rceil ,max undefined, & lod_{min} > lod_{max} \\ \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 40 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} sampler.bias & = mipLodBias & \text{(from sampler descriptor)} \\ shaderOp.bias & = @@ -553,12 +563,12 @@ shaderOp.lod_{min} & = lod_{min} & = \max(sampler.lod_{min}, shaderOp.lod_{min}) \\ lod_{max} & = maxLod & \text{(from sampler descriptor)} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 41 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} d = \begin{cases} @@ -570,12 +580,12 @@ d = level_{base} + \lambda > q + \frac{1}{2} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 42 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} nearest(\lambda) & = \begin{cases} @@ -585,12 +595,12 @@ nearest(\lambda) & = \text{alternative} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 43 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} d_{hi} & = \begin{cases} @@ -603,12 +613,12 @@ d_{lo} & = d_{hi}+1, & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 44 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} u(x,y) & = s(x,y) \times width_{level} \\ v(x,y) & = @@ -628,12 +638,12 @@ a(x,y) & = 0 & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 45 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \mathbin{RNE}(a) & = \begin{cases} @@ -641,12 +651,12 @@ a(x,y) & = \left \lfloor a + \frac{1}{2} \right \rfloor & \text{alternative} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 46 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} i &= \begin{cases} @@ -658,13 +668,13 @@ i &= \mathbin{clamp}(\mathbin{mirror}(i),0,size-1) & \text{for mirror clamp to edge} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 47 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} & \mathbin{mirror}(n) = \begin{cases} @@ -672,24 +682,24 @@ i &= -(1+n) & \text{otherwise} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 48 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau[R] &= \tau_{i0j1}[level_{base}][comp] \\ \tau[G] &= \tau_{i1j1}[level_{base}][comp] \\ \tau[B] &= \tau_{i1j0}[level_{base}][comp] \\ \tau[A] &= \tau_{i0j0}[level_{base}][comp] \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 49 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau[level_{base}][comp] &= \begin{cases} @@ -700,12 +710,12 @@ i &= \end{cases}\\ comp & \,\text{from SPIR-V operand Component} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 50 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau[level] &= \begin{cases} @@ -714,12 +724,12 @@ comp & \,\text{from SPIR-V operand Component} \tau_{i}[level], & \text{for 1D image} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 51 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{3D}[level] & = (1-\alpha)(1-\beta)(1-\gamma)\tau_{i0j0k0}[level] \\ & \, + (\alpha)(1-\beta)(1-\gamma)\tau_{i1j0k0}[level] \\ @@ -730,34 +740,34 @@ comp & \,\text{from SPIR-V operand Component} & \, + (1-\alpha)(\beta)(\gamma)\tau_{i0j1k1}[level] \\ & \, + (\alpha)(\beta)(\gamma)\tau_{i1j1k1}[level] \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 52 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{2D}[level] & = (1-\alpha)(1-\beta)\tau_{i0j0}[level] \\ & \, + (\alpha)(1-\beta)\tau_{i1j0}[level] \\ & \, + (1-\alpha)(\beta)\tau_{i0j1}[level] \\ & \, + (\alpha)(\beta)\tau_{i1j1}[level] \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 53 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{1D}[level] & = (1-\alpha)\tau_{i0}[level] \\ & \, + (\alpha)\tau_{i1}[level] \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 54 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau[level] &= \begin{cases} @@ -766,12 +776,12 @@ comp & \,\text{from SPIR-V operand Component} \tau_{1D}[level], & \text{for 1D image} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 55 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau &= \begin{cases} @@ -779,12 +789,12 @@ comp & \,\text{from SPIR-V operand Component} (1-\delta)\tau[d_{hi}]+\delta\tau[d_{lo}], & \text{for mip mode LINEAR} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 56 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau_{2Daniso} & = \frac{1}{N}\sum_{i=1}^{N} @@ -803,37 +813,37 @@ comp & \,\text{from SPIR-V operand Component} \right )}, & \text{when}\ \rho_{y} \geq \rho_{x} \end{aligned} -++++++++++++++++++++++++ +++++ == File chapters/vertexpostproc.adoc === latexmath block 57 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{array}{c} -w_c \leq x_c \leq w_c \\ -w_c \leq y_c \leq w_c \\ 0 \leq z_c \leq w_c \end{array} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 58 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \left(\begin{array}{c} x_c \\ y_c \\ z_c \\ w_c \end{array}\right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath block 59 [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \left( \begin{array}{c} x_d \\ @@ -848,7 +858,7 @@ w_c \frac{z_c}{w_c} \end{array} \right) -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ === latexmath inline 12 @@ -859,7 +869,7 @@ latexmath:[\frac{k}{2^m - 1}] === latexmath block 60 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} cinterp(\tau_0, \tau_1, \tau_2, \tau_3, \omega) = \frac{1}{2} @@ -879,12 +889,12 @@ cinterp(\tau_0, \tau_1, \tau_2, \tau_3, \omega) = \tau_3 \end{bmatrix} \end{aligned} -++++++++++++++++++++++++ +++++ === latexmath block 61 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} \tau[level] &= \begin{cases} @@ -892,14 +902,14 @@ cinterp(\tau_0, \tau_1, \tau_2, \tau_3, \omega) = \tau_{1D}[level], & \text{for 1D image} \end{cases} \end{aligned} -++++++++++++++++++++++++ +++++ == File chapters/VK_IMG_filter_cubic/filter_cubic_texel_selection.adoc === latexmath block 62 [latexmath] -++++++++++++++++++++++++ +++++ \begin{aligned} i_{0} & = \left \lfloor u - \frac{3}{2} \right \rfloor & i_{1} & = i_{0} + 1 & i_{2} & = i_{1} + 1 & i_{3} & = i_{2} + 1 \\[1em] j_{0} & = \left \lfloor u - \frac{3}{2} \right \rfloor & j_{1} & = j_{0} + 1 & j_{2} & = j_{1} + 1 & j_{3} & = j_{2} + 1 \\ @@ -907,7 +917,7 @@ j_{0} & = \left \lfloor u - \frac{3}{2} \right \rfloor & j_{1} & = j_{0} + 1 & \alpha & = \mathbin{frac} \left ( u - \frac{1}{2} \right ) \\[1em] \beta & = \mathbin{frac} \left ( v - \frac{1}{2} \right ) \end{aligned} -++++++++++++++++++++++++ +++++ == File style/writing.adoc @@ -926,7 +936,7 @@ latexmath:[\mathbf{c} = t \mathbf{c}_1 + (1-t) \mathbf{c}_2.] === latexmath block 63 [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} c_{RGB} & = \begin{cases} @@ -934,12 +944,12 @@ c_{RGB} & = \left ( \frac{c_{sRGB}+0.055}{1.055} \right )^{2.4} & \text{for}\ c_{sRGB} > 0.04045 \end{cases} \end{aligned} -+++++++++++++++++++ +++++ === latexmath block 64 [latexmath] -+++++++++++++++++++ +++++ V = \begin{cases} (-1)^S \times 0.0, & E = 0, M = 0 \\ @@ -950,4 +960,4 @@ V = (-1)^S \times Inf, & E = 31, M = 0 \\ NaN, & E = 31, M \neq 0 \end{cases} -+++++++++++++++++++ +++++ diff --git a/proposals/VK_ANDROID_external_format_resolve.adoc b/proposals/VK_ANDROID_external_format_resolve.adoc index 76598224b..7b28201dc 100644 --- a/proposals/VK_ANDROID_external_format_resolve.adoc +++ b/proposals/VK_ANDROID_external_format_resolve.adoc @@ -71,7 +71,7 @@ Graphics pipelines that include a link:{refpage}VkExternalFormatANDROID.html[VkE ==== Inheritance Info -When dynamic rendering is used with secondary command buffer inheritance, the external format must: be made known to the secondary command buffers by including link:{refpage}VkExternalFormatANDROID.html[VkExternalFormatANDROID] in the `pNext` chain of link:{refpage}VkCommandBufferInheritanceInfo.html[VkCommandBufferInheritanceInfo], and the external format must match that in the render pass instance. +When dynamic rendering is used with secondary command buffer inheritance, the external format *must* be made known to the secondary command buffers by including link:{refpage}VkExternalFormatANDROID.html[VkExternalFormatANDROID] in the `pNext` chain of link:{refpage}VkCommandBufferInheritanceInfo.html[VkCommandBufferInheritanceInfo], and the external format must match that in the render pass instance. === Render Pass Objects diff --git a/proposals/VK_EXT_device_fault.adoc b/proposals/VK_EXT_device_fault.adoc index 2a89f1448..d781e1e66 100644 --- a/proposals/VK_EXT_device_fault.adoc +++ b/proposals/VK_EXT_device_fault.adoc @@ -228,12 +228,12 @@ structure. Should they be combined? to reduce API surface area. 6) How should implementors approach extensibility for vendor-specific faults? -Should they rely on pname:pNext chains, or should the extension introduce a +Should they rely on `pNext` chains, or should the extension introduce a generic structure to return vendor error codes and human-readable descriptions in the base structure? *RESOLVED*: Implementors should utilize the generic `VkDeviceFaultVendorInfoEXT` structures where applicable, and fallback to -extending pname:pNext chains where this is insufficient. Where a pname:pNext +extending `pNext` chains where this is insufficient. Where a `pNext` chain is required, vendors should tailor their human-readable error descriptions to advise developers that additional information may be available. diff --git a/proposals/VK_EXT_dynamic_rendering_unused_attachments.adoc b/proposals/VK_EXT_dynamic_rendering_unused_attachments.adoc index 078c023f4..ddda05590 100644 --- a/proposals/VK_EXT_dynamic_rendering_unused_attachments.adoc +++ b/proposals/VK_EXT_dynamic_rendering_unused_attachments.adoc @@ -82,6 +82,6 @@ unused, and where it matches with unused the writes are discarded. Implementations may expose the link:{refpage}VK_EXT_dynamic_rendering_unused_attachments.html[VK_EXT_dynamic_rendering_unused_attachments] extension and the -link:{refpage}VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT.html[VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT]::pname:dynamicRenderingUnusedAttachments +link:{refpage}VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT.html[VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT]::`dynamicRenderingUnusedAttachments` feature which allows apps to bind pipelines to render pass instances where attachment formats can match with unused attachments. diff --git a/proposals/VK_EXT_map_memory_placed.adoc b/proposals/VK_EXT_map_memory_placed.adoc index ff628d5ef..31ee50ee5 100644 --- a/proposals/VK_EXT_map_memory_placed.adoc +++ b/proposals/VK_EXT_map_memory_placed.adoc @@ -154,7 +154,7 @@ address is provided by `VkMemoryMapPlacedInfoEXT::pPlacedAddress`. the requested address? *RESOLVED*: The memory object should be left unmapped and -`vkMapMemory2KHR` should return ename:VK_ERROR_MEMORY_MAP_FAILED. +`vkMapMemory2KHR` should return `VK_ERROR_MEMORY_MAP_FAILED`. 3) How can an application atomically re-reserve the address range on unmap? diff --git a/proposals/VK_EXT_mesh_shader.adoc b/proposals/VK_EXT_mesh_shader.adoc index 7dd8f1ee7..3c84c91a4 100644 --- a/proposals/VK_EXT_mesh_shader.adoc +++ b/proposals/VK_EXT_mesh_shader.adoc @@ -54,12 +54,12 @@ This proposal adds two new shader stages, which can be used in place of the exis Mesh shaders are a new compute-like shader stage that has a primary aim of generating a set of primitives to the rasterizer, which are passed via its new output interface. For the most part, these map well to compute shaders - they are dispatched in workgroups and have access to shared memory, workgroup barriers, and local IDs, allowing for a lot of flexibility in how they are executed. -Unlike vertex shaders, they do not use the vertex input interface, and geometry and indices must: be generated by the shader or read from buffers with no requirement for applications to provide the data in a particular way. +Unlike vertex shaders, they do not use the vertex input interface, and geometry and indices *must* be generated by the shader or read from buffers with no requirement for applications to provide the data in a particular way. As such, this allows applications to read or generate data however they need to, removing the need to prepare data before launching the graphics pipeline. This allows items such as decompression or decryption of data to be performed within the graphics pipeline directly, avoiding the bandwidth cost typically associated with compute shaders. Another key part of mesh shaders is that the number of primitives that a given workgroup can emit is dynamic - there are limits to how much can be emitted, which is advertised by the implementation, but applications can freely emit fewer primitives than the maximum. -This allows things like modifying the level of detail at a fine granularity without the use of tessellation. +This allows things like modifying the LOD at a fine granularity without the use of tessellation. Vertex outputs are written via the `Output` storage class and using standard built-ins like `Position` and `PointSize`, but are written as arrays in the same way as a tessellation control shader's outputs. Additionally, the mesh shader outputs indices per primitive according to the output primitive type (points, lines, or triangles). Indices are emitted as a separate array in a similar fashion to vertex outputs. Mesh shader output topologies are lists only - there is no support for triangle or line strips or triangle fans; data in these formats must be unpacked by the shader. @@ -75,11 +75,11 @@ Mesh shaders can be dispatched from the API like a compute shader would be, or l Task shaders are an optional shader stage that executes ahead of mesh shaders. A task shader is dispatched like a compute shader, and indirectly dispatches mesh shader workgroups. This shader is another compute-like stage that is executed in workgroups and has all the other features of compute shaders as well, with the addition of access to a dedicated instruction to launch mesh shaders. -The primary function of task shaders is to dispatch mesh shaders via code:OpEmitMeshTasksEXT, which takes as input a number of mesh shader groups to emit, and a payload variable that will be visible to all mesh shader invocations launched by this instruction. +The primary function of task shaders is to dispatch mesh shaders via `OpEmitMeshTasksEXT`, which takes as input a number of mesh shader groups to emit, and a payload variable that will be visible to all mesh shader invocations launched by this instruction. This instruction is executed once per workgroup rather than per-invocation, and the payload itself is in a workgroup-wide storage class, similar to shared memory. Once this instruction is called, the workgroup is terminated immediately, and the mesh shaders are launched. -Task shaders can be used for functionality like coarse culling of entire meshlets or dynamically generating more or less geometry depending on the level of detail required. +Task shaders can be used for functionality like coarse culling of entire meshlets or dynamically generating more or less geometry depending on the LOD required. This is notionally similar to the purpose of tessellation shaders, but without the constraint of fixed functionality, and with greater flexibility in how primitives are executed. Applications can use task shaders to determine the number of launched mesh shader workgroups at whatever input granularity they want, and however they see fit. @@ -90,8 +90,8 @@ As task and mesh shaders change how primitives are dispatched, a subsequent modi Within a mesh shader workgroup, primitives are rasterized in the order in which they are defined in the output. A group of mesh shaders either launched directly by the API, indirectly by the API, or indirectly from a single task shader workgroup will rasterize their outputs in sequential order based on their flattened global invocation index, -equal to asciimath:[x + y * width + z * width * height], where `x`, `y`, and `z` refer to the components of the code:GlobalInvocationId built-in. -`width` and `height` are equal to code:NumWorkgroups times code:WorkgroupSize for their respective dimensions. +equal to asciimath:[x + y * width + z * width * height], where `x`, `y`, and `z` refer to the components of the `GlobalInvocationId` built-in. +`width` and `height` are equal to `NumWorkgroups` times `WorkgroupSize` for their respective dimensions. When using task shaders, there is no rasterization order guarantee between mesh shaders launched by separate task shader workgroups, even within the same draw command. @@ -267,8 +267,8 @@ Violating these limits will not result in validation errors, but it is strongly * `maxPreferredTaskWorkGroupInvocations` indicates the maximum preferred number of task shader invocations in a single workgroup. * `maxPreferredMeshWorkGroupInvocations` indicates the maximum preferred number of mesh shader invocations in a single workgroup. - * If `prefersLocalInvocationVertexOutput` is `VK_TRUE`, the implementation will perform best when each invocation writes to an array index in the per-vertex output matching code:LocalInvocationIndex. - * If `prefersLocalInvocationPrimitiveOutput` is `VK_TRUE`, the implementation will perform best when each invocation writes to an array index in the per-primitive output matching code:LocalInvocationIndex. + * If `prefersLocalInvocationVertexOutput` is `VK_TRUE`, the implementation will perform best when each invocation writes to an array index in the per-vertex output matching `LocalInvocationIndex`. + * If `prefersLocalInvocationPrimitiveOutput` is `VK_TRUE`, the implementation will perform best when each invocation writes to an array index in the per-primitive output matching `LocalInvocationIndex`. * If `prefersCompactVertexOutput` is `VK_TRUE`, the implementation will perform best if there are no unused vertices in the output array. * If `prefersCompactPrimitiveOutput` is `VK_TRUE`, the implementation will perform best if there are no unused primitives in the output array. @@ -321,10 +321,10 @@ TaskPayloadWorkgroupEXT Variables in this storage class are accessible by all invocations in a workgroup in a task shader, and is broadcast to all invocations in workgroups dispatched by the same task shader workgroup where it is read-only. -In task shaders, code:TaskPayloadWorkgroupEXT is a hybrid of code:Output and code:Workgroup storage classes. It supports all usual operations code:Workgroup supports, with the caveats of: +In task shaders, `TaskPayloadWorkgroupEXT` is a hybrid of `Output` and `Workgroup` storage classes. It supports all usual operations `Workgroup` supports, with the caveats of: . No explicit memory layout support with `VK_KHR_workgroup_memory_explicit_layout` - . Can be declared independently of code:Workgroup, meaning local scratch workgroup memory can still be used with `VK_KHR_workgroup_memory_explicit_layout` + . Can be declared independently of `Workgroup`, meaning local scratch workgroup memory can still be used with `VK_KHR_workgroup_memory_explicit_layout` . Has two separate limits for size, `maxTaskPayloadSize` for its size in isolation, and `maxTaskPayloadAndSharedMemorySize` for the combined size Mesh shaders declare the type of primitive being output by way of three execution modes, two of which are introduced by this extension: @@ -520,8 +520,8 @@ Mapping to SPIR-V is largely performed identically to any other shader for both One outlier is in index generation - the primitive index outputs are denoted by a variable in the function signature preceded by `out indices ...`. The HLSL compiler should map this variable to the appropriate built-in value based on the selected `outputtopology` qualifier. -Another outlier is the groupshared task payload. In HLSL this is declared as groupshared, but must be declared in the code:TaskPayloadWorkgroupEXT storage class in SPIR-V. -The call to `DispatchMesh()` can inform the compiler which groupshared variable to promote to code:TaskPayloadWorkgroupEXT. +Another outlier is the groupshared task payload. In HLSL this is declared as groupshared, but must be declared in the `TaskPayloadWorkgroupEXT` storage class in SPIR-V. +The call to `DispatchMesh()` can inform the compiler which groupshared variable to promote to `TaskPayloadWorkgroupEXT`. == Issues diff --git a/proposals/VK_EXT_shader_tile_image.adoc b/proposals/VK_EXT_shader_tile_image.adoc index 48b73e273..1783b41a5 100644 --- a/proposals/VK_EXT_shader_tile_image.adoc +++ b/proposals/VK_EXT_shader_tile_image.adoc @@ -102,7 +102,7 @@ Add a new feature struct `VkPhysicalDeviceShaderTileImageFeaturesEXT` containing `shaderTileImageColorReadAccess` provides the ability to access current (rasterization order) color values from tile memory via tile images. There is no support for the storage format to be redefined as part of this feature. Output data is still written via Fragment Output variables. -Since the framebuffer format is not re-declared, fixed-function blending works as normal. +Since the framebuffer format is not redeclared, fixed-function blending works as normal. Existing shaders do not to need to be modified to write to color attachments. @@ -161,7 +161,7 @@ Specifically: * `Dim` is extended with `TileImageDataEXT`. * `OpTypeImage` gets the additional constraint that if `Dim` is `TileImageDataEXT`: - ** `Sampled` must: be `2` + ** `Sampled` *must* be `2` ** `Image Format` must be `Unknown` as the format is implicitly specified by the color attachment *** (We could relax this in a further extension if we wanted to support format reinterpretation in the shader.) ** `Execution Model` must be `Fragment` diff --git a/proposals/VK_EXT_swapchain_maintenance1.adoc b/proposals/VK_EXT_swapchain_maintenance1.adoc index 8e4020ce1..5c554d214 100644 --- a/proposals/VK_EXT_swapchain_maintenance1.adoc +++ b/proposals/VK_EXT_swapchain_maintenance1.adoc @@ -227,7 +227,7 @@ typedef struct VkSwapchainPresentFenceInfoEXT { With `swapchainCount` matching `VkSwapchainPresentFenceInfoEXT::swapchainCount`, each swapchain being presented to will signal the fence once the application is allowed to destroy -or recycle the semaphores passed to `vkPresentInfoKHR::pname:pWaitSemaphores`. +or recycle the semaphores passed to `vkPresentInfoKHR::pWaitSemaphores`. === Switching Present Modes diff --git a/proposals/VK_HUAWEI_cluster_culling_shader.adoc b/proposals/VK_HUAWEI_cluster_culling_shader.adoc index 89c13c579..66dcffc69 100644 --- a/proposals/VK_HUAWEI_cluster_culling_shader.adoc +++ b/proposals/VK_HUAWEI_cluster_culling_shader.adoc @@ -23,7 +23,7 @@ Provide a new extension to connect the output of the compute shader to the exist === Cluster culling shader This extension allowing application to use a new programmable shader type -- Cluster Culling Shader -- to execute geometry culling on GPU. This mechanism does not require pipeline barrier between compute shader and other rendering pipeline. -This new shader type have execution environments similar to that of compute shaders, where a collection of shader invocations form a workgroup and cooperate to perform cluster based culling and level-of-detail selection, a shader invocation can emit a group of built-in output variables treated as a drawing command which can drives subsequent rendering pipeline to draw geometries of cluster with a specific shading rate, e.g. the distance between a cluster and the view point can be used to determine the shading rate of the cluster. These capabilities enables the cluster culling shader to reduce the rendering loading more effectively. +This new shader type have execution environments similar to that of compute shaders, where a collection of shader invocations form a workgroup and cooperate to perform cluster based culling and LOD selection, a shader invocation can emit a group of built-in output variables treated as a drawing command which can drives subsequent rendering pipeline to draw geometries of cluster with a specific shading rate, e.g. the distance between a cluster and the view point can be used to determine the shading rate of the cluster. These capabilities enables the cluster culling shader to reduce the rendering loading more effectively. It should be noted that the usage of per-cluster shading rate has the following restrictions: 1. CCS and Vertex Shader cannot output shading rate at the same time. @@ -108,8 +108,8 @@ If the `VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI` structure is include `VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI` structure is defined as: ```c Typedef struct VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI { - VkStructureType sType; - void* pNext; + VkStructureType sType; + void* pNext; VkBool32 clusterShadingRate; }VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI; ``` @@ -118,7 +118,7 @@ Typedef struct VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI { * `pNext` is NULL or a pointer to a structure extending this structure. * `clusterShadingRate` specifies whether the per-cluster shading rate is supported. -To query whether Cluster Culling Shader support per-cluster shading rate, include a `VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI` structure in the pNext chain of the +To query whether Cluster Culling Shader support per-cluster shading rate, include a `VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI` structure in the pNext chain of the `VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI` structure passed to `vkPhysicalDeviceFeature2`. diff --git a/proposals/VK_KHR_maintenance5.adoc b/proposals/VK_KHR_maintenance5.adoc index 21c84b005..13037fdd5 100644 --- a/proposals/VK_KHR_maintenance5.adoc +++ b/proposals/VK_KHR_maintenance5.adoc @@ -25,7 +25,7 @@ The following is a list of issues considered in this proposal: * Add a property to indicate multisample coverage operations are performed after sample counting in EarlyFragmentTests mode * Add VK_REMAINING_ARRAY_LAYERS support to VkImageSubresourceLayers.layerCount * Allow VK_WHOLE_SIZE for pSizes argument of vkCmdBindVertexBuffers2 - * Add support for a new vkGetDeviceImageSubresourceLayout to allow a vkGetImageSubresourceLayout query without having to create a dummy image + * Add support for a new vkGetDeviceImageSubresourceLayout to allow a vkGetImageSubresourceLayout query without having to create a placeholder image * Ensure we have a reliable/deterministic way to detect device loss * We are running out of spare bits in various FlagBits * Add a property to indicate sample mask test operations are performed after sample counting in EarlyFragmentTests mode @@ -83,14 +83,14 @@ Some hardware performs sample counting after multisample coverage operations whe `pSizes` in `vkCmdBindVertexBuffers2` unintentionally does not support `VK_WHOLE_SIZE`. -=== vkGetImageSubresourceLayout query without having to create a dummy image +=== vkGetImageSubresourceLayout query without having to create a placeholder image There is a potential implementation overhead when querying the subresource layout of an image due to object creation. This overhead could be reduced by a function that works in a similar way to `vkGetDeviceImageMemoryRequirements()` which uses the image creation properties, rather than an image object, to perform the query. === Reliable/deterministic way to detect device loss -All existing entrypoints that are capable of returning -ename:VK_ERROR_DEVICE_LOST have some form of exemption or +All existing entry points that are capable of returning +`VK_ERROR_DEVICE_LOST` have some form of exemption or special-case allowing for other return values to be returned even when a device is irrecoverably lost. These exemptions are all necessary due to the asynchronous nature of device-loss detection, but this makes it difficult for @@ -221,7 +221,7 @@ Support for using `VK_REMAINING_ARRAY_LAYERS` as the `layerCount` member of `VkI Support for using `VK_WHOLE_SIZE` in the `pSizes` parameter of `vkCmdBindVertexBuffers2` is added. -=== vkGetImageSubresourceLayout query without having to create a dummy image +=== vkGetImageSubresourceLayout query without having to create a placeholder image A new `vkGetDeviceImageSubresourceLayoutKHR` function provides the ability to query the subresource layout for an image without requiring an image object, and a KHR version of `vkGetImageSubresourceLayout2EXT`: @@ -264,7 +264,7 @@ VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2KHR( === Reliable/deterministic way to detect device loss -Following device-loss, entrypoints that may return `VK_ERROR_DEVICE_LOST` do so +Following device-loss, entry points that may return `VK_ERROR_DEVICE_LOST` do so in a more consistent manner. === Lack of available flag bits diff --git a/proposals/VK_KHR_maintenance6.adoc b/proposals/VK_KHR_maintenance6.adoc index 522b0a86f..d6d9a2802 100644 --- a/proposals/VK_KHR_maintenance6.adoc +++ b/proposals/VK_KHR_maintenance6.adoc @@ -28,7 +28,7 @@ The following is a list of issues considered in this proposal: * Need a `maxCombinedImageSamplerDescriptorCount` value, for cases where you need to create a descriptor set layout, but do not know which formats will be used (and therefore cannot query it). - * Creating image views with ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT + * Creating image views with `VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT` and multiple layers is supported by all modern hardware, so this should be exposed by the API. * `pNext` extensible *2 versions of all descriptor binding commands. diff --git a/proposals/VK_KHR_maintenance7.adoc b/proposals/VK_KHR_maintenance7.adoc index 53c05068a..1c2aaa4a4 100644 --- a/proposals/VK_KHR_maintenance7.adoc +++ b/proposals/VK_KHR_maintenance7.adoc @@ -21,8 +21,8 @@ The following is a list of issues considered in this proposal: * Add a way to query information regarding the underlying devices in environments where the Vulkan implementation is provided through layered implementations. - * Promote ename:VK_RENDERING_CONTENTS_INLINE_BIT_EXT and - ename:VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_EXT to + * Promote `VK_RENDERING_CONTENTS_INLINE_BIT_EXT` and + `VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_EXT` to KHR * Add a limit to report the maximum total count of dynamic uniform buffers and dynamic storage buffers that can be included in a pipeline layout. @@ -41,7 +41,7 @@ It is important for applications to know which behavior is in use by an implemen === Query Properties of Underlying Layered Implementations When the Vulkan driver is provided by a layered implementation, it may be necessary to query the details of the underlying device. -For example, running on Mesa/Venus, driver ID is returned as ename:VK_DRIVER_ID_MESA_VENUS, but it may be necessary to know what the real driver under the hood is. +For example, running on Mesa/Venus, driver ID is returned as `VK_DRIVER_ID_MESA_VENUS`, but it may be necessary to know what the real driver under the hood is. === Mixed Inline and Secondary Command Buffer Recording in Render Passes @@ -81,7 +81,7 @@ Flags from the `VK_EXT_nested_command_buffer` extension provide this functionali === Relax Count of Dynamic Uniform/Storage Buffers A limit that indicates the maximum total count of dynamic uniform buffers and -storage buffers that can be included in a pipeline layout is added. +storage buffers that can be included in a pipeline layout is added. === Fragment Shading Rate Attachment Size Mismatch @@ -91,7 +91,7 @@ The second challenge is ensuring that implementations all return the expected va This could be achieved by using new language to describe the specifics of these lookups, but notably image reads with robust access already have the desired behavior. As such, this proposal retools fragment shading rate attachment reads as general image reads, and guarantees the values match DirectX 12's guarantees when the link:{refpage}VkPhysicalDeviceRobustness2FeaturesEXT.html[VkPhysicalDeviceRobustness2FeaturesEXT::robustImageAccess2] feature is enabled. -=== Determine 32-Bit Query Overflow Behavior +=== Determine 32-Bit Query Overflow Behavior Previously when the 32-bit unsigned integer query result overflows, the implementation may either wrap or saturate. However, MESA Virtio-GPU Venus layered implementation needs determined behavior @@ -140,7 +140,8 @@ typedef struct VkPhysicalDeviceMaintenance7PropertiesKHR { * `robustFragmentShadingRateAttachmentAccess` indicates whether a fragment shading rate attachment created with - slink:VkImageSubresourceRange::pname:baseMipLevel equal to 0 can + link:{refpage}VkImageSubresourceRange.html[VkImageSubresourceRange]::`baseMipLevel` + equal to 0 can have a size that is too small to cover a specified render area. * `separateDepthStencilAttachmentAccess` indicates whether read-modify-write operations to a depth/stencil attachment are considered a write to the sibling @@ -151,7 +152,7 @@ typedef struct VkPhysicalDeviceMaintenance7PropertiesKHR { that can be included in a pipeline layout. * `maxDescriptorSetTotalBuffersDynamic` indicates the maximum total count of dynamic uniform buffers and storage buffers that can be included in a pipeline layout. - * `maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic` is similar to + * `maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic` is similar to `maxDescriptorSetUniformBuffersDynamic` but counts descriptors from descriptor sets created with or without the `VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT` bit set. @@ -160,7 +161,7 @@ typedef struct VkPhysicalDeviceMaintenance7PropertiesKHR { `VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT` bit set. * `maxDescriptorSetUpdateAfterBindTotalBuffersDynamic` is similar to `maxDescriptorSetBuffersDynamic` but counts descriptors from descriptor sets created with or without the - `VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT` bit set. + `VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT` bit set. === New flags diff --git a/proposals/VK_KHR_map_memory2.adoc b/proposals/VK_KHR_map_memory2.adoc index 510304199..844725bf7 100644 --- a/proposals/VK_KHR_map_memory2.adoc +++ b/proposals/VK_KHR_map_memory2.adoc @@ -12,7 +12,7 @@ This document proposes adding extensible version of `vkMapMemory()` and ## Problem Statement -The current Vulkan memory mapping entrypoints are not extensible in the +The current Vulkan memory mapping entry points are not extensible in the usual sense. `vkMapMemory()` does have a flags argument which is currently unused, but neither `vkMapMemory()` nor `vkUnmapMemory()` take an input struct with a @@ -20,7 +20,7 @@ neither `vkMapMemory()` nor `vkUnmapMemory()` take an input struct with a ## Proposal -Add new `vkMapMemory2KHR()` and `vkUnmapMemory2KHR()` entrypoints which +Add new `vkMapMemory2KHR()` and `vkUnmapMemory2KHR()` entry points which take input structs which are extensible via the usual `pNext` mechanism: [source,c] ---- diff --git a/proposals/VK_KHR_shader_float_controls2.adoc b/proposals/VK_KHR_shader_float_controls2.adoc index 6fcbe3bb4..2b3a07992 100644 --- a/proposals/VK_KHR_shader_float_controls2.adoc +++ b/proposals/VK_KHR_shader_float_controls2.adoc @@ -14,7 +14,7 @@ should be performed by the implementation. This causes missed opportunities for optimization in certain types of shader, which are forced to disable more relaxations than are really required. -The controls in VK_KHR_shader_float_controls must be applied entry-point wide, which makes +The controls in VK_KHR_shader_float_controls must be applied entry point wide, which makes it impossible to mix functions that require strict conformance with other functions that can benefit from the optimizations that result from assuming that this is not true. @@ -58,7 +58,7 @@ more builtin functions more often. This proposal is aimed at increasing the flexibility of float controls, not raising the minimum support. In order that this can be implemented everywhere, if the existing -features are not supported then the related fine-grained controls must: not be set. +features are not supported then the related fine-grained controls *must* not be set. === Which extended instructions should support float controls? diff --git a/proposals/VK_KHR_shader_integer_dot_product.adoc b/proposals/VK_KHR_shader_integer_dot_product.adoc index 9198db63f..c78afe5bc 100644 --- a/proposals/VK_KHR_shader_integer_dot_product.adoc +++ b/proposals/VK_KHR_shader_integer_dot_product.adoc @@ -107,7 +107,7 @@ typedef struct VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR { } VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR; ---- -Each of these properties is a boolean that will be ename:VK_TRUE if the implementation provides a performance advantage for the corresponding SPIR-V instruction, over application-provided code composed from elementary instructions and/or other dot product instructions. +Each of these properties is a boolean that will be `VK_TRUE` if the implementation provides a performance advantage for the corresponding SPIR-V instruction, over application-provided code composed from elementary instructions and/or other dot product instructions. This could be either because the implementation uses optimized machine code sequences whose generation from application-provided code cannot be guaranteed or because it uses hardware features that cannot otherwise be targeted from application-provided code. [NOTE] diff --git a/proposals/VK_LUNARG_direct_driver_loading.adoc b/proposals/VK_LUNARG_direct_driver_loading.adoc index b056abaf3..afe646b42 100644 --- a/proposals/VK_LUNARG_direct_driver_loading.adoc +++ b/proposals/VK_LUNARG_direct_driver_loading.adoc @@ -93,13 +93,13 @@ list of instance extensions, there is no way to provide to the Vulkan Loader the list of application provided drivers, to combine the driver's extensions with the extensions supported by the drivers and implicit layers on the system. As a workaround, applications can instead load the vkEnumerateInstanceExtensionProperties -entrypoint from the provided drivers instead to get their list of extensions. +entry point from the provided drivers instead to get their list of extensions. This workaround has a known defect when all of the following is true: 1. An application uses VK_LUNARG_direct_driver_loading to add drivers. 2. A layer (that will be enabled) filters out unsupported extensions during -calls to vkEnumerateInstanceExtensionProperties entrypoint. +calls to vkEnumerateInstanceExtensionProperties entry point. 3. The application enables instance extensions in VkInstanceCreateInfo which are supported by the application provided driver but not the layer(s). diff --git a/proposals/VK_NV_ray_tracing_validation.adoc b/proposals/VK_NV_ray_tracing_validation.adoc index 55f1c93e2..5e35a8ef0 100644 --- a/proposals/VK_NV_ray_tracing_validation.adoc +++ b/proposals/VK_NV_ray_tracing_validation.adoc @@ -12,7 +12,7 @@ support for ray tracing validation at an implementation level. == Problem Statement -Ray tracing issues can: be hard to debug. Validation layers can: help root cause +Ray tracing issues *can* be hard to debug. Validation layers *can* help root cause some of the problems but a more detailed validation requires implementation details. @@ -20,18 +20,18 @@ details. Ray tracing validation by a Vulkan implementation performs more thorough checks at the implementation level, which helps identify potential problems that -cannot: be caught by the validation layers. +*cannot* be caught by the validation layers. -Warnings and errors can: be delivered straight from a ray tracing implementation +Warnings and errors *can* be delivered straight from a ray tracing implementation to the application through a messenger callback registered with the -implementation, where they can: be processed through existing application-side +implementation, where they *can* be processed through existing application-side debugging or logging systems. == Proposal Implementations may expose the link:{refpage}VK_NV_ray_tracing_validation.html[VK_NV_ray_tracing_validation] extension and the -link:{refpage}VkPhysicalDeviceRayTracingValidationFeaturesNV.html[VkPhysicalDeviceRayTracingValidationFeaturesNV]::pname:rayTracingValidation +link:{refpage}VkPhysicalDeviceRayTracingValidationFeaturesNV.html[VkPhysicalDeviceRayTracingValidationFeaturesNV]::`rayTracingValidation` feature which allows applications to enable ray tracing validation. == Issues diff --git a/proposals/VK_QCOM_image_processing.adoc b/proposals/VK_QCOM_image_processing.adoc index f63835fdd..5e0092163 100644 --- a/proposals/VK_QCOM_image_processing.adoc +++ b/proposals/VK_QCOM_image_processing.adoc @@ -50,7 +50,7 @@ and anti-aliasing. ** `Sub-pixel Weighting`: Frequently the texture coordinates will not align with a texel center in the _sampled image_, and in such cases the kernel weights can be adjusted to reflect the sub-texel sample location. Sub-texel weighting is supported, where the texel is subdivided into PxP sub-texels, called "phases", with unique weights per-phase. Adreno GPUs support up to 32x32 phases. ** `Separable-filters`: Many common 2D image filtering kernels can be expressed as a mathematically equivalent 1D separable kernel. Separable filters offer significant performance/power savings over their non-separable equivalent. This instruction supports both separable and non-separable filtering kernels. * `OpImageBoxFilterQCOM`: This instruction performs weighted average of the texels within a screen-aligned box. The operation is similar to bi-linear filtering, except the region of texels is not limited to 2x2. The instruction includes a `BoxSize` parameter, with fractional box sizes up to [64.0, 64.0]. Similar to bi-linear filtering, the implementation computes a weighted average for all texels covered by the box, with the weight for each texel proportional covered area. Large box sizes up to 64x64 enable important use-cases like bulk mipmap generation and high quality single-pass image down-scaling with arbitrary scaling ratios (e.g. thumbnail generation). -* `opImageBlockMatchSAD` and `code:opImageBlockMatchSSD`: These instructions perform a block matching operation involving two images: the _target image_ and _reference image_. The instruction takes two sets of integer texture coordinates, and an integer `BlockSize` parameter. An MxN region of texels in the _target image_ is compared with an MxN region in the _reference image_. The instruction returns a per-component error metric describing the difference between the two regions. The SAD returns the sum of the absolute errors and SSD returns the sum of the squared differences. +* `opImageBlockMatchSAD` and `opImageBlockMatchSSD`: These instructions perform a block matching operation involving two images: the _target image_ and _reference image_. The instruction takes two sets of integer texture coordinates, and an integer `BlockSize` parameter. An MxN region of texels in the _target image_ is compared with an MxN region in the _reference image_. The instruction returns a per-component error metric describing the difference between the two regions. The SAD returns the sum of the absolute errors and SSD returns the sum of the squared differences. Each of the image processing instructions operate only on 2D images. The instructions do not-support sampling of mipmap, multi-plane, multi-layer, multi-sampled, or depth/stencil diff --git a/proposals/VK_QCOM_tile_properties.adoc b/proposals/VK_QCOM_tile_properties.adoc index d6ff57f15..b32cc1e8d 100644 --- a/proposals/VK_QCOM_tile_properties.adoc +++ b/proposals/VK_QCOM_tile_properties.adoc @@ -31,7 +31,7 @@ Another problem is that currently, applications are unable to align the renderAr == Solution Space -Create a new extension with API entrypoints that allows developer to query the tile properties. +Create a new extension with API entry points that allows developer to query the tile properties. With the knowledge from this extension, applications can create fragment density maps that will apply in a more direct way to the final fragment areas in use, allowing more purposeful creation of maps. @@ -55,7 +55,7 @@ If `pProperties` is NULL, then the total number of tile properties available is The number of tile properties available is determined by the number of merged subpasses, and each tile property is associated with a merged subpass. There will be at most as many properties as there are subpasses within the render pass. To obtain the tile properties for a given merged subpass, the `pProperties` array can be indexed using the `postMergeIndex` value provided in link:{refpage}VkRenderPassSubpassFeedbackInfoEXT.html[VkRenderPassSubpassFeedbackInfoEXT]. -For dynamic rendering, a new API entrypoint is introduced because it does not have a framebuffer: +For dynamic rendering, a new API entry point is introduced because it does not have a framebuffer: [source,c] ---- @@ -137,7 +137,7 @@ VkRenderingInfoKHR renderingInfo = { .pColorAttachments = colorAttachments, .pDepthAttachment = &depthStencilAttachment, .pStencilAttachment = &depthStencilAttachment }; - + VkTilePropertiesQCOM tileProperties = { .sType = VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM, .pNext = NULL, @@ -159,7 +159,7 @@ vkGetDynamicRenderingTilePropertiesQCOM(device, pRenderingInfo, &tileProperties) === Interpreting origin values . If returned origin is (0, 0) then the first tile's top-left corner is at the attachment's origin (0,0). - + . If returned origin is (-32, -64) and tile size is (768, 480), then tile boundaries in x will lie at -32, 736, 1504, ... and tile boundaries in y will lie at -64, 416, 896, ...". == Issues @@ -169,7 +169,7 @@ This section describes issues that came up during discussion and their resolutio === RESOLVED: How to handle dynamic rendering? -Since the extension should support both renderpasses and dynamic rendering, dedicated API entrypoints were added for both. +Since the extension should support both renderpasses and dynamic rendering, dedicated API entry points were added for both. === RESOLVED: This extension returns only one set of dimensions for tile size so how to handle the case of non-merged subpasses where each subpass can have a different tile size? diff --git a/scripts/Retired/checkLinks.py b/scripts/Retired/checkLinks.py index 687ffde37..e69147e5a 100755 --- a/scripts/Retired/checkLinks.py +++ b/scripts/Retired/checkLinks.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2015-2024 The Khronos Group Inc. # diff --git a/scripts/Retired/extensionStubSource.py b/scripts/Retired/extensionStubSource.py index 2934443c7..b04682b8b 100644 --- a/scripts/Retired/extensionStubSource.py +++ b/scripts/Retired/extensionStubSource.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/Retired/findBalance.py b/scripts/Retired/findBalance.py index acadd4b83..c5ab79d15 100755 --- a/scripts/Retired/findBalance.py +++ b/scripts/Retired/findBalance.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # diff --git a/scripts/Retired/fixupRef.py b/scripts/Retired/fixupRef.py index 5e61c67e3..a7d301a6a 100755 --- a/scripts/Retired/fixupRef.py +++ b/scripts/Retired/fixupRef.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # diff --git a/scripts/Retired/insertTags.py b/scripts/Retired/insertTags.py index e36982272..7cfedd2eb 100755 --- a/scripts/Retired/insertTags.py +++ b/scripts/Retired/insertTags.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # diff --git a/scripts/Retired/realign.py b/scripts/Retired/realign.py index e578612c7..77eaa765e 100755 --- a/scripts/Retired/realign.py +++ b/scripts/Retired/realign.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/Retired/refDesc.py b/scripts/Retired/refDesc.py index 5e3a0a0f0..ffe038c56 100644 --- a/scripts/Retired/refDesc.py +++ b/scripts/Retired/refDesc.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # diff --git a/scripts/antora-nav-features.py b/scripts/antora-nav-features.py index 25ad0ebea..ed9c56991 100755 --- a/scripts/antora-nav-features.py +++ b/scripts/antora-nav-features.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2022-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/antora-prep.py b/scripts/antora-prep.py index b1874cdf0..027f8ca21 100755 --- a/scripts/antora-prep.py +++ b/scripts/antora-prep.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2022-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/apiconventions.py b/scripts/apiconventions.py index 00ae02c4f..540b5b62b 100644 --- a/scripts/apiconventions.py +++ b/scripts/apiconventions.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2021-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/cgenerator.py b/scripts/cgenerator.py index 8192c182e..79d83b0ed 100644 --- a/scripts/cgenerator.py +++ b/scripts/cgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/check_html_xrefs.py b/scripts/check_html_xrefs.py index 54794bf84..bae17f9fa 100755 --- a/scripts/check_html_xrefs.py +++ b/scripts/check_html_xrefs.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2020-2024 The Khronos Group Inc. # diff --git a/scripts/check_spec_links.py b/scripts/check_spec_links.py index ea388aa02..64c25262d 100755 --- a/scripts/check_spec_links.py +++ b/scripts/check_spec_links.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright (c) 2018-2019 Collabora, Ltd. # diff --git a/scripts/deperiodize_vuids.py b/scripts/deperiodize_vuids.py index 2bf32d210..c7863e9e3 100755 --- a/scripts/deperiodize_vuids.py +++ b/scripts/deperiodize_vuids.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2020 Petr Kraus # diff --git a/scripts/docgenerator.py b/scripts/docgenerator.py index c013d3506..74737d704 100644 --- a/scripts/docgenerator.py +++ b/scripts/docgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/extensionmetadocgenerator.py b/scripts/extensionmetadocgenerator.py index 7ede41ee2..c6cdff0f8 100644 --- a/scripts/extensionmetadocgenerator.py +++ b/scripts/extensionmetadocgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/find_duplicates.py b/scripts/find_duplicates.py index ea5a1fc1e..f4e5af511 100755 --- a/scripts/find_duplicates.py +++ b/scripts/find_duplicates.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/formatsgenerator.py b/scripts/formatsgenerator.py index b88327cc4..dae70b6f8 100644 --- a/scripts/formatsgenerator.py +++ b/scripts/formatsgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/genRef.py b/scripts/genRef.py index 8e6b884df..c07abf60a 100755 --- a/scripts/genRef.py +++ b/scripts/genRef.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # @@ -157,12 +157,12 @@ def seeAlsoList(apiName, explicitRefs=None, apiAliases=[]): allApis = apiAliases.copy() allApis.append(apiName) - # Add all the implicit references to refs + # Add all the implicit references from the XML definition of the API for name in allApis: if name in api.mapDict: refs.update(api.mapDict[name]) - # Add all the explicit references + # Add all the explicit references from the refpage block attributes if explicitRefs is not None: if isinstance(explicitRefs, str): explicitRefs = explicitRefs.split() diff --git a/scripts/genRelease b/scripts/genRelease index 3e20946c7..f93a8da9a 100755 --- a/scripts/genRelease +++ b/scripts/genRelease @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/generator.py b/scripts/generator.py index 3acfd85ef..7b066f10d 100644 --- a/scripts/generator.py +++ b/scripts/generator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/genspec.py b/scripts/genspec.py index 467af4104..fe5bbc671 100644 --- a/scripts/genspec.py +++ b/scripts/genspec.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # diff --git a/scripts/genvk.py b/scripts/genvk.py index f497f4e59..03eb9758c 100755 --- a/scripts/genvk.py +++ b/scripts/genvk.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/hostsyncgenerator.py b/scripts/hostsyncgenerator.py index 0a79e24d8..74318fe50 100644 --- a/scripts/hostsyncgenerator.py +++ b/scripts/hostsyncgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/indexExt.py b/scripts/indexExt.py index 88c41ee18..f22ea2cc1 100755 --- a/scripts/indexExt.py +++ b/scripts/indexExt.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2017-2024 The Khronos Group Inc. # diff --git a/scripts/interfacedocgenerator.py b/scripts/interfacedocgenerator.py index 3f4099bf9..1fce7594c 100644 --- a/scripts/interfacedocgenerator.py +++ b/scripts/interfacedocgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/jsgenerator.py b/scripts/jsgenerator.py index 459d8f4ae..3b490fd33 100644 --- a/scripts/jsgenerator.py +++ b/scripts/jsgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # Copyright 2013-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/json_c_generator.py b/scripts/json_c_generator.py index 24a57fe9c..727af7ae4 100644 --- a/scripts/json_c_generator.py +++ b/scripts/json_c_generator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2020-2024 The Khronos Group Inc. # diff --git a/scripts/json_generator.py b/scripts/json_generator.py index 269c6b525..69cd3fbca 100644 --- a/scripts/json_generator.py +++ b/scripts/json_generator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2020-2024 The Khronos Group Inc. # diff --git a/scripts/json_h_generator.py b/scripts/json_h_generator.py index bd2c04a1f..2fcba55e2 100644 --- a/scripts/json_h_generator.py +++ b/scripts/json_h_generator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2020-2024 The Khronos Group Inc. # diff --git a/scripts/json_parser.py b/scripts/json_parser.py index ad9c45b3d..00d364044 100644 --- a/scripts/json_parser.py +++ b/scripts/json_parser.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2020-2024 The Khronos Group Inc. # diff --git a/scripts/json_validate.py b/scripts/json_validate.py index d3f1ee6ff..18b13d180 100644 --- a/scripts/json_validate.py +++ b/scripts/json_validate.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2020-2024 The Khronos Group Inc. # diff --git a/scripts/linkcheck.py b/scripts/linkcheck.py index c08ecf0d6..c77139e68 100755 --- a/scripts/linkcheck.py +++ b/scripts/linkcheck.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Copyright 2013-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/makemanaliases.py b/scripts/makemanaliases.py index 6fb4f4537..2880e153a 100755 --- a/scripts/makemanaliases.py +++ b/scripts/makemanaliases.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2020-2024 The Khronos Group Inc. # diff --git a/scripts/map_html_anchors.py b/scripts/map_html_anchors.py index de64b4087..2f4249ca7 100755 --- a/scripts/map_html_anchors.py +++ b/scripts/map_html_anchors.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2020-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/parse_dependency.py b/scripts/parse_dependency.py index 28ead6786..8a36e0a8f 100755 --- a/scripts/parse_dependency.py +++ b/scripts/parse_dependency.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Copyright 2022-2024 The Khronos Group Inc. # Copyright 2003-2019 Paul McGuire diff --git a/scripts/promote.py b/scripts/promote.py index d0c6dad04..6f2084890 100755 --- a/scripts/promote.py +++ b/scripts/promote.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # diff --git a/scripts/pygenerator.py b/scripts/pygenerator.py index 6656b4605..8656587e9 100644 --- a/scripts/pygenerator.py +++ b/scripts/pygenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/reflib.py b/scripts/reflib.py index 41fec4928..bd873a365 100644 --- a/scripts/reflib.py +++ b/scripts/reflib.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # diff --git a/scripts/reflow.py b/scripts/reflow.py index baac6aa94..281103e20 100755 --- a/scripts/reflow.py +++ b/scripts/reflow.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2016-2024 The Khronos Group Inc. # diff --git a/scripts/reg.py b/scripts/reg.py index 971584533..2d51f1f9d 100644 --- a/scripts/reg.py +++ b/scripts/reg.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/rubygenerator.py b/scripts/rubygenerator.py index cd00e416e..d2585ebb7 100644 --- a/scripts/rubygenerator.py +++ b/scripts/rubygenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/schema_generator.py b/scripts/schema_generator.py index 818c12a75..d4447977b 100644 --- a/scripts/schema_generator.py +++ b/scripts/schema_generator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2020-2024 The Khronos Group Inc. # diff --git a/scripts/scriptgenerator.py b/scripts/scriptgenerator.py index f5ed14d00..071c0f27d 100644 --- a/scripts/scriptgenerator.py +++ b/scripts/scriptgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # @@ -239,13 +239,22 @@ def genType(self, typeinfo, name, alias): if count > 0: if category == 'bitmask': + # 'bitmask' are *Flags types. + # Try to determine the corresponding *FlagBits type and + # add that mapping to the 'flags' dictionary + # The FlagBits type is specified in the 'requires' + # attribute for 32-bit flags, and the 'bitvalues' + # attribute for 64-bit flags. + # It is possible for neither to be present, for example + # when a Flags type is defined as a placeholder, but no + # corresponding FlagBits are defined by an extension + # yet. + requiredEnum = typeElem.get('requires') - self.addName(self.flags, name, requiredEnum) + if requiredEnum is None: + requiredEnum = typeElem.get('bitvalues') - # This happens when the Flags type is defined, but no - # FlagBits are defined yet. - if requiredEnum is not None: - self.addMapping(name, requiredEnum) + self.addName(self.flags, name, requiredEnum) elif category == 'enum': # This case does not seem to come up. It nominally would # result from @@ -261,6 +270,24 @@ def genType(self, typeinfo, name, alias): elif category == 'basetype': self.basetypes[name] = None self.addName(self.typeCategory, name, 'basetype') + + # Add type mappings present in the nested tags of the + # element, and/or in the 'requires' (for multiple type + # categories) and 'bitvalues' (bitmask types) attributes. + # 'member' is a misnaming but retained since this was forked + # from genStruct() below and may be refactored into common + # underlying code. + + memberTypes = [member.text for member in typeinfo.elem.findall('.//type')] + for member_type in memberTypes: + self.addMapping(name, member_type) + + member_type = typeElem.get('requires') + if member_type is not None: + self.addMapping(name, member_type) + member_type = typeElem.get('bitvalues') + if member_type is not None: + self.addMapping(name, member_type) else: self.logMsg('diag', 'ScriptOutputGenerator::genType: unprocessed type:', name) diff --git a/scripts/spec_tools/__init__.py b/scripts/spec_tools/__init__.py index 553ec1ab6..e1b15c5bc 100644 --- a/scripts/spec_tools/__init__.py +++ b/scripts/spec_tools/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright (c) 2018-2019 Collabora, Ltd. # diff --git a/scripts/spec_tools/algo.py b/scripts/spec_tools/algo.py index 8af0f0ca5..cdf327701 100644 --- a/scripts/spec_tools/algo.py +++ b/scripts/spec_tools/algo.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright (c) 2019 Collabora, Ltd. # diff --git a/scripts/spec_tools/attributes.py b/scripts/spec_tools/attributes.py index 6449d8f34..6b08edb90 100644 --- a/scripts/spec_tools/attributes.py +++ b/scripts/spec_tools/attributes.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/spec_tools/consistency_tools.py b/scripts/spec_tools/consistency_tools.py index 4e72ec367..729bbd61e 100644 --- a/scripts/spec_tools/consistency_tools.py +++ b/scripts/spec_tools/consistency_tools.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright (c) 2019 Collabora, Ltd. # Copyright 2018-2024 The Khronos Group Inc. diff --git a/scripts/spec_tools/conventions.py b/scripts/spec_tools/conventions.py index 9c583f56f..87104e01f 100644 --- a/scripts/spec_tools/conventions.py +++ b/scripts/spec_tools/conventions.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/spec_tools/data_structures.py b/scripts/spec_tools/data_structures.py index 008d1405f..1eba0072e 100644 --- a/scripts/spec_tools/data_structures.py +++ b/scripts/spec_tools/data_structures.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright (c) 2019 Collabora, Ltd. # diff --git a/scripts/spec_tools/file_process.py b/scripts/spec_tools/file_process.py index bfc1e0c9b..7c78ddd87 100644 --- a/scripts/spec_tools/file_process.py +++ b/scripts/spec_tools/file_process.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright (c) 2018-2019 Collabora, Ltd. # diff --git a/scripts/spec_tools/validity.py b/scripts/spec_tools/validity.py index 6af437fe8..7e722cc3b 100644 --- a/scripts/spec_tools/validity.py +++ b/scripts/spec_tools/validity.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/spirvcapgenerator.py b/scripts/spirvcapgenerator.py index 5a84205cc..843009adb 100644 --- a/scripts/spirvcapgenerator.py +++ b/scripts/spirvcapgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/stripAPI.py b/scripts/stripAPI.py index df1287fb6..9ed1b21fd 100755 --- a/scripts/stripAPI.py +++ b/scripts/stripAPI.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2023-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/syncgenerator.py b/scripts/syncgenerator.py index 869e8df40..bc7b54ea5 100644 --- a/scripts/syncgenerator.py +++ b/scripts/syncgenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/testSpecVersion.py b/scripts/testSpecVersion.py index 53c2d976b..88e1da210 100755 --- a/scripts/testSpecVersion.py +++ b/scripts/testSpecVersion.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2017-2024 The Khronos Group Inc. # diff --git a/scripts/test_check_spec_links.py b/scripts/test_check_spec_links.py index a4aeef2cb..570c18700 100644 --- a/scripts/test_check_spec_links.py +++ b/scripts/test_check_spec_links.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright (c) 2018-2019 Collabora, Ltd. # diff --git a/scripts/test_check_spec_links_api_specific.py b/scripts/test_check_spec_links_api_specific.py index 9fa14a730..30fee6f4b 100644 --- a/scripts/test_check_spec_links_api_specific.py +++ b/scripts/test_check_spec_links_api_specific.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright (c) 2018-2019 Collabora, Ltd. # diff --git a/scripts/test_entity_db.py b/scripts/test_entity_db.py index 1b13f2f1e..03b4797a0 100644 --- a/scripts/test_entity_db.py +++ b/scripts/test_entity_db.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright (c) 2018-2019 Collabora, Ltd. # diff --git a/scripts/test_reflow.py b/scripts/test_reflow.py index ccf634e46..e23afcce3 100644 --- a/scripts/test_reflow.py +++ b/scripts/test_reflow.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2023-2024 The Khronos Group Inc. # diff --git a/scripts/validitygenerator.py b/scripts/validitygenerator.py index ffe81b3b9..9acd2acf1 100755 --- a/scripts/validitygenerator.py +++ b/scripts/validitygenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/vkconventions.py b/scripts/vkconventions.py index cf0803b5a..3639887aa 100755 --- a/scripts/vkconventions.py +++ b/scripts/vkconventions.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 -i +#!/usr/bin/env python3 -i # # Copyright 2013-2024 The Khronos Group Inc. # diff --git a/scripts/vksc_extensions.py b/scripts/vksc_extensions.py index 08c8f8f48..dd08d247e 100755 --- a/scripts/vksc_extensions.py +++ b/scripts/vksc_extensions.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright 2023-2024 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 diff --git a/scripts/xml_consistency.py b/scripts/xml_consistency.py index 7073bcd56..61545d233 100755 --- a/scripts/xml_consistency.py +++ b/scripts/xml_consistency.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # Copyright (c) 2019 Collabora, Ltd. # @@ -501,6 +501,62 @@ def check_type_required_limittype(self): if diags.invalid: self.record_error(f'{name} has invalid limittype for members {", ".join(badFields[key].invalid)}') + def check_type_bitmask(self, name, info): + """Check bitmask types for consistent name and size""" + + if 'Flags' in name: + # The corresponding FlagBits type + expected_bits_type = name.replace('Flags', 'FlagBits') + + # Flags types may have either a 'require' or 'bitvalues' + # attribute + bits_attrib = 'requires' + bits_type = info.elem.get(bits_attrib) + if bits_type is None: + # Might be able to use the 'bitvalues' attribute as a proxy for + # 64-bit types + bits_attrib = 'bitvalues' + bits_type = info.elem.get(bits_attrib) + + if bits_type is not None and expected_bits_type != bits_type: + self.record_error(f'{name} has unexpected {bits_attrib} attribute value:' + f'got {bits_type} but expected {expected_bits_type}') + + # If this is an alias, or a Flags type which does not yet have a + # corresponding FlagBits type, skip the size consistency check + if info.elem.get('alias') is not None or bits_type is None: + return + + # Determine the width of the *Flags type by looking at its + # + base_type_elem = info.elem.find('.//type') + if base_type_elem is None: + self.record_error(f'{name} is missing a tag') + return + + base_type = base_type_elem.text + + if base_type == 'VkFlags': + flags_width = '32' + elif base_type == 'VkFlags64': + flags_width = '64' + else: + self.record_error(f'flags type {name} has unexpected base type {base_type}, expected VkFlags or VkFlags64') + return + + # Look for the corresponding tag and ensure its width is + # consistent with flags_width + enums_elem = self.reg.reg.find(f"enums[@name='{bits_type}']") + if enums_elem is None: + self.record_error(f'Cannot find element corresponding to {name}') + return + + # attribute defaults to 32 if not present + enums_width = enums_elem.get('bitwidth', '32') + + if flags_width != enums_width: + self.record_error(f'{name} has size {flags_width} bits which does not match corresponding {bits_type} with (possibly implicit) bitwidth={enums_width}') + def check_type(self, name, info, category): """Check a type's XML data for consistency. @@ -521,13 +577,8 @@ def check_type(self, name, info, category): # Check for disallowed 'optional' values self.check_type_optional_value(name, info) elif category == 'bitmask': - if 'Flags' in name: - expected_require = name.replace('Flags', 'FlagBits') - require = info.elem.get('require') - if require is not None and expected_require != require: - self.record_error('Unexpected require attribute value:', - 'got', require, - 'but expected', expected_require) + self.check_type_bitmask(name, info) + super().check_type(name, info, category) def check_suffixes(self, name, info, supported, name_exceptions): diff --git a/src/ext_loader/README.md b/src/ext_loader/README.md deleted file mode 100644 index c30f69fd6..000000000 --- a/src/ext_loader/README.md +++ /dev/null @@ -1,34 +0,0 @@ - - -# What Happened To The Vulkan Extension Loader? - -If you are looking for the files vulkan_ext.[ch] in this directory, they -have been removed. There were two significant problems with these simple -wrappers. - -First, vulkan_ext exported all extension entrypoints. However, the Vulkan -loader also exports entrypoints for the window system integration -extensions. If someone tried to compile a project and link it to both the -loader and vulkan_ext, they would get a bunch of redefined symbols. This -linking error is difficult to work around, because vulkan_ext does not have -an easy method of disabling the entrypoints at compile time. It is possible -to remove these entrypoints when generating vulkan_ext, but even then you -have to manually compile a list of every single extension to be disabled. - -Second, each entrypoint is only stored once, regardless of how many -instances or devices are created. This means that attempting to use multiple -instances or devices in parallel can result in one device calling function -pointers that are only valid on the other device, which will crash. You may -be able to work around this by never initializing the device dispatch -(vkExtInitDevice), but we have not tried this. - -It is still possible to retrieve the last versions of these files in the -Github KhronosGroup/Vulkan-Docs repository from the 'v1.1.75' release tag. -It is also possible to regenerate them from ../../xml/vk.xml, although we -are no longer maintaining the generator code and it may eventually stop -working correctly. See README.adoc and the `extloader` Makefile target in -that directory. diff --git a/style/extensions.adoc b/style/extensions.adoc index dbe72d0d4..498d9d1bf 100644 --- a/style/extensions.adoc +++ b/style/extensions.adoc @@ -321,7 +321,7 @@ Khronos vendor IDs are reserved in a similar fashion to While vendor IDs are not directly related to API extensions, the reservation process is similar, and so is described in this section. -To reserve an Khronos vendor ID, you must first have a Khronos author ID. +To reserve a Khronos vendor ID, you must first have a Khronos author ID. Propose a merge request against <> in the default branch. The merge must define a new enumerant by adding an `` tag to the @@ -440,7 +440,7 @@ extensions; and core API with all registered extensions. [[extensions-documenting-extensions]] === Changes for New Extensions -If an new extension, or a related group of them is of sufficient scope to +If a new extension, or a related group of them is of sufficient scope to require a new chapter of the specification, localize such changes into a small number of asciidoc include files located under a subdirectory with the name of the extension. diff --git a/style/markup.adoc b/style/markup.adoc index 886ba1421..4fe9f6351 100644 --- a/style/markup.adoc +++ b/style/markup.adoc @@ -51,7 +51,7 @@ If a new file is created by a member company or outside contributor, use that entity's legal name as the author. `SPDX-License-Identifier` gives the license used for the file, following the -https://spdx.github.io/spdx-spec/using-SPDX-short-identifiers-in-source-files/[SPDX] +https://spdx.github.io/spdx-spec/v3.0/annexes/using-SPDX-short-identifiers-in-source-files/[SPDX] standard for short identifiers in source files. `CC-BY-4.0` is the short identifier for the https://spdx.org/licenses/CC-BY-4.0.html[Creative Commons Attribution 4.0 @@ -1122,15 +1122,12 @@ This list is not comprehensive; when in doubt, be guided by the existing executable state, + pipeline executable | executable | Disambiguation -| heterogeneous | heterogenous | More common -| homogeneous | homogenous | More common | host | CPU | | host endianness | platform endianness | | image subresource | subresource | Except when referring to _host-accessible subresources_ | implementation| system / hardware / software | For consistency, and avoids implied requirements. -| implementor | implementer | For consistency with historical specification practice | indices | indexes | More common | _handle_ is not dlink{cl}VK_NULL_HANDLE | _handle_ is a valid structure | @@ -1159,9 +1156,7 @@ This list is not comprehensive; when in doubt, be guided by the existing (controls, defines, describes, specifies, etc.) | Commonly used for more nuanced descriptions of parameters or structure members -// {empty} is to avoid a codespell warning -| reference monitor | mast{empty}ering display| -| runtime | run time / run-time | Arbitrary choice for consistency +| display used to optimize the content | mast{empty}ering display | | used | referenced | When describing attachments specified in a subpass description. | statically used | referenced | When describing resources or push constants @@ -1175,6 +1170,14 @@ This list is not comprehensive; when in doubt, be guided by the existing The "`begin/start`" and "`end/finish`" distinction is still being sorted out. See Gitlab issue #61. + +Some word choices which are always used in the Specification are captured in +the `config/CI/codespell-vulkan` custom dictionary used in the +`check-spelling` build target. +Terms in the list above cannot be tested by that target because their use is +context-dependent, or they are multiword terms which are not testable by the +spell-checking tool. +Some terms above are instead checked by the `check-writing` build target. ==== diff --git a/style/naming.adoc b/style/naming.adoc index 393f99293..4334331f3 100644 --- a/style/naming.adoc +++ b/style/naming.adoc @@ -545,29 +545,9 @@ typedef void (VKAPI_PTR *PFN_vkDestroySurfaceKHR)( Abbreviations and acronyms are sometimes used in the <> and the Vulkan API where they are considered clear and commonplace. -All such abbreviations used in the core API are defined here. -Extensions should also use these abbreviations where appropriate. - -Src:: - Source - -Dst:: - Destination - -Min:: - Minimum - -Max:: - Maximum - -Rect:: - Rectangle - -Info:: - Information - -Lod:: - Level of Detail +They are now described fully in the "`Common Abbreviations`" section of the +"`Lexicon`" appendix of the Specification and are not reproduced here, with +the following exception: Mip:: Related to a mipmap. @@ -586,59 +566,14 @@ ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT are exceptions to this general usage guideline, for historical reasons. ==== -ID:: - Identifier - -UUID:: - Universally Unique Identifier - -Op:: - Operation - -R:: - Red color component - -G:: - Green color component - -B:: - Blue color component - -A:: - Alpha color component - [[naming-prefixes]] == Standard Prefixes Prefixes are used in the API to denote specific semantic meaning of Vulkan -names, or as a label to avoid name clashes, and are explained here: - -VK/Vk/vk:: - Vulkan namespace + - All types, commands, enumerants and C macro definitions in the Vulkan - specification are prefixed with these two characters, according to the - rules defined above. - -PFN/pfn:: - Function Pointer + - Denotes that a type is a function pointer, or that a variable is of a - pointer type. - -p:: - Pointer + - Variable is a pointer. - -vkCmd:: - Commands that record commands in command buffers + - These API commands do not result in immediate processing on the device. - Instead, they record the requested action in a command buffer for - execution when the command buffer is submitted to a queue. - -s:: - Structure + - Used to denote the etext:VK_STRUCTURE_TYPE* member of each structure in - pname:sType. +names, or as a label to avoid name clashes. +They are now described fully in the "`Prefixes`" section of the "`Lexicon`" +appendix of the Specification and are not reproduced here. [[format-types]] diff --git a/style/revisions.adoc b/style/revisions.adoc index cc75d58ae..276a6f077 100644 --- a/style/revisions.adoc +++ b/style/revisions.adoc @@ -5,11 +5,16 @@ [[revisions]] = Revision History +* 2024-07-03 - remove `\begin{align*}` from the list of + <> and <> content from + this document, since it is now in an appendix of the API Specification. * 2024-06-19 - Add the <> section. Use `asciidoc` consistently when referring to the markup language, and `asciidoctor` when referring to the asciidoc processing tool. - * 2024-06-12 - Specify where "`client`" and "`user`" terminology is allowed in the <> section (internal issue 3898). diff --git a/style/writing.adoc b/style/writing.adoc index a5f60e3c9..db567282b 100644 --- a/style/writing.adoc +++ b/style/writing.adoc @@ -260,6 +260,7 @@ of a structure as a "`color space`" value. | Use Spelling | Instead Of | Comments | bit plane | bitplane | | compile time | compile-time | Per Wikipedia "`compile time`" +| closest hit | closest-hit | | color space | colorspace | | cube map | cubemap | | double-buffer | doublebuffer | @@ -286,6 +287,9 @@ of a structure as a "`color space`" value. | ray tracing | raytracing | | render pass | renderpass | | reuse | re-use | +| runtime | run time, + + run-time + | Arbitrary choice for consistency | side effect | side-effect | | use case | use-case | |==== @@ -579,7 +583,7 @@ _Block math_ is used for more complex equations. This example uses the `aligned` environment to delimit the expression. [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} c_{RGB} & = \begin{cases} @@ -587,13 +591,13 @@ c_{RGB} & = \left ( \frac{c_{sRGB}+0.055}{1.055} \right )^{2.4} & \text{for}\ c_{sRGB} > 0.04045 \end{cases} \end{aligned} -+++++++++++++++++++ +++++ [source,asciidoc] .Example Markup ---- [latexmath] -+++++++++++++++++++ +++++ \begin{aligned} c_{RGB} & = \begin{cases} @@ -601,7 +605,7 @@ c_{RGB} & = \left ( \frac{c_{sRGB}+0.055}{1.055} \right )^{2.4} & \text{for}\ c_{sRGB} > 0.04045 \end{cases} \end{aligned} -+++++++++++++++++++ +++++ ---- [NOTE] @@ -621,11 +625,9 @@ Some workarounds we use are: | Replace | With | Comments | `++\begin{equation}++`, + `++\end{equation}++` | _nothing_ | Unnecessary in blocks. Should not be used for inline. -| `\begin{align*}` | `++\begin{aligned}++` | -| `\end{align*}` | `++\end{aligned}++` | | `++\operatorname{foo}++` | `++\mathbin{foo}++` | | `{\rm A}` | `++\mathrm{A}++` | -| `\text{for }` | `\text{++for++}\` | Text ending in spaces is unpredictable - favor escaped spaces after text +| `\text{for }` | `\text{++for++}\ ` | Text ending in spaces is unpredictable - favor escaped spaces after text |==== The KaTeX repository provides a @@ -637,7 +639,7 @@ whole specification. Note that we use a locally-cached copy of KaTeX which may lag the latest published version on the website. -As of April 2021, we are using v0.11.1. +As of July 2024, we are using KaTeX v0.16.10. See the mtex2MML repository for a link:https://github.com/gjtorikian/mtex2MML/blob/main/SUPPORTED.md[list of @@ -654,7 +656,7 @@ This example is among the most complex expressions in the Vulkan specification: [latexmath] -+++++++++++++++++++ +++++ V = \begin{cases} (-1)^S \times 0.0, & E = 0, M = 0 \\ @@ -665,13 +667,13 @@ V = (-1)^S \times Inf, & E = 31, M = 0 \\ NaN, & E = 31, M \neq 0 \end{cases} -+++++++++++++++++++ +++++ [source,asciidoc] .Example Markup ---- [latexmath] -+++++++++++++++++++ +++++ V = \begin{cases} (-1)^S \times 0.0, & E = 0, M = 0 \\ @@ -682,7 +684,7 @@ V = (-1)^S \times Inf, & E = 31, M = 0 \\ NaN, & E = 31, M \neq 0 \end{cases} -+++++++++++++++++++ +++++ ---- @@ -701,13 +703,13 @@ cell separator must be `a|` instead of just `|`: | Overlap Mode | Weighting Equations | ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT a| [latexmath] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ \begin{aligned} p_0(A_s,A_d) & = A_sA_d \\ p_1(A_s,A_d) & = A_s(1-A_d) \\ p_2(A_s,A_d) & = A_d(1-A_s) \\ \end{aligned} -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ |==== ---- diff --git a/vkspec.adoc b/vkspec.adoc index 9a3d329fb..6eab10bfd 100644 --- a/vkspec.adoc +++ b/vkspec.adoc @@ -58,9 +58,8 @@ include::{chapters}/preamble.adoc[] ifeval::["{test}"=="1"] // Include or insert trivial test markup here, to bypass building full spec -// include::{chapters}/textest.adoc[] -include::{chapters}/introduction.adoc[] +include::{config}/mathtest.adoc[] endif::[] diff --git a/xml/registry.rnc b/xml/registry.rnc index 71a4eed64..62f07b45c 100644 --- a/xml/registry.rnc +++ b/xml/registry.rnc @@ -712,7 +712,7 @@ InterfaceElement = # as a placeholder. Integer = text -# EnumName is a compile-time constant name +# EnumName is a compile time constant name EnumName = text # TypeName is an argument/return value C type name diff --git a/xml/vk.xml b/xml/vk.xml index 3ec911155..1e0acee33 100755 --- a/xml/vk.xml +++ b/xml/vk.xml @@ -175,7 +175,7 @@ branch of the member gitlab server. #define VKSC_API_VERSION_1_0 VK_MAKE_API_VERSION(VKSC_API_VARIANT, 1, 0, 0)// Patch version should always be set to 0 // Version of this file -#define VK_HEADER_VERSION 289 +#define VK_HEADER_VERSION 290 // Complete version of this file #define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 3, VK_HEADER_VERSION) // Version of this file @@ -1876,7 +1876,7 @@ typedef void* MTLSharedEvent_id; uint32_t maxImageDimension1Dmax 1D image dimension uint32_t maxImageDimension2Dmax 2D image dimension uint32_t maxImageDimension3Dmax 3D image dimension - uint32_t maxImageDimensionCubemax cubemap image dimension + uint32_t maxImageDimensionCubemax cube map image dimension uint32_t maxImageArrayLayersmax layers for image arrays uint32_t maxTexelBufferElementsmax texel buffer size (fstexels) uint32_t maxUniformBufferRangemax uniform buffer range (bytes) @@ -2098,7 +2098,7 @@ typedef void* MTLSharedEvent_id; uint32_t planeStackIndexThe z-order of the plane. VkSurfaceTransformFlagBitsKHR transformTransform to apply to the images as part of the scanout operation float globalAlphaGlobal alpha value. Must be between 0 and 1, inclusive. Ignored if alphaMode is not VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR - VkDisplayPlaneAlphaFlagBitsKHR alphaModeWhat type of alpha blending to use. Must be a bit from vkGetDisplayPlanePropertiesKHR::supportedAlpha. + VkDisplayPlaneAlphaFlagBitsKHR alphaModeThe type of alpha blending to use. Must be one of the bits from VkDisplayPlaneCapabilitiesKHR::supportedAlpha for this display plane VkExtent2D imageExtentsize of the images to use with this surface @@ -2967,9 +2967,9 @@ typedef void* MTLSharedEvent_id; VkStructureType sType void* pNext - VkBool32 multiviewMultiple views in a renderpass - VkBool32 multiviewGeometryShaderMultiple views in a renderpass w/ geometry shader - VkBool32 multiviewTessellationShaderMultiple views in a renderpass w/ tessellation shader + VkBool32 multiviewMultiple views in a render pass + VkBool32 multiviewGeometryShaderMultiple views in a render pass w/ geometry shader + VkBool32 multiviewTessellationShaderMultiple views in a render pass w/ tessellation shader @@ -5482,9 +5482,9 @@ typedef void* MTLSharedEvent_id; VkBool32 uniformAndStorageBuffer16BitAccess16-bit integer/floating-point variables supported in BufferBlock and Block VkBool32 storagePushConstant1616-bit integer/floating-point variables supported in PushConstant VkBool32 storageInputOutput1616-bit integer/floating-point variables supported in shader inputs and outputs - VkBool32 multiviewMultiple views in a renderpass - VkBool32 multiviewGeometryShaderMultiple views in a renderpass w/ geometry shader - VkBool32 multiviewTessellationShaderMultiple views in a renderpass w/ tessellation shader + VkBool32 multiviewMultiple views in a render pass + VkBool32 multiviewGeometryShaderMultiple views in a render pass w/ geometry shader + VkBool32 multiviewTessellationShaderMultiple views in a render pass w/ tessellation shader VkBool32 variablePointersStorageBuffer VkBool32 variablePointers VkBool32 protectedMemory @@ -18402,7 +18402,7 @@ typedef void* MTLSharedEvent_id; - + @@ -18423,7 +18423,7 @@ typedef void* MTLSharedEvent_id; - + @@ -20958,7 +20958,7 @@ typedef void* MTLSharedEvent_id; - + @@ -24309,6 +24309,8 @@ typedef void* MTLSharedEvent_id; + + @@ -24448,6 +24450,7 @@ typedef void* MTLSharedEvent_id; + @@ -24513,7 +24516,7 @@ typedef void* MTLSharedEvent_id; - + @@ -24542,6 +24545,8 @@ typedef void* MTLSharedEvent_id; + + @@ -24618,6 +24623,18 @@ typedef void* MTLSharedEvent_id; + + + + + + + + + + + +